mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
95 lines
2.6 KiB
Beef
95 lines
2.6 KiB
Beef
#if GE_GRAPHICS_DX11
|
|
|
|
using DirectX.Common;
|
|
using DirectX.D3D11Shader;
|
|
using System;
|
|
|
|
using internal GlitchyEngine.Renderer;
|
|
|
|
namespace GlitchyEngine.Renderer
|
|
{
|
|
extension BufferVariable
|
|
{
|
|
internal this(ConstantBuffer constantBuffer, ID3D11ShaderReflectionVariable* variableReflection)
|
|
{
|
|
Debug.Profiler.ProfileResourceFunction!();
|
|
|
|
_constantBuffer = constantBuffer;
|
|
|
|
HResult result = variableReflection.GetDescription(let variableDescription);
|
|
Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to get variable description. Error({(int)result}): {result}");
|
|
|
|
_name = new String(variableDescription.Name);
|
|
|
|
_offset = variableDescription.StartOffset;
|
|
_sizeInBytes = variableDescription.Size;
|
|
_isUsed = variableDescription.uFlags.HasFlag(.Used);
|
|
|
|
let variableType = variableReflection.GetVariableType();
|
|
result = variableType.GetDescription(let shaderTypeDescription);
|
|
Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to get variable type description. Error({(int)result}): {result}");
|
|
|
|
switch(shaderTypeDescription.Type)
|
|
{
|
|
case .Bool:
|
|
_type = .Bool;
|
|
case .Float:
|
|
_type = .Float;
|
|
case .Int:
|
|
_type = .Int;
|
|
case .UInt:
|
|
_type = .UInt;
|
|
default:
|
|
Log.EngineLogger.Assert(false, scope $"Unhandled shader variable type: {shaderTypeDescription.Type}");
|
|
}
|
|
|
|
_columns = shaderTypeDescription.Columns;
|
|
_rows = shaderTypeDescription.Rows;
|
|
_elements = shaderTypeDescription.Elements;
|
|
|
|
SetRawData(variableDescription.DefaultValue);
|
|
}
|
|
}
|
|
|
|
extension ConstantBuffer
|
|
{
|
|
internal this(ID3D11ShaderReflectionConstantBuffer* bufferReflection)
|
|
{
|
|
Debug.Profiler.ProfileResourceFunction!();
|
|
|
|
Reflect(bufferReflection);
|
|
|
|
ConstructBuffer();
|
|
|
|
Update();
|
|
}
|
|
|
|
private void Reflect(ID3D11ShaderReflectionConstantBuffer* bufferReflection)
|
|
{
|
|
Debug.Profiler.ProfileResourceFunction!();
|
|
|
|
HResult result = bufferReflection.GetDescription(let bufferDescription);
|
|
Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to get buffer description. Error({(int)result}): {result}");
|
|
|
|
Log.EngineLogger.AssertDebug(bufferDescription.Type == .D3D_CT_CBUFFER, "The buffer is not of type \"D3D_CT_CBUFFER\"");
|
|
|
|
_name = new String(bufferDescription.Name);
|
|
|
|
rawData = new uint8[bufferDescription.Size];
|
|
|
|
// Flags seem to be irrelevant for us here
|
|
|
|
for(uint32 v = 0; v < bufferDescription.Variables; v++)
|
|
{
|
|
ID3D11ShaderReflectionVariable* variableReflection = bufferReflection.GetVariableByIndex(v);
|
|
|
|
BufferVariable variable = new BufferVariable(this, variableReflection);
|
|
|
|
AddVariable(variable);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|