forked from Misaki/GhostEngine
Updated Handle and Identifier that default is invalid
This commit is contained in:
@@ -114,8 +114,10 @@ internal unsafe class D3D12CommandBuffer : ICommandBuffer
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
#if DEBUG
|
||||
[DoesNotReturn]
|
||||
#endif
|
||||
private static void RecordError(string cmdName, ErrorStatus status)
|
||||
#else
|
||||
private void RecordError(string cmdName, ErrorStatus status)
|
||||
#endif
|
||||
{
|
||||
#if DEBUG
|
||||
throw new InvalidOperationException($"Error at {cmdName} with {status}");
|
||||
|
||||
@@ -70,14 +70,14 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandle(Identifier<RTVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _rtvHeap.GetCpuHandle(descriptor.value);
|
||||
return _rtvHeap.GetCpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Release(Identifier<RTVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_rtvHeap.ReleaseDescriptor(descriptor.value);
|
||||
_rtvHeap.ReleaseDescriptor(descriptor.Value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@@ -95,7 +95,7 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public void MakePersistent(Identifier<RTVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_rtvHeap.CopyToPersistentHeap(descriptor.value);
|
||||
_rtvHeap.CopyToPersistentHeap(descriptor.Value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@@ -155,13 +155,13 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandle(Identifier<DSVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _dsvHeap.GetCpuHandle(descriptor.value);
|
||||
return _dsvHeap.GetCpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(Identifier<DSVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_dsvHeap.ReleaseDescriptor(descriptor.value);
|
||||
_dsvHeap.ReleaseDescriptor(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(ReadOnlySpan<Identifier<DSVDescriptor>> descriptors)
|
||||
@@ -178,7 +178,7 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public void MakePersistent(Identifier<DSVDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_dsvHeap.CopyToPersistentHeap(descriptor.value);
|
||||
_dsvHeap.CopyToPersistentHeap(descriptor.Value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@@ -240,25 +240,25 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandle(Identifier<CbvSrvUavDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _cbvSrvUavHeap.GetCpuHandle(descriptor.value);
|
||||
return _cbvSrvUavHeap.GetCpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandleShaderVisible(Identifier<CbvSrvUavDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _cbvSrvUavHeap.GetCpuHandleShaderVisible(descriptor.value);
|
||||
return _cbvSrvUavHeap.GetCpuHandleShaderVisible(descriptor.Value);
|
||||
}
|
||||
|
||||
public D3D12_GPU_DESCRIPTOR_HANDLE GetGpuHandle(Identifier<CbvSrvUavDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _cbvSrvUavHeap.GetGpuHandle(descriptor.value);
|
||||
return _cbvSrvUavHeap.GetGpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(Identifier<CbvSrvUavDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_cbvSrvUavHeap.ReleaseDescriptor(descriptor.value);
|
||||
_cbvSrvUavHeap.ReleaseDescriptor(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(ReadOnlySpan<Identifier<CbvSrvUavDescriptor>> descriptors)
|
||||
@@ -275,7 +275,7 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public void MakePersistent(Identifier<CbvSrvUavDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_cbvSrvUavHeap.CopyToPersistentHeap(descriptor.value);
|
||||
_cbvSrvUavHeap.CopyToPersistentHeap(descriptor.Value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@@ -337,25 +337,25 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandle(Identifier<SamplerDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _samplerHeap.GetCpuHandle(descriptor.value);
|
||||
return _samplerHeap.GetCpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
public D3D12_CPU_DESCRIPTOR_HANDLE GetCpuHandleShaderVisible(Identifier<SamplerDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _samplerHeap.GetCpuHandleShaderVisible(descriptor.value);
|
||||
return _samplerHeap.GetCpuHandleShaderVisible(descriptor.Value);
|
||||
}
|
||||
|
||||
public D3D12_GPU_DESCRIPTOR_HANDLE GetGpuHandle(Identifier<SamplerDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _samplerHeap.GetGpuHandle(descriptor.value);
|
||||
return _samplerHeap.GetGpuHandle(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(Identifier<SamplerDescriptor> descriptor)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
_samplerHeap.ReleaseDescriptor(descriptor.value);
|
||||
_samplerHeap.ReleaseDescriptor(descriptor.Value);
|
||||
}
|
||||
|
||||
public void Release(ReadOnlySpan<Identifier<SamplerDescriptor>> descriptors)
|
||||
@@ -440,4 +440,4 @@ internal unsafe class D3D12DescriptorAllocator : IDisposable
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ internal unsafe class D3D12PipelineLibrary : IPipelineLibrary
|
||||
CreateDefaultRootSignature().ThrowIfFailed();
|
||||
}
|
||||
|
||||
// TODO: Maybe we don't need 4 root signature. We can use bindless for global, per-view, and per-object buffers as well.
|
||||
private Result CreateDefaultRootSignature()
|
||||
{
|
||||
_defaultRootSignature = default;
|
||||
|
||||
@@ -53,7 +53,7 @@ internal class D3D12Renderer : IRenderer
|
||||
}
|
||||
|
||||
var target = RenderTargetStrategy.GetRenderTarget();
|
||||
if (target.IsNotValid)
|
||||
if (target.IsInvalid)
|
||||
{
|
||||
return Result.Failure("Render target is invalid.");
|
||||
}
|
||||
@@ -64,7 +64,7 @@ internal class D3D12Renderer : IRenderer
|
||||
// NOTE: Temperary solution: render directly to the swap chain back buffer if available.
|
||||
// HACK: This is hard coded for testing purposes only.
|
||||
|
||||
var error = RenderScene(target);
|
||||
var error = RenderScene(target, RenderTargetStrategy.Viewport, RenderTargetStrategy.Scissor);
|
||||
if (error != ErrorStatus.None)
|
||||
{
|
||||
_commandBuffer.End();
|
||||
@@ -85,7 +85,7 @@ internal class D3D12Renderer : IRenderer
|
||||
}
|
||||
|
||||
// TODO: A proper render graph integration.
|
||||
private ErrorStatus RenderScene(Handle<Texture> target)
|
||||
private ErrorStatus RenderScene(Handle<Texture> target, ViewportDesc viewport, RectDesc rect)
|
||||
{
|
||||
var clearColor = new Color128 { r = 1.0f, g = 0.0f, b = 1.0f, a = 1.0f };
|
||||
|
||||
@@ -112,20 +112,9 @@ internal class D3D12Renderer : IRenderer
|
||||
_pass.Initialize(ref ctx);
|
||||
}
|
||||
|
||||
var result = _resourceDatabase.GetResourceDescription(target.AsResource());
|
||||
if (result.IsFailure)
|
||||
{
|
||||
return result.Error;
|
||||
}
|
||||
|
||||
// TODO: Decouple viewport and scissor from the texture size.
|
||||
var texDesc = result.Value.TextureDescription;
|
||||
var viewport = new ViewportDesc { Width = texDesc.Width, Height = texDesc.Height, MinDepth = 0, MaxDepth = 1 };
|
||||
var scissor = new RectDesc { Right = texDesc.Width, Bottom = texDesc.Height };
|
||||
|
||||
_commandBuffer.BeginRenderPass(rtDesc, depthDesc, false);
|
||||
_commandBuffer.SetViewport(viewport);
|
||||
_commandBuffer.SetScissorRect(scissor);
|
||||
_commandBuffer.SetScissorRect(rect);
|
||||
|
||||
// NOTE: Testing only.
|
||||
_pass.Execute(ref ctx);
|
||||
|
||||
@@ -879,7 +879,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
||||
var cpuHandle = _descriptorAllocator.GetCpuHandleShaderVisible(samplerDescriptor);
|
||||
_device.NativeDevice.Get()->CreateSampler(&samplerDesc, cpuHandle);
|
||||
|
||||
return _resourceDatabase.CreateSampler(in desc, samplerDescriptor.value);
|
||||
return _resourceDatabase.CreateSampler(in desc, samplerDescriptor.Value);
|
||||
}
|
||||
|
||||
public Handle<Mesh> CreateMesh(UnsafeList<Vertex> vertices, UnsafeList<uint> indices)
|
||||
|
||||
@@ -6,7 +6,6 @@ using Misaki.HighPerformance.Collections;
|
||||
using Misaki.HighPerformance.LowLevel;
|
||||
using Misaki.HighPerformance.LowLevel.Buffer;
|
||||
using Misaki.HighPerformance.LowLevel.Collections;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using TerraFX.Interop.DirectX;
|
||||
|
||||
@@ -64,7 +63,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
this.viewGroup = viewGroup;
|
||||
this.cpuFenceValue = ~0u;
|
||||
this.state = state;
|
||||
this.desc = ResourceDesc.FromD3D12(resource->GetDesc());
|
||||
this.desc = resource->GetDesc().ToResourceDesc();
|
||||
}
|
||||
|
||||
public uint Release(D3D12DescriptorAllocator descriptorAllocator)
|
||||
@@ -102,7 +101,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
private UnsafeSlotMap<Mesh> _meshes;
|
||||
private UnsafeSlotMap<Material> _materials;
|
||||
private readonly DynamicArray<Shader?> _shaders; // NOTE: We use a simple list since shader is not frequently added/removed. This can save 4 bytes for each ecs component.
|
||||
private readonly Dictionary<ShaderPassKey, ShaderPass> _shaderPasses; // NOTE: The reason we use Dictionary here is that ShaderPassKey is a presistence identifier across multiple application sessions.
|
||||
// private UnsafeHashMap<ShaderPassKey, ShaderPass> _shaderPasses; // NOTE: The reason we use Dictionary here is that ShaderPassKey is a presistence identifier across multiple application sessions.
|
||||
|
||||
private bool _disposed;
|
||||
|
||||
@@ -118,7 +117,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
_meshes = new UnsafeSlotMap<Mesh>(64, Allocator.Persistent, AllocationOption.Clear);
|
||||
_materials = new UnsafeSlotMap<Material>(16, Allocator.Persistent, AllocationOption.Clear);
|
||||
_shaders = new DynamicArray<Shader?>(16);
|
||||
_shaderPasses = new Dictionary<ShaderPassKey, ShaderPass>(16);
|
||||
// _shaderPasses = new UnsafeHashMap<ShaderPassKey, ShaderPass>(32, Allocator.Persistent);
|
||||
}
|
||||
|
||||
~D3D12ResourceDatabase()
|
||||
@@ -172,14 +171,14 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
public bool HasResource(Handle<GPUResource> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _resources.Contains(handle.id, handle.generation);
|
||||
return _resources.Contains(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public RefResult<ResourceRecord, ErrorStatus> GetResourceRecord(Handle<GPUResource> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist)
|
||||
{
|
||||
return ErrorStatus.NotFound;
|
||||
@@ -191,7 +190,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
public ref ResourceRecord GetResourceRecord(Handle<GPUResource> handle, out bool exist)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return ref _resources.GetElementReferenceAt(handle.id, handle.generation, out exist);
|
||||
return ref _resources.GetElementReferenceAt(handle.ID, handle.Generation, out exist);
|
||||
}
|
||||
|
||||
public SharedPtr<ID3D12Resource> GetResource(Handle<GPUResource> handle)
|
||||
@@ -224,7 +223,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist || !info.Allocated)
|
||||
{
|
||||
throw new KeyNotFoundException($"Resource with handle {handle} not found.");
|
||||
@@ -256,7 +255,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
return ErrorStatus.NotFound;
|
||||
}
|
||||
|
||||
return (uint)info.viewGroup.srv.value;
|
||||
return (uint)info.viewGroup.srv.Value;
|
||||
}
|
||||
|
||||
public string? GetResourceName(Handle<GPUResource> handle)
|
||||
@@ -281,7 +280,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
return;
|
||||
}
|
||||
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var info = ref _resources.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist || !info.Allocated)
|
||||
{
|
||||
return;
|
||||
@@ -293,7 +292,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
_resourceName.Remove(handle, out var name);
|
||||
#endif
|
||||
|
||||
_resources.Remove(handle.id, handle.generation);
|
||||
_resources.Remove(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public Identifier<Sampler> CreateSampler(ref readonly SamplerDesc desc, int id)
|
||||
@@ -328,14 +327,14 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
public bool HasMesh(Handle<Mesh> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _meshes.Contains(handle.id, handle.generation);
|
||||
return _meshes.Contains(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public ref Mesh GetMeshReference(Handle<Mesh> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var mesh = ref _meshes.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var mesh = ref _meshes.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(handle), $"Mesh {handle} is invalid.");
|
||||
@@ -348,14 +347,14 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var mesh = ref _meshes.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var mesh = ref _meshes.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseResource(ref mesh);
|
||||
_meshes.Remove(handle.id, handle.generation);
|
||||
_meshes.Remove(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public Handle<Material> AddMaterial(ref readonly Material material)
|
||||
@@ -369,14 +368,14 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
public bool HasMaterial(Handle<Material> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return _materials.Contains(handle.id, handle.generation);
|
||||
return _materials.Contains(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public ref Material GetMaterialReference(Handle<Material> handle)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var material = ref _materials.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var material = ref _materials.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(handle), $"Material handle {handle} is invalid.");
|
||||
@@ -389,14 +388,14 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
|
||||
ref var material = ref _materials.GetElementReferenceAt(handle.id, handle.generation, out var exist);
|
||||
ref var material = ref _materials.GetElementReferenceAt(handle.ID, handle.Generation, out var exist);
|
||||
if (!exist)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseResource(ref material);
|
||||
_materials.Remove(handle.id, handle.generation);
|
||||
_materials.Remove(handle.ID, handle.Generation);
|
||||
}
|
||||
|
||||
public Identifier<Shader> AddShader(Shader shader)
|
||||
@@ -411,7 +410,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
public bool HasShader(Identifier<Shader> id)
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||
return id.value >= 0 && id.value < _shaders.Count && _shaders[id.value] != null;
|
||||
return id.Value >= 0 && id.Value < _shaders.Count && _shaders[id.Value] != null;
|
||||
}
|
||||
|
||||
public Shader GetShaderReference(Identifier<Shader> id)
|
||||
@@ -423,7 +422,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
throw new ArgumentOutOfRangeException(nameof(id), $"Shader id {id} is invalid.");
|
||||
}
|
||||
|
||||
var shader = _shaders[id.value]!;
|
||||
var shader = _shaders[id.Value]!;
|
||||
return shader;
|
||||
}
|
||||
|
||||
@@ -436,7 +435,7 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
return;
|
||||
}
|
||||
|
||||
ref var shader = ref _shaders[id.value]!;
|
||||
ref var shader = ref _shaders[id.Value]!;
|
||||
ReleaseResource(ref shader);
|
||||
}
|
||||
|
||||
@@ -479,17 +478,11 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
||||
ReleaseResource(ref shader);
|
||||
}
|
||||
|
||||
// Same for shader pass.
|
||||
foreach (var kv in _shaderPasses)
|
||||
{
|
||||
var pass = kv.Value;
|
||||
ReleaseResource(ref pass);
|
||||
}
|
||||
|
||||
_resources.Dispose();
|
||||
_samplers.Dispose();
|
||||
_meshes.Dispose();
|
||||
_materials.Dispose();
|
||||
// _shaderPasses.Dispose();
|
||||
|
||||
_disposed = true;
|
||||
|
||||
|
||||
@@ -166,6 +166,33 @@ internal unsafe static class D3D12Utility
|
||||
};
|
||||
}
|
||||
|
||||
public static ResourceDesc ToResourceDesc(this D3D12_RESOURCE_DESC desc)
|
||||
{
|
||||
if (desc.Dimension == D3D12_RESOURCE_DIMENSION.D3D12_RESOURCE_DIMENSION_BUFFER)
|
||||
{
|
||||
return ResourceDesc.Buffer(new BufferDesc
|
||||
{
|
||||
Size = (uint)desc.Width,
|
||||
Stride = 0,
|
||||
Usage = BufferUsage.None,
|
||||
MemoryType = ResourceMemoryType.Default
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
return ResourceDesc.Texture(new TextureDesc
|
||||
{
|
||||
Width = (uint)desc.Width,
|
||||
Height = desc.Height,
|
||||
Slice = desc.DepthOrArraySize,
|
||||
Format = desc.Format.ToTextureFormat(),
|
||||
Dimension = desc.Dimension.ToTextureDimension(),
|
||||
MipLevels = desc.MipLevels,
|
||||
Usage = TextureUsage.None,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static D3D12_RASTERIZER_DESC D3D12_RASTERIZER_DESC_CREATE(
|
||||
D3D12_FILL_MODE fillMode,
|
||||
|
||||
Reference in New Issue
Block a user