forked from Misaki/GhostEngine
Add sampler support and refactor resource handling
Enhanced shader and resource systems with `Sampler` support, including updates to `ShaderPropertyType`, HLSL code, and resource management. Refactored `Result` structs for better type safety and added new enums for texture and comparison settings. Improved `MeshRenderPass` to dynamically load textures and samplers. Updated SDL compiler and token lexicon for `Sampler` handling. Embedded debug info in project files and streamlined resource state tracking.
This commit is contained in:
@@ -10,14 +10,6 @@ using TerraFX.Interop.DirectX;
|
||||
|
||||
namespace Ghost.Graphics.RHI;
|
||||
|
||||
public interface IRHIObject
|
||||
{
|
||||
string Name
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct ShaderPassKey
|
||||
{
|
||||
public readonly ulong value;
|
||||
@@ -603,6 +595,57 @@ public struct TextureDesc
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes the parameters used to configure a texture sampler for graphics rendering operations.
|
||||
/// </summary>
|
||||
public record struct SamplerDesc
|
||||
{
|
||||
public TextureFilterMode FilterMode
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public TextureAddressMode AddressU
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public TextureAddressMode AddressV
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public TextureAddressMode AddressW
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public ComparisonFunction ComparisonFunc
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public float MipLODBias
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public uint MaxAnisotropy
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public float MinLOD
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public float MaxLOD
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Buffer description
|
||||
/// </summary>
|
||||
@@ -865,3 +908,32 @@ public enum PrimitiveTopology
|
||||
Line,
|
||||
Triangle,
|
||||
}
|
||||
|
||||
public enum TextureFilterMode
|
||||
{
|
||||
Point,
|
||||
Bilinear,
|
||||
Trilinear,
|
||||
Anisotropic
|
||||
}
|
||||
|
||||
public enum TextureAddressMode
|
||||
{
|
||||
Repeat,
|
||||
Mirror,
|
||||
Clamp,
|
||||
Border,
|
||||
MirrorOnce
|
||||
}
|
||||
|
||||
public enum ComparisonFunction
|
||||
{
|
||||
Never,
|
||||
Less,
|
||||
Equal,
|
||||
LessEqual,
|
||||
Greater,
|
||||
NotEqual,
|
||||
GreaterEqual,
|
||||
Always
|
||||
}
|
||||
@@ -91,6 +91,13 @@ public interface ICommandBuffer : IDisposable
|
||||
/// <param name="stateAfter">The desired state of the resource after the transition.</param>
|
||||
void ResourceBarrier(Handle<GPUResource> resource, ResourceState stateBefore, ResourceState stateAfter);
|
||||
|
||||
/// <summary>
|
||||
/// Inserts a resource barrier for state transitions. The current state is tracked internally.
|
||||
/// </summary>
|
||||
/// <param name="resource">A handle to the GPU resource to transition.</param>
|
||||
/// <param name="stateAfter">The desired state of the resource after the transition.</param>
|
||||
void ResourceBarrier(Handle<GPUResource> resource, ResourceState stateAfter);
|
||||
|
||||
/// <summary>
|
||||
/// Sets the pipeline state object
|
||||
/// </summary>
|
||||
|
||||
@@ -11,22 +11,29 @@ public interface IResourceAllocator : IDisposable
|
||||
/// Creates a texture resource
|
||||
/// </summary>
|
||||
/// <param name="desc">Texture description</param>
|
||||
/// <returns>A new texture handle point to the resource</returns>
|
||||
public Handle<Texture> CreateTexture(ref readonly TextureDesc desc, bool tempResource = false);
|
||||
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
||||
Handle<Texture> CreateTexture(ref readonly TextureDesc desc, bool tempResource = false);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a render Target for off-screen rendering
|
||||
/// </summary>
|
||||
/// <param name="desc">Render Target description</param>
|
||||
/// <returns>A new texture handle point to the resource</returns>
|
||||
public Handle<Texture> CreateRenderTarget(ref readonly RenderTargetDesc desc, bool tempResource = false);
|
||||
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
||||
Handle<Texture> CreateRenderTarget(ref readonly RenderTargetDesc desc, bool tempResource = false);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a buffer resource
|
||||
/// </summary>
|
||||
/// <param name="desc">Buffer description</param>
|
||||
/// <returns>A new buffer handle point to the resource</returns>
|
||||
public Handle<GraphicsBuffer> CreateBuffer(ref readonly BufferDesc desc, bool tempResource = false);
|
||||
/// <returns>An <see cref="Handle{GraphicsBuffer}"/> point to the resource</returns>
|
||||
Handle<GraphicsBuffer> CreateBuffer(ref readonly BufferDesc desc, bool tempResource = false);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new sampler object using the specified sampler description.
|
||||
/// </summary>
|
||||
/// <param name="desc">A read-only reference to a <see cref="SamplerDesc"/> structure that defines the properties of the sampler to be created.</param>
|
||||
/// <returns>An <see cref="Identifier{Sampler}"/> that uniquely identifies the created sampler object.</returns>
|
||||
Identifier<Sampler> CreateSampler(ref readonly SamplerDesc desc);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new mesh from the specified vertex and index data.
|
||||
@@ -34,19 +41,19 @@ public interface IResourceAllocator : IDisposable
|
||||
/// <param name="vertices">A UnsafeList containing the vertices that define the geometry of the mesh. Must contain at least one vertex.</param>
|
||||
/// <param name="indices">A UnsafeList containing the indices that specify how vertices are connected to form primitives. Must contain at least one index.</param>
|
||||
/// <returns>An <see cref="Identifier{Mesh}"/> representing the newly created mesh.</returns>
|
||||
public Handle<Mesh> CreateMesh(UnsafeList<Vertex> vertices, UnsafeList<uint> indices);
|
||||
Handle<Mesh> CreateMesh(UnsafeList<Vertex> vertices, UnsafeList<uint> indices);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new material instance using the specified shader.
|
||||
/// </summary>
|
||||
/// <param name="shader">The identifier of the shader to associate with the new material. Cannot be null.</param>
|
||||
/// <returns>An <see cref="Identifier{Material}"/> representing the newly created material.</returns>
|
||||
public Handle<Material> CreateMaterial(Identifier<Shader> shader);
|
||||
Handle<Material> CreateMaterial(Identifier<Shader> shader);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new shader and returns its unique identifier.
|
||||
/// </summary>
|
||||
/// <returns>An <see cref="Identifier{Shader}"/> representing the newly created shader.</returns>
|
||||
/// <param name="descriptor">The viewGroup containing the shader's properties and passes.</param>
|
||||
public Identifier<Shader> CreateGraphicsShader(ShaderDescriptor descriptor);
|
||||
Identifier<Shader> CreateGraphicsShader(ShaderDescriptor descriptor);
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public interface IResourceDatabase : IDisposable
|
||||
/// </summary>
|
||||
/// <param name="handle">A handle to the GPU resource for which to obtain the bindless index. Must reference a valid, currently registered resource.</param>
|
||||
/// <returns>The bindless index corresponding to the specified GPU resource handle. -1 if the resource does not support bindless access or is not found.</returns>
|
||||
int GetBindlessIndex(Handle<GPUResource> handle);
|
||||
Result<uint, ResultStatus> GetBindlessIndex(Handle<GPUResource> handle);
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves the name of the GPU resource associated with the specified handle.
|
||||
@@ -78,6 +78,23 @@ public interface IResourceDatabase : IDisposable
|
||||
/// <param name="handle">The handle of the resource to be removed.</param>
|
||||
void ReleaseResource(Handle<GPUResource> handle);
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves an existing sampler identifier that matches the specified description, or creates a new one if none
|
||||
/// exists.
|
||||
/// </summary>
|
||||
/// <param name="desc">A read-only reference to a <see cref="SamplerDesc"/> structure that defines the properties of the sampler to retrieve or create.</param>
|
||||
/// <param name="id">An integer identifier to associate with the sampler.</param>
|
||||
/// <returns>An <see cref="Identifier{Sampler}"/> representing the sampler that matches the specified description.
|
||||
/// If a matching sampler does not exist, a new sampler is created and its identifier is returned.</returns>
|
||||
Identifier<Sampler> CreateSampler(ref readonly SamplerDesc desc, int id);
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a sampler with the specified identifier exists.
|
||||
/// </summary>
|
||||
/// <param name="id">The identifier of the sampler to check for existence.</param>
|
||||
/// <returns>true if a sampler with the given identifier exists; otherwise, false.</returns>
|
||||
bool TryGetSampler(ref readonly SamplerDesc desc, out Identifier<Sampler> id);
|
||||
|
||||
/// <summary>
|
||||
/// Adds a mesh to the resource database and returns its handle.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user