Skip to content

Commit

Permalink
com.unity.render-pipelines.core@10.5.0
Browse files Browse the repository at this point in the history
## [10.5.0] - 2021-04-19

Version Updated
The version number for this package has increased due to a version update of a related graphics package.
  • Loading branch information
Unity Technologies committed Apr 19, 2021
1 parent f467e1a commit 3c83aa1
Show file tree
Hide file tree
Showing 25 changed files with 481 additions and 140 deletions.
12 changes: 10 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,24 @@ All notable changes to this package will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [10.4.0] - 2020-01-26
## [10.5.0] - 2021-04-19

Version Updated
The version number for this package has increased due to a version update of a related graphics package.

## [10.4.0] - 2021-03-11

### Added
- Support for the XboxSeries platform has been added.
- New API in DynamicResolutionHandler to handle multicamera rendering for hardware mode. Changing cameras and resetting scaling per camera should be safe.
- New API functions with no side effects in DynamicResolutionHandler, to retrieve resolved drs scale and to apply DRS on a size.

### Fixed
- Fixed parameters order on inspectors for Volume Components without custom editor
- Fixed the display name of a Volume Parameter when is defined the attribute InspectorName
- Calculating correct rtHandleScale by considering the possible pixel rounding when DRS is on

## [10.3.1] - 2020-01-26
## [10.3.1] - 2021-01-26

Version Updated
The version number for this package has increased due to a version update of a related graphics package.
Expand Down
203 changes: 133 additions & 70 deletions Runtime/Common/ConstantBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void PushGlobal<CBType>(CommandBuffer cmd, in CBType data, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.UpdateData(cmd, data);
cb.SetGlobal(cmd, shaderId);
Expand All @@ -35,7 +35,7 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void Push<CBType>(CommandBuffer cmd, in CBType data, ComputeShader cs, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.UpdateData(cmd, data);
cb.Set(cmd, cs, shaderId);
Expand All @@ -51,7 +51,7 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void Push<CBType>(CommandBuffer cmd, in CBType data, Material mat, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.UpdateData(cmd, data);
cb.Set(mat, shaderId);
Expand All @@ -65,7 +65,7 @@ public class ConstantBuffer
/// <param name="data">Input data of the constant buffer.</param>
public static void UpdateData<CBType>(CommandBuffer cmd, in CBType data) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.UpdateData(cmd, data);
}
Expand All @@ -78,7 +78,7 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void SetGlobal<CBType>(CommandBuffer cmd, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.SetGlobal(cmd, shaderId);
}
Expand All @@ -92,7 +92,7 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void Set<CBType>(CommandBuffer cmd, ComputeShader cs, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.Set(cmd, cs, shaderId);
}
Expand All @@ -105,14 +105,14 @@ public class ConstantBuffer
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public static void Set<CBType>(Material mat, int shaderId) where CBType : struct
{
var cb = TypedConstantBuffer<CBType>.instance;
var cb = ConstantBufferSingleton<CBType>.instance;

cb.Set(mat, shaderId);
}

/// <summary>
/// Release all currently allocated constant buffers.
/// This needs to be called before shutting down the application.
/// Release all currently allocated singleton constant buffers.
/// This needs to be called before shutting down the application.
/// </summary>
public static void ReleaseAll()
{
Expand All @@ -122,86 +122,149 @@ public static void ReleaseAll()
m_RegisteredConstantBuffers.Clear();
}

internal abstract class ConstantBufferBase
{
public abstract void Release();
}

internal static void Register(ConstantBufferBase cb)
{
m_RegisteredConstantBuffers.Add(cb);
}

class TypedConstantBuffer<CBType> : ConstantBufferBase where CBType : struct
{
// Used to track all global bindings used by this CB type.
HashSet<int> m_GlobalBindings = new HashSet<int>();
// Array is required by the ComputeBuffer SetData API
CBType[] m_Data = new CBType[1];
}

static TypedConstantBuffer<CBType> s_Instance = null;
internal static TypedConstantBuffer<CBType> instance
{
get
{
if (s_Instance == null)
s_Instance = new TypedConstantBuffer<CBType>();
return s_Instance;
}
set
{
s_Instance = value;
}
}
ComputeBuffer m_GPUConstantBuffer = null;
/// <summary>
/// The base class of Constant Buffer.
/// </summary>
public abstract class ConstantBufferBase
{
/// <summary>
/// Release the constant buffer.
/// </summary>
public abstract void Release();
}

TypedConstantBuffer()
{
m_GPUConstantBuffer = new ComputeBuffer(1, UnsafeUtility.SizeOf<CBType>(), ComputeBufferType.Constant);
ConstantBuffer.Register(this);
}

public void UpdateData(CommandBuffer cmd, in CBType data)
{
m_Data[0] = data;
/// <summary>
/// An instance of a constant buffer.
/// </summary>
/// <typeparam name="CBType">The type of structure representing the constant buffer data.</typeparam>
public class ConstantBuffer<CBType> : ConstantBufferBase where CBType : struct
{
// Used to track all global bindings used by this CB type.
HashSet<int> m_GlobalBindings = new HashSet<int>();
// Array is required by the ComputeBuffer SetData API
CBType[] m_Data = new CBType[1];


ComputeBuffer m_GPUConstantBuffer = null;

/// <summary>
/// Constant Buffer constructor.
/// </summary>
public ConstantBuffer()
{
m_GPUConstantBuffer = new ComputeBuffer(1, UnsafeUtility.SizeOf<CBType>(), ComputeBufferType.Constant);
}

/// <summary>
/// Update the GPU data of the constant buffer.
/// </summary>
/// <param name="cmd">Command Buffer used to execute the graphic commands.</param>
/// <param name="data">Input data of the constant buffer.</param>
public void UpdateData(CommandBuffer cmd, in CBType data)
{
m_Data[0] = data;
#if UNITY_2021_1_OR_NEWER
cmd.SetBufferData(m_GPUConstantBuffer, m_Data);
cmd.SetBufferData(m_GPUConstantBuffer, m_Data);
#else
cmd.SetComputeBufferData(m_GPUConstantBuffer, m_Data);
#endif
}
}

public void SetGlobal(CommandBuffer cmd, int shaderId)
{
m_GlobalBindings.Add(shaderId);
cmd.SetGlobalConstantBuffer(m_GPUConstantBuffer, shaderId, 0, m_GPUConstantBuffer.stride);
}
/// <summary>
/// Bind the constant buffer globally.
/// </summary>
/// <param name="cmd">Command Buffer used to execute the graphic commands.</param>
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public void SetGlobal(CommandBuffer cmd, int shaderId)
{
m_GlobalBindings.Add(shaderId);
cmd.SetGlobalConstantBuffer(m_GPUConstantBuffer, shaderId, 0, m_GPUConstantBuffer.stride);
}

public void Set(CommandBuffer cmd, ComputeShader cs, int shaderId)
{
cmd.SetComputeConstantBufferParam(cs, shaderId, m_GPUConstantBuffer, 0, m_GPUConstantBuffer.stride);
}
/// <summary>
/// Bind the constant buffer to a compute shader.
/// </summary>
/// <param name="cmd">Command Buffer used to execute the graphic commands.</param>
/// <param name="cs">Compute shader to which the constant buffer should be bound.</param>
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public void Set(CommandBuffer cmd, ComputeShader cs, int shaderId)
{
cmd.SetComputeConstantBufferParam(cs, shaderId, m_GPUConstantBuffer, 0, m_GPUConstantBuffer.stride);
}

/// <summary>
/// Bind the constant buffer to a material.
/// </summary>
/// <param name="mat">Material to which the constant buffer should be bound.</param>
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public void Set(Material mat, int shaderId)
{
// This isn't done via command buffer because as long as the buffer itself is not destroyed,
// the binding stays valid. Only the commit of data needs to go through the command buffer.
// We do it here anyway for now to simplify user API.
mat.SetConstantBuffer(shaderId, m_GPUConstantBuffer, 0, m_GPUConstantBuffer.stride);
}

/// <summary>
/// Update the GPU data of the constant buffer and bind it globally.
/// </summary>
/// <param name="cmd">Command Buffer used to execute the graphic commands.</param>
/// <param name="data">Input data of the constant buffer.</param>
/// <param name="shaderId">Shader porperty id to bind the constant buffer to.</param>
public void PushGlobal(CommandBuffer cmd, in CBType data, int shaderId)
{
UpdateData(cmd, data);
SetGlobal(cmd, shaderId);
}

/// <summary>
/// Release the constant buffers.
/// </summary>
public override void Release()
{
// Depending on the device, globally bound buffers can leave stale "valid" shader ids pointing to a destroyed buffer.
// In DX11 it does not cause issues but on Vulkan this will result in skipped drawcalls (even if the buffer is not actually accessed in the shader).
// To avoid this kind of issues, it's good practice to "unbind" all globally bound buffers upon destruction.
foreach (int shaderId in m_GlobalBindings)
Shader.SetGlobalConstantBuffer(shaderId, (ComputeBuffer)null, 0, 0);
m_GlobalBindings.Clear();

public void Set(Material mat, int shaderId)
CoreUtils.SafeRelease(m_GPUConstantBuffer);
}
}

class ConstantBufferSingleton<CBType> : ConstantBuffer<CBType> where CBType : struct
{
static ConstantBufferSingleton<CBType> s_Instance = null;
internal static ConstantBufferSingleton<CBType> instance
{
get
{
// This isn't done via command buffer because as long as the buffer itself is not destroyed,
// the binding stays valid. Only the commit of data needs to go through the command buffer.
// We do it here anyway for now to simplify user API.
mat.SetConstantBuffer(shaderId, m_GPUConstantBuffer, 0, m_GPUConstantBuffer.stride);
if (s_Instance == null)
{
s_Instance = new ConstantBufferSingleton<CBType>();
ConstantBuffer.Register(s_Instance);
}
return s_Instance;
}

public override void Release()
set
{
// Depending on the device, globally bound buffers can leave stale "valid" shader ids pointing to a destroyed buffer.
// In DX11 it does not cause issues but on Vulkan this will result in skipped drawcalls (even if the buffer is not actually accessed in the shader).
// To avoid this kind of issues, it's good practice to "unbind" all globally bound buffers upon destruction.
foreach (int shaderId in m_GlobalBindings)
Shader.SetGlobalConstantBuffer(shaderId, (ComputeBuffer)null, 0, 0);
m_GlobalBindings.Clear();

CoreUtils.SafeRelease(m_GPUConstantBuffer);
s_Instance = null;
s_Instance = value;
}
}

public override void Release()
{
base.Release();
s_Instance = null;
}
}
}
Loading

0 comments on commit 3c83aa1

Please sign in to comment.