mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Added Buffers to Shaders
This commit is contained in:
@@ -100,12 +100,15 @@ namespace GlitchyEngine
|
|||||||
//
|
//
|
||||||
|
|
||||||
_pixelShader = Shader.FromFile!<PixelShader>(_window.Context, "content\\basicShader.hlsl", "PS");
|
_pixelShader = Shader.FromFile!<PixelShader>(_window.Context, "content\\basicShader.hlsl", "PS");
|
||||||
_pixelShader.[Friend]_buffers = new .[1];
|
|
||||||
|
//Todo: _pixelShader.[Friend]_buffers = new .[1];
|
||||||
|
|
||||||
_cBuffer = new Buffer<ColorRGBA>(_window.Context, .(0, .Constant, .Immutable, .None));
|
_cBuffer = new Buffer<ColorRGBA>(_window.Context, .(0, .Constant, .Immutable, .None));
|
||||||
_cBuffer.Data = .White;
|
_cBuffer.Data = .White;
|
||||||
_cBuffer.Update();
|
_cBuffer.Update();
|
||||||
|
|
||||||
|
_pixelShader.Buffers.ReplaceBuffer("Constants", _cBuffer);
|
||||||
|
|
||||||
float pO3 = Math.PI_f / 3.0f;
|
float pO3 = Math.PI_f / 3.0f;
|
||||||
VertexColor[?] vertices = .(
|
VertexColor[?] vertices = .(
|
||||||
VertexColor(.Zero, Color(255,255,255)),
|
VertexColor(.Zero, Color(255,255,255)),
|
||||||
@@ -171,15 +174,12 @@ namespace GlitchyEngine
|
|||||||
|
|
||||||
_window.Context.SetPrimitiveTopology(.TriangleList);
|
_window.Context.SetPrimitiveTopology(.TriangleList);
|
||||||
|
|
||||||
var _immediateContext = _window.Context.[Friend]nativeContext;
|
|
||||||
|
|
||||||
_window.Context.SetVertexShader(_vertexShader);
|
_window.Context.SetVertexShader(_vertexShader);
|
||||||
|
|
||||||
_window.Context.SetRasterizerState(_rasterizerState);
|
_window.Context.SetRasterizerState(_rasterizerState);
|
||||||
|
|
||||||
_window.Context.SetViewport(Window.Context.SwapChain.BackbufferViewport);
|
_window.Context.SetViewport(Window.Context.SwapChain.BackbufferViewport);
|
||||||
|
|
||||||
_immediateContext.PixelShader.SetConstantBuffers(0, 1, &_cBuffer.[Friend]nativeBuffer);
|
|
||||||
_window.Context.SetPixelShader(_pixelShader);
|
_window.Context.SetPixelShader(_pixelShader);
|
||||||
|
|
||||||
_window.Context.DrawIndexed(3 * 6);
|
_window.Context.DrawIndexed(3 * 6);
|
||||||
|
|||||||
@@ -127,9 +127,4 @@ namespace GlitchyEngine.Renderer
|
|||||||
return .Ok;
|
return .Ok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension VertexBuffer<T>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using DirectX.D3D11;
|
||||||
|
|
||||||
|
using internal GlitchyEngine.Renderer;
|
||||||
|
|
||||||
|
namespace GlitchyEngine.Renderer
|
||||||
|
{
|
||||||
|
extension BufferCollection
|
||||||
|
{
|
||||||
|
internal ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] nativeBuffers;
|
||||||
|
|
||||||
|
internal void PlatformFetchNativeBuffers()
|
||||||
|
{
|
||||||
|
for(let buffer in _buffers)
|
||||||
|
{
|
||||||
|
nativeBuffers[buffer.Index] = buffer.Buffer.nativeBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -177,7 +177,8 @@ namespace GlitchyEngine.Renderer
|
|||||||
public override void SetPixelShader(PixelShader pixelShader)
|
public override void SetPixelShader(PixelShader pixelShader)
|
||||||
{
|
{
|
||||||
//Todo: nativeContext.PixelShader.SetSamplers();
|
//Todo: nativeContext.PixelShader.SetSamplers();
|
||||||
//Todo: nativeContext.PixelShader.SetConstantBuffers();
|
pixelShader.Buffers.PlatformFetchNativeBuffers();
|
||||||
|
nativeContext.PixelShader.SetConstantBuffers(0, pixelShader.Buffers.nativeBuffers.Count, &pixelShader.Buffers.nativeBuffers);
|
||||||
//Todo: nativeContext.PixelShader.SetShaderResources();
|
//Todo: nativeContext.PixelShader.SetShaderResources();
|
||||||
nativeContext.PixelShader.SetShader(pixelShader.nativeShader);
|
nativeContext.PixelShader.SetShader(pixelShader.nativeShader);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using DirectX.D3D11;
|
|||||||
using DirectX.D3DCompiler;
|
using DirectX.D3DCompiler;
|
||||||
using DirectX.D3D11Shader;
|
using DirectX.D3D11Shader;
|
||||||
using DirectX.Common;
|
using DirectX.Common;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
using internal GlitchyEngine.Renderer;
|
using internal GlitchyEngine.Renderer;
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ namespace GlitchyEngine.Renderer
|
|||||||
Log.EngineLogger.Error($"Failed to create pixel shader: Message ({(int)result}): {result}");
|
Log.EngineLogger.Error($"Failed to create pixel shader: Message ({(int)result}): {result}");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Reflect(shaderBlob);
|
Reflect(shaderBlob);
|
||||||
|
|
||||||
shaderBlob?.Release();
|
shaderBlob?.Release();
|
||||||
}
|
}
|
||||||
@@ -49,8 +50,19 @@ namespace GlitchyEngine.Renderer
|
|||||||
|
|
||||||
for(uint32 i < cBufferCount)
|
for(uint32 i < cBufferCount)
|
||||||
{
|
{
|
||||||
|
reflection.GetResourceBindingDescription(i, let bindDesc);
|
||||||
|
|
||||||
var bufferReflection = reflection.GetConstantBufferByIndex(i);
|
var bufferReflection = reflection.GetConstantBufferByIndex(i);
|
||||||
|
|
||||||
bufferReflection.GetDescription(let bufferDesc);
|
bufferReflection.GetDescription(let bufferDesc);
|
||||||
|
|
||||||
|
// ConstantBuffer
|
||||||
|
if(bufferDesc.Type == .D3D11_CT_CBUFFER)
|
||||||
|
{
|
||||||
|
GlitchyEngine.Renderer.BufferDescription cBufferDesc = .(bufferDesc.Size, .Constant, .Dynamic, .Write);
|
||||||
|
|
||||||
|
_buffers.Add(bindDesc.BindPoint, StringView(bufferDesc.Name), new Buffer(_context, cBufferDesc), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
reflection.Release();
|
reflection.Release();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ namespace GlitchyEngine.Renderer
|
|||||||
// Todo: perhaps add a constructor that takes all parameters from description except Size
|
// Todo: perhaps add a constructor that takes all parameters from description except Size
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uploads the date from @see Data to the GPU.
|
* Uploads the date to the GPU.
|
||||||
*/
|
*/
|
||||||
[Inline]
|
[Inline]
|
||||||
public void Update()
|
public void Update()
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
namespace GlitchyEngine.Renderer
|
||||||
|
{
|
||||||
|
public class BufferCollection
|
||||||
|
{
|
||||||
|
typealias BufferEntry = (String Name, int Index, Buffer Buffer, bool OwnsBuffer);
|
||||||
|
|
||||||
|
List<BufferEntry> _buffers ~ delete _;
|
||||||
|
|
||||||
|
Dictionary<StringView, Buffer> _strToBuf ~ delete _;
|
||||||
|
Dictionary<int, Buffer> _idxToBuf ~ delete _;
|
||||||
|
|
||||||
|
//[AllowAppend]
|
||||||
|
public this()
|
||||||
|
{
|
||||||
|
/*List<BufferEntry> buffers = append .();
|
||||||
|
Dictionary<StringView, Buffer> strToBuf = append .();
|
||||||
|
Dictionary<int, Buffer> idxToBuf = append .();
|
||||||
|
|
||||||
|
_buffers = buffers;
|
||||||
|
_strToBuf = strToBuf;
|
||||||
|
_idxToBuf = idxToBuf;
|
||||||
|
*/
|
||||||
|
|
||||||
|
_buffers = new .();
|
||||||
|
_strToBuf = new .();
|
||||||
|
_idxToBuf = new .();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ~this()
|
||||||
|
{
|
||||||
|
for(let entry in _buffers)
|
||||||
|
{
|
||||||
|
delete entry.Name;
|
||||||
|
if(entry.OwnsBuffer)
|
||||||
|
delete entry.Buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Buffer this[int idx] => _idxToBuf[idx];
|
||||||
|
public Buffer this[StringView name] => _strToBuf[name];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the buffer with the given index.
|
||||||
|
* @param idx The index (shader buffer register) of the buffer to replace.
|
||||||
|
* @param buffer The new buffer.
|
||||||
|
* @param If set to true, the Collection will take ownership of the buffer; if false, the ownership will remain with the caller.
|
||||||
|
*/
|
||||||
|
public void ReplaceBuffer(int idx, Buffer buffer, bool passOwnership = false)
|
||||||
|
{
|
||||||
|
if(_idxToBuf.TryGetValue(idx, let oldBuffer))
|
||||||
|
{
|
||||||
|
int index = GetIndexOfBuffer(oldBuffer);
|
||||||
|
|
||||||
|
ref BufferEntry bufferDesc = ref _buffers[index];
|
||||||
|
|
||||||
|
Log.EngineLogger.Assert(idx == bufferDesc.Index);
|
||||||
|
|
||||||
|
if(bufferDesc.OwnsBuffer)
|
||||||
|
delete bufferDesc.Buffer;
|
||||||
|
|
||||||
|
bufferDesc.Buffer = buffer;
|
||||||
|
bufferDesc.OwnsBuffer = passOwnership;
|
||||||
|
|
||||||
|
_strToBuf[bufferDesc.Name] = buffer;
|
||||||
|
_idxToBuf[bufferDesc.Index] = buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.EngineLogger.Assert(false, "No buffer at the given index.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the buffer with the given name.
|
||||||
|
* @param name The name of the buffer to replace.
|
||||||
|
* @param buffer The new buffer.
|
||||||
|
* @param If set to true, the Collection will take ownership of the buffer; if false, the ownership will remain with the caller.
|
||||||
|
*/
|
||||||
|
public void ReplaceBuffer(StringView name, Buffer buffer, bool passOwnership = false)
|
||||||
|
{
|
||||||
|
if(_strToBuf.TryGetValue(name, let oldBuffer))
|
||||||
|
{
|
||||||
|
int index = GetIndexOfBuffer(oldBuffer);
|
||||||
|
|
||||||
|
ref BufferEntry bufferDesc = ref _buffers[index];
|
||||||
|
|
||||||
|
Log.EngineLogger.Assert(name == bufferDesc.Name);
|
||||||
|
|
||||||
|
if(bufferDesc.OwnsBuffer)
|
||||||
|
delete bufferDesc.Buffer;
|
||||||
|
|
||||||
|
bufferDesc.Buffer = buffer;
|
||||||
|
bufferDesc.OwnsBuffer = passOwnership;
|
||||||
|
|
||||||
|
_strToBuf[bufferDesc.Name] = buffer;
|
||||||
|
_idxToBuf[bufferDesc.Index] = buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.EngineLogger.Assert(false, "No buffer with the given name.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(int index, StringView name, Buffer buffer, bool passOwnership = false)
|
||||||
|
{
|
||||||
|
String nameStr = new String(name);
|
||||||
|
BufferEntry entry = (nameStr, index, buffer, passOwnership);
|
||||||
|
|
||||||
|
_buffers.Add(entry);
|
||||||
|
_strToBuf.Add(entry.Name, entry.Buffer);
|
||||||
|
_idxToBuf.Add(entry.Index, entry.Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the index of the given Buffer in the _buffer-List.
|
||||||
|
* @param The buffer to find the index of.
|
||||||
|
* @returns The index of the buffer in the _buffer-List, or -1 if it isn't in the list.
|
||||||
|
*/
|
||||||
|
int GetIndexOfBuffer(Buffer buffer)
|
||||||
|
{
|
||||||
|
for(int i < _buffers.Count)
|
||||||
|
{
|
||||||
|
// Only check for reference equality.
|
||||||
|
if(_buffers[i].Buffer === buffer)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace GlitchyEngine.Renderer
|
namespace GlitchyEngine.Renderer
|
||||||
{
|
{
|
||||||
@@ -21,10 +23,15 @@ namespace GlitchyEngine.Renderer
|
|||||||
{
|
{
|
||||||
protected GraphicsContext _context;
|
protected GraphicsContext _context;
|
||||||
|
|
||||||
|
protected BufferCollection _buffers ~ delete _;
|
||||||
|
|
||||||
public GraphicsContext Context => _context;
|
public GraphicsContext Context => _context;
|
||||||
|
|
||||||
|
public BufferCollection Buffers => _buffers;
|
||||||
|
|
||||||
public this(GraphicsContext context, String source, String entryPoint, ShaderDefine[] macros = null)
|
public this(GraphicsContext context, String source, String entryPoint, ShaderDefine[] macros = null)
|
||||||
{
|
{
|
||||||
|
_buffers = new BufferCollection();
|
||||||
_context = context;
|
_context = context;
|
||||||
CompileFromSource(source, entryPoint);
|
CompileFromSource(source, entryPoint);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user