allow pushing raw uniform data

remotes/1695061714407202320/main
cosmonaut 2023-02-23 16:59:34 -08:00
parent 515c2ebbca
commit bd825b6c91
1 changed files with 73 additions and 39 deletions

View File

@ -1408,10 +1408,10 @@ namespace MoonWorks.Graphics
/// Pushes vertex shader uniforms to the device. /// Pushes vertex shader uniforms to the device.
/// </summary> /// </summary>
/// <returns>A starting offset value to be used with draw calls.</returns> /// <returns>A starting offset value to be used with draw calls.</returns>
public unsafe uint PushVertexShaderUniforms<T>( public unsafe uint PushVertexShaderUniforms(
in T uniforms void* uniformsPtr,
) where T : unmanaged uint size
{ ) {
#if DEBUG #if DEBUG
AssertGraphicsPipelineBound(); AssertGraphicsPipelineBound();
@ -1421,17 +1421,53 @@ namespace MoonWorks.Graphics
} }
#endif #endif
return Refresh.Refresh_PushVertexShaderUniforms(
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
size
);
}
/// <summary>
/// Pushes vertex shader uniforms to the device.
/// </summary>
/// <returns>A starting offset value to be used with draw calls.</returns>
public unsafe uint PushVertexShaderUniforms<T>(
in T uniforms
) where T : unmanaged
{
fixed (T* uniformsPtr = &uniforms) fixed (T* uniformsPtr = &uniforms)
{ {
return Refresh.Refresh_PushVertexShaderUniforms( return PushVertexShaderUniforms(uniformsPtr, (uint) Marshal.SizeOf<T>());
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
(uint) Marshal.SizeOf<T>()
);
} }
} }
/// <summary>
/// Pushes fragment shader uniforms to the device.
/// </summary>
/// <returns>A starting offset to be used with draw calls.</returns>
public unsafe uint PushFragmentShaderUniforms(
void* uniformsPtr,
uint size
) {
#if DEBUG
AssertGraphicsPipelineBound();
if (currentGraphicsPipeline.FragmentShaderInfo.UniformBufferSize == 0)
{
throw new InvalidOperationException("The current fragment shader does not take a uniform buffer!");
}
#endif
return Refresh.Refresh_PushFragmentShaderUniforms(
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
size
);
}
/// <summary> /// <summary>
/// Pushes fragment shader uniforms to the device. /// Pushes fragment shader uniforms to the device.
/// </summary> /// </summary>
@ -1440,25 +1476,37 @@ namespace MoonWorks.Graphics
in T uniforms in T uniforms
) where T : unmanaged ) where T : unmanaged
{ {
#if DEBUG
AssertGraphicsPipelineBound();
if (currentGraphicsPipeline.FragmentShaderInfo.UniformBufferSize == 0)
{
throw new InvalidOperationException("The current fragment shader does not take a uniform buffer!");
}
#endif
fixed (T* uniformsPtr = &uniforms) fixed (T* uniformsPtr = &uniforms)
{ {
return Refresh.Refresh_PushFragmentShaderUniforms( return PushFragmentShaderUniforms(uniformsPtr, (uint) Marshal.SizeOf<T>());
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
(uint) Marshal.SizeOf<T>()
);
} }
} }
/// <summary>
/// Pushes compute shader uniforms to the device.
/// </summary>
/// <returns>A starting offset to be used with dispatch calls.</returns>
public unsafe uint PushComputeShaderUniforms(
void* uniformsPtr,
uint size
) {
#if DEBUG
AssertComputePipelineBound();
if (currentComputePipeline.ComputeShaderInfo.UniformBufferSize == 0)
{
throw new System.InvalidOperationException("The current compute shader does not take a uniform buffer!");
}
#endif
return Refresh.Refresh_PushComputeShaderUniforms(
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
size
);
}
/// <summary> /// <summary>
/// Pushes compute shader uniforms to the device. /// Pushes compute shader uniforms to the device.
/// </summary> /// </summary>
@ -1467,23 +1515,9 @@ namespace MoonWorks.Graphics
in T uniforms in T uniforms
) where T : unmanaged ) where T : unmanaged
{ {
#if DEBUG
AssertComputePipelineBound();
if (currentComputePipeline.ComputeShaderInfo.UniformBufferSize == 0)
{
throw new System.InvalidOperationException("The current compute shader does not take a uniform buffer!");
}
#endif
fixed (T* uniformsPtr = &uniforms) fixed (T* uniformsPtr = &uniforms)
{ {
return Refresh.Refresh_PushComputeShaderUniforms( return PushComputeShaderUniforms(uniformsPtr, (uint) Marshal.SizeOf<T>());
Device.Handle,
Handle,
(IntPtr) uniformsPtr,
(uint) Marshal.SizeOf<T>()
);
} }
} }