Manual constant buffer binding

This commit is contained in:
Simon Lübeß
2022-06-13 14:10:54 +02:00
parent a926ef4af2
commit eb03eca4dd
7 changed files with 125 additions and 69 deletions
@@ -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,51 +282,62 @@ namespace GlitchyEngine.Renderer
shader.Buffers.PlatformFetchNativeBuffers(); shader.Buffers.PlatformFetchNativeBuffers();
//if (_textureCount > 0) switch (typeof(TShader))
//{ {
switch (typeof(TShader)) // TODO: Add remaining shader stages
case typeof(PixelShader):
_hasPs = shader != null;
// TODO: bind uavs
if (_textureCount > 0)
{ {
// TODO: Add remaining shader stages NativeContext.PixelShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
case typeof(PixelShader): NativeContext.PixelShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
// TODO: bind uavs
if (_textureCount > 0)
{
NativeContext.PixelShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
NativeContext.PixelShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
}
_ps_FirstTexture = _firstTexture;
_ps_BoundTextures = _textureCount;
NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader.nativeShader);
case typeof(VertexShader):
if (_textureCount > 0)
{
NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
}
NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader.nativeShader);
_vs_FirstTexture = _firstTexture;
_vs_BoundTextures = _textureCount;
//if (VertexShader vs = shader as VertexShader)
[ConstSkip]
{
SetReference!(_currentVertexShader, shader);
_currentInputLayout?.Release();
_currentInputLayout = null;
}
default:
Runtime.FatalError(scope $"Shader stage \"{typeof(TShader)}\" not implemented.");
} }
//}
_ps_FirstTexture = _firstTexture;
_ps_BoundTextures = _textureCount;
for (var buffer in shader?.Buffers)
{
_psBuffers[buffer.Index] = buffer.Buffer.nativeBuffer;
}
//NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader?.nativeShader);
case typeof(VertexShader):
_hasVs = shader != null;
if (_textureCount > 0)
{
NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]);
NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]);
}
for (var buffer in shader?.Buffers)
{
_vsBuffers[buffer.Index] = buffer.Buffer.nativeBuffer;
}
//NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers);
NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader?.nativeShader);
_vs_FirstTexture = _firstTexture;
_vs_BoundTextures = _textureCount;
//if (VertexShader vs = shader as VertexShader)
[ConstSkip]
{
SetReference!(_currentVertexShader, shader);
_currentInputLayout?.Release();
_currentInputLayout = null;
}
default:
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);
}
} }
} }
+5 -13
View File
@@ -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,21 +319,12 @@ 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);
} }
} }
+12
View File
@@ -0,0 +1,12 @@
using System;
namespace GlitchyEngine.Renderer
{
[AllowDuplicates]
public enum ShaderStage
{
Vertex = 1,
Pixel = 2,
All = Vertex | Pixel
}
}