mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
116 lines
3.4 KiB
Beef
116 lines
3.4 KiB
Beef
#if GE_GRAPHICS_DX11
|
|
|
|
using System;
|
|
using DirectX.D3D11;
|
|
using GlitchyEngine.Platform.DX11;
|
|
|
|
using internal GlitchyEngine.Renderer;
|
|
using internal GlitchyEngine.Platform.DX11;
|
|
|
|
namespace GlitchyEngine.Renderer
|
|
{
|
|
extension GeometryBinding
|
|
{
|
|
internal ID3D11Buffer*[DirectX.D3D11.D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT] nativeBuffers;
|
|
internal uint32[DirectX.D3D11.D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT] bufferStrides;
|
|
internal uint32[DirectX.D3D11.D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT] bufferOffsets;
|
|
|
|
internal ID3D11Buffer* nativeIndexBuffer;
|
|
|
|
public ~this()
|
|
{
|
|
for(ID3D11Buffer* buffer in nativeBuffers)
|
|
{
|
|
buffer?.Release();
|
|
}
|
|
|
|
nativeIndexBuffer?.Release();
|
|
}
|
|
|
|
protected override void PlatformSetVertexBuffer(VertexBufferBinding binding, uint32 slot)
|
|
{
|
|
Debug.Profiler.ProfileResourceFunction!();
|
|
|
|
Log.EngineLogger.Assert(slot < nativeBuffers.Count, "The buffer slot has to be in the range from 0 to 31.");
|
|
|
|
VertexBuffer vertexBuffer = binding.Buffer;
|
|
|
|
if(vertexBuffer != null)
|
|
{
|
|
Log.EngineLogger.Assert(vertexBuffer.nativeDescription.BindFlags.HasFlag(.VertexBuffer),
|
|
scope $"Buffer ({vertexBuffer.nativeBuffer.GetDebugName(.. scope .())}) must have VertexBuffer-flag set to be bound as a vertex buffer.");
|
|
|
|
nativeBuffers[slot]?.Release();
|
|
|
|
nativeBuffers[slot] = vertexBuffer.nativeBuffer..AddRef();
|
|
|
|
bufferStrides[slot] = binding.Stride;
|
|
bufferOffsets[slot] = binding.Offset;
|
|
}
|
|
else
|
|
{
|
|
nativeBuffers[slot]?.Release();
|
|
|
|
nativeBuffers[slot] = null;
|
|
bufferStrides[slot] = 0;
|
|
bufferOffsets[slot] = 0;
|
|
}
|
|
}
|
|
|
|
protected override void PlatformSetVertexLayout(VertexLayout vertexLayout)
|
|
{
|
|
}
|
|
|
|
protected override void PlatformSetIndexBuffer(IndexBuffer indexBuffer)
|
|
{
|
|
Debug.Profiler.ProfileResourceFunction!();
|
|
|
|
Log.EngineLogger.Assert(indexBuffer.nativeDescription.BindFlags.HasFlag(.IndexBuffer),
|
|
scope $"Buffer ({indexBuffer.nativeBuffer.GetDebugName(.. scope .())}) must have IndexBuffer-flag set to be bound as an index buffer.");
|
|
|
|
nativeIndexBuffer?.Release();
|
|
nativeIndexBuffer = indexBuffer.nativeBuffer..AddRef();
|
|
}
|
|
|
|
protected override void PlatformSetPrimitiveTopology(GlitchyEngine.Renderer.PrimitiveTopology topology)
|
|
{
|
|
|
|
}
|
|
|
|
public override void Bind()
|
|
{
|
|
Debug.Profiler.ProfileRendererFunction!();
|
|
|
|
using (ContextMonitor.Enter())
|
|
{
|
|
NativeContext.InputAssembler.SetVertexBuffers(0, nativeBuffers.Count, &nativeBuffers, &bufferStrides, &bufferOffsets);
|
|
GraphicsContext.Get().SetVertexLayout(_vertexLayout);
|
|
NativeContext.InputAssembler.SetPrimitiveTopology((.)_primitiveTopology);
|
|
|
|
if(_indexBuffer != null)
|
|
NativeContext.InputAssembler.SetIndexBuffer(_indexBuffer.nativeBuffer, _indexBuffer.Format == .Index32Bit ? .R32_UInt : .R16_UInt, _indexByteOffset);
|
|
}
|
|
}
|
|
|
|
public override void Unbind()
|
|
{
|
|
Debug.Profiler.ProfileRendererFunction!();
|
|
|
|
ID3D11Buffer*[nativeBuffers.Count] nullBuffers = .();
|
|
uint32[nativeBuffers.Count] zeroStrides = .();
|
|
uint32[nativeBuffers.Count] zeroOffsets = .();
|
|
|
|
using (ContextMonitor.Enter())
|
|
{
|
|
NativeContext.InputAssembler.SetVertexBuffers(0, nativeBuffers.Count, &nullBuffers, &zeroStrides, &zeroOffsets);
|
|
NativeContext.InputAssembler.SetInputLayout(null);
|
|
NativeContext.InputAssembler.SetPrimitiveTopology(.Undefined);
|
|
|
|
NativeContext.InputAssembler.SetIndexBuffer(null, .R16_UNorm, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|