mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Manual constant buffer binding
This commit is contained in:
@@ -185,23 +185,36 @@ namespace GlitchyEngine.Renderer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BindState()
|
||||||
|
{
|
||||||
|
Debug.Profiler.ProfileRendererFunction!();
|
||||||
|
|
||||||
|
BindInputLayout();
|
||||||
|
|
||||||
|
if (_hasVs)
|
||||||
|
NativeContext.VertexShader.SetConstantBuffers(0, _vsBuffers.Count, &_vsBuffers);
|
||||||
|
|
||||||
|
if (_hasPs)
|
||||||
|
NativeContext.PixelShader.SetConstantBuffers(0, _psBuffers.Count, &_psBuffers);
|
||||||
|
}
|
||||||
|
|
||||||
public override void Draw(uint32 vertexCount, uint32 startVertexIndex = 0)
|
public override void Draw(uint32 vertexCount, uint32 startVertexIndex = 0)
|
||||||
{
|
{
|
||||||
BindInputLayout();
|
BindState();
|
||||||
|
|
||||||
NativeContext.Draw(vertexCount, startVertexIndex);
|
NativeContext.Draw(vertexCount, startVertexIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawIndexed(uint32 indexCount, uint32 startIndexLocation = 0, int32 vertexOffset = 0)
|
public override void DrawIndexed(uint32 indexCount, uint32 startIndexLocation = 0, int32 vertexOffset = 0)
|
||||||
{
|
{
|
||||||
BindInputLayout();
|
BindState();
|
||||||
|
|
||||||
NativeContext.DrawIndexed(indexCount, startIndexLocation, vertexOffset);
|
NativeContext.DrawIndexed(indexCount, startIndexLocation, vertexOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawIndexedInstanced(uint32 indexCountPerInstance, uint32 instanceCount, uint32 startIndexLocation, int32 baseVertexLocation, uint32 startInstanceLocation)
|
public override void DrawIndexedInstanced(uint32 indexCountPerInstance, uint32 instanceCount, uint32 startIndexLocation, int32 baseVertexLocation, uint32 startInstanceLocation)
|
||||||
{
|
{
|
||||||
BindInputLayout();
|
BindState();
|
||||||
|
|
||||||
NativeContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
|
NativeContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
|
||||||
}
|
}
|
||||||
@@ -236,6 +249,12 @@ namespace GlitchyEngine.Renderer
|
|||||||
private uint32 _vs_FirstTexture;
|
private uint32 _vs_FirstTexture;
|
||||||
private uint32 _vs_BoundTextures;
|
private uint32 _vs_BoundTextures;
|
||||||
|
|
||||||
|
private bool _hasPs;
|
||||||
|
private bool _hasVs;
|
||||||
|
|
||||||
|
private ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] _vsBuffers;
|
||||||
|
private ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] _psBuffers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds the given shader to the corresponding shader stage.
|
* Binds the given shader to the corresponding shader stage.
|
||||||
* @param shader The shader that will be bound to the graphics context.
|
* @param shader The shader that will be bound to the graphics context.
|
||||||
@@ -250,7 +269,7 @@ namespace GlitchyEngine.Renderer
|
|||||||
ID3D11ShaderResourceView*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _textures = .();
|
ID3D11ShaderResourceView*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _textures = .();
|
||||||
ID3D11SamplerState*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _samplers = .();
|
ID3D11SamplerState*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _samplers = .();
|
||||||
|
|
||||||
for (let entry in shader.Textures)
|
for (let entry in shader?.Textures)
|
||||||
{
|
{
|
||||||
_textures[entry.Index] = entry.BoundTexture._nativeShaderResourceView;
|
_textures[entry.Index] = entry.BoundTexture._nativeShaderResourceView;
|
||||||
_samplers[entry.Index] = entry.BoundTexture._nativeSamplerState;
|
_samplers[entry.Index] = entry.BoundTexture._nativeSamplerState;
|
||||||
@@ -263,12 +282,12 @@ namespace GlitchyEngine.Renderer
|
|||||||
|
|
||||||
shader.Buffers.PlatformFetchNativeBuffers();
|
shader.Buffers.PlatformFetchNativeBuffers();
|
||||||
|
|
||||||
//if (_textureCount > 0)
|
|
||||||
//{
|
|
||||||
switch (typeof(TShader))
|
switch (typeof(TShader))
|
||||||
{
|
{
|
||||||
// TODO: Add remaining shader stages
|
// TODO: Add remaining shader stages
|
||||||
case typeof(PixelShader):
|
case typeof(PixelShader):
|
||||||
|
_hasPs = shader != null;
|
||||||
|
|
||||||
// TODO: bind uavs
|
// TODO: bind uavs
|
||||||
if (_textureCount > 0)
|
if (_textureCount > 0)
|
||||||
{
|
{
|
||||||
@@ -279,20 +298,32 @@ namespace GlitchyEngine.Renderer
|
|||||||
_ps_FirstTexture = _firstTexture;
|
_ps_FirstTexture = _firstTexture;
|
||||||
_ps_BoundTextures = _textureCount;
|
_ps_BoundTextures = _textureCount;
|
||||||
|
|
||||||
NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
|
for (var buffer in shader?.Buffers)
|
||||||
|
{
|
||||||
|
_psBuffers[buffer.Index] = buffer.Buffer.nativeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader.nativeShader);
|
//NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
|
||||||
|
|
||||||
|
NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader?.nativeShader);
|
||||||
|
|
||||||
case typeof(VertexShader):
|
case typeof(VertexShader):
|
||||||
|
_hasVs = shader != null;
|
||||||
|
|
||||||
if (_textureCount > 0)
|
if (_textureCount > 0)
|
||||||
{
|
{
|
||||||
NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
|
NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
|
||||||
NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
|
NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
|
for (var buffer in shader?.Buffers)
|
||||||
|
{
|
||||||
|
_vsBuffers[buffer.Index] = buffer.Buffer.nativeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader.nativeShader);
|
//NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
|
||||||
|
|
||||||
|
NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader?.nativeShader);
|
||||||
|
|
||||||
_vs_FirstTexture = _firstTexture;
|
_vs_FirstTexture = _firstTexture;
|
||||||
_vs_BoundTextures = _textureCount;
|
_vs_BoundTextures = _textureCount;
|
||||||
@@ -307,7 +338,6 @@ namespace GlitchyEngine.Renderer
|
|||||||
default:
|
default:
|
||||||
Runtime.FatalError(scope $"Shader stage \"{typeof(TShader)}\" not implemented.");
|
Runtime.FatalError(scope $"Shader stage \"{typeof(TShader)}\" not implemented.");
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UnbindTextures()
|
public override void UnbindTextures()
|
||||||
@@ -327,6 +357,21 @@ namespace GlitchyEngine.Renderer
|
|||||||
{
|
{
|
||||||
BindShaderToStage(pixelShader);
|
BindShaderToStage(pixelShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage)
|
||||||
|
{
|
||||||
|
Debug.Assert((slot >= 0) && (slot < DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT));
|
||||||
|
|
||||||
|
if (stage.HasFlag(.Vertex))
|
||||||
|
{
|
||||||
|
_vsBuffers[slot] = buffer.nativeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage.HasFlag(.Pixel))
|
||||||
|
{
|
||||||
|
_psBuffers[slot] = buffer.nativeBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -249,6 +249,11 @@ namespace GlitchyEngine.Renderer
|
|||||||
{
|
{
|
||||||
_context.UnbindTextures();
|
_context.UnbindTextures();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage)
|
||||||
|
{
|
||||||
|
_context.BindConstantBuffer(buffer, slot, stage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,16 +98,9 @@ namespace GlitchyEngine.Renderer
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Inline]
|
[Inline]
|
||||||
public void SetViewports(Viewport[] viewports)
|
public void SetViewports(Span<Viewport> viewports)
|
||||||
{
|
{
|
||||||
SetViewports((.)viewports.Count, viewports.CArray());
|
SetViewports((.)viewports.Length, viewports.Ptr);
|
||||||
}
|
|
||||||
|
|
||||||
[Inline]
|
|
||||||
public void SetViewports<CSize>(Viewport[CSize] viewports) where CSize : const uint32
|
|
||||||
{
|
|
||||||
var viewports;
|
|
||||||
SetViewports(CSize, &viewports);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public extern void SetViewports(uint32 viewportsLength, Viewport* viewports);
|
public extern void SetViewports(uint32 viewportsLength, Viewport* viewports);
|
||||||
@@ -121,5 +114,7 @@ namespace GlitchyEngine.Renderer
|
|||||||
public extern void SetPixelShader(PixelShader pixelShader);
|
public extern void SetPixelShader(PixelShader pixelShader);
|
||||||
|
|
||||||
public extern void UnbindTextures();
|
public extern void UnbindTextures();
|
||||||
|
|
||||||
|
public extern void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,5 +121,10 @@ namespace GlitchyEngine.Renderer
|
|||||||
{
|
{
|
||||||
_rendererAPI.UnbindTextures();
|
_rendererAPI.UnbindTextures();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage)
|
||||||
|
{
|
||||||
|
_rendererAPI.BindConstantBuffer(buffer, slot, stage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -302,12 +302,13 @@ namespace GlitchyEngine.Renderer
|
|||||||
|
|
||||||
RenderCommand.SetBlendState(_gBufferBlend);
|
RenderCommand.SetBlendState(_gBufferBlend);
|
||||||
|
|
||||||
|
|
||||||
for (SubmittedMesh entry in _queue)
|
for (SubmittedMesh entry in _queue)
|
||||||
{
|
{
|
||||||
Debug.Profiler.ProfileRendererScope!("Draw Mesh");
|
Debug.Profiler.ProfileRendererScope!("Draw Mesh");
|
||||||
|
|
||||||
{
|
{
|
||||||
Debug.Profiler.ProfileRendererScope!("SetVariables");
|
Debug.Profiler.ProfileRendererScope!("Update object buffer");
|
||||||
|
|
||||||
ObjectConstantsBuffer objectData;
|
ObjectConstantsBuffer objectData;
|
||||||
objectData.Transform = entry.Transform;
|
objectData.Transform = entry.Transform;
|
||||||
@@ -318,22 +319,13 @@ namespace GlitchyEngine.Renderer
|
|||||||
objectData.EntityId = entry.EntityId;
|
objectData.EntityId = entry.EntityId;
|
||||||
|
|
||||||
_objectBuffer.SetData(objectData, 0, .WriteDiscard);
|
_objectBuffer.SetData(objectData, 0, .WriteDiscard);
|
||||||
|
|
||||||
entry.Material.Effect.Buffers.TryReplaceBuffer("SceneConstants", _sceneBuffer);
|
|
||||||
entry.Material.Effect.Buffers.TryReplaceBuffer("ObjectConstants", _objectBuffer);
|
|
||||||
|
|
||||||
/*entry.Material.SetVariable("ViewProjection", _sceneConstants.ViewProjection);
|
|
||||||
|
|
||||||
entry.Material.SetVariable("Transform", entry.Transform);
|
|
||||||
|
|
||||||
entry.Material.SetVariable("EntityId", entry.EntityId);
|
|
||||||
|
|
||||||
Matrix3x3 mat = (Matrix3x3)(entry.Transform).Invert().Transpose();
|
|
||||||
entry.Material.SetVariable("Transform_InvT", mat);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.Material.Bind(_context);
|
entry.Material.Bind(_context);
|
||||||
|
|
||||||
|
RenderCommand.BindConstantBuffer(_sceneBuffer, 0, .All);
|
||||||
|
RenderCommand.BindConstantBuffer(_objectBuffer, 1, .All);
|
||||||
|
|
||||||
entry.Mesh.Bind();
|
entry.Mesh.Bind();
|
||||||
RenderCommand.DrawIndexed(entry.Mesh);
|
RenderCommand.DrawIndexed(entry.Mesh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,5 +62,7 @@ namespace GlitchyEngine.Renderer
|
|||||||
public extern void SetViewport(Viewport viewport);
|
public extern void SetViewport(Viewport viewport);
|
||||||
|
|
||||||
public extern void UnbindTextures();
|
public extern void UnbindTextures();
|
||||||
|
|
||||||
|
public extern void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
namespace GlitchyEngine.Renderer
|
||||||
|
{
|
||||||
|
[AllowDuplicates]
|
||||||
|
public enum ShaderStage
|
||||||
|
{
|
||||||
|
Vertex = 1,
|
||||||
|
Pixel = 2,
|
||||||
|
|
||||||
|
All = Vertex | Pixel
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user