Browse Source
* Replace SharpDX with Silk.NET in GpuInterop sample * Add Vulkan/D3D11 command line switch to GpuInterop * Fixed warnings in GpuInteroppull/20170/head
committed by
GitHub
20 changed files with 531 additions and 345 deletions
@ -1,110 +1,158 @@ |
|||
using SharpDX; |
|||
using SharpDX.D3DCompiler; |
|||
using SharpDX.Direct3D; |
|||
|
|||
using System; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using SharpDX.Direct2D1; |
|||
using SharpDX.Direct3D11; |
|||
using SharpDX.DXGI; |
|||
using SharpDX.Mathematics.Interop; |
|||
using Buffer = SharpDX.Direct3D11.Buffer; |
|||
using DeviceContext = SharpDX.Direct2D1.DeviceContext; |
|||
using DxgiFactory1 = SharpDX.DXGI.Factory1; |
|||
using Matrix = SharpDX.Matrix; |
|||
using D3DDevice = SharpDX.Direct3D11.Device; |
|||
using DxgiResource = SharpDX.DXGI.Resource; |
|||
using FeatureLevel = SharpDX.Direct3D.FeatureLevel; |
|||
using InputElement = SharpDX.Direct3D11.InputElement; |
|||
|
|||
using System.Numerics; |
|||
using Silk.NET.Core.Native; |
|||
using Silk.NET.Direct3D.Compilers; |
|||
using Silk.NET.Direct3D11; |
|||
using Silk.NET.DXGI; |
|||
using static Silk.NET.Core.Native.SilkMarshal; |
|||
|
|||
namespace GpuInterop.D3DDemo; |
|||
|
|||
public class D3DContent |
|||
public static class D3DContent |
|||
{ |
|||
private static D3DCompiler s_compiler = D3DCompiler.GetApi(); |
|||
|
|||
public static Buffer CreateMesh(D3DDevice device) |
|||
public static unsafe ComPtr<ID3D11Buffer> CreateMesh(ComPtr<ID3D11Device> device) |
|||
{ |
|||
// Compile Vertex and Pixel shaders
|
|||
var vertexShaderByteCode = ShaderBytecode.CompileFromFile("D3DDemo\\MiniCube.fx", "VS", "vs_4_0"); |
|||
var vertexShader = new VertexShader(device, vertexShaderByteCode); |
|||
using var vertexShaderByteCode = CompileShader("D3DDemo\\MiniCube.fx", "VS", "vs_4_0"); |
|||
using ComPtr<ID3D11VertexShader> vertexShader = default; |
|||
ThrowHResult(device.CreateVertexShader( |
|||
vertexShaderByteCode.GetBufferPointer(), |
|||
vertexShaderByteCode.GetBufferSize(), |
|||
(ID3D11ClassLinkage*)null, |
|||
vertexShader.GetAddressOf())); |
|||
|
|||
var pixelShaderByteCode = ShaderBytecode.CompileFromFile("D3DDemo\\MiniCube.fx", "PS", "ps_4_0"); |
|||
var pixelShader = new PixelShader(device, pixelShaderByteCode); |
|||
using var pixelShaderByteCode = CompileShader("D3DDemo\\MiniCube.fx", "PS", "ps_4_0"); |
|||
using ComPtr<ID3D11PixelShader> pixelShader = default; |
|||
ThrowHResult(device.CreatePixelShader( |
|||
pixelShaderByteCode.GetBufferPointer(), |
|||
pixelShaderByteCode.GetBufferSize(), |
|||
(ID3D11ClassLinkage*)null, |
|||
pixelShader.GetAddressOf())); |
|||
|
|||
var signature = ShaderSignature.GetInputSignature(vertexShaderByteCode); |
|||
using ComPtr<ID3D10Blob> vertexShaderSignature = default; |
|||
ThrowHResult(s_compiler.GetInputSignatureBlob( |
|||
vertexShaderByteCode.GetBufferPointer(), |
|||
vertexShaderByteCode.GetBufferSize(), |
|||
vertexShaderSignature.GetAddressOf())); |
|||
|
|||
var inputElements = new[] |
|||
// Layout from VertexShader input signature
|
|||
using ComPtr<ID3D11InputLayout> inputLayout = default; |
|||
var positionNamePtr = StringToPtr("POSITION", NativeStringEncoding.LPStr); |
|||
var colorNamePtr = StringToPtr("COLOR", NativeStringEncoding.LPStr); |
|||
try |
|||
{ |
|||
new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), |
|||
new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) |
|||
}; |
|||
const int inputCount = 2; |
|||
var inputs = stackalloc InputElementDesc[inputCount] |
|||
{ |
|||
new InputElementDesc((byte*)positionNamePtr, 0, Format.FormatR32G32B32A32Float, 0, 0), |
|||
new InputElementDesc((byte*)colorNamePtr, 0, Format.FormatR32G32B32A32Float, 0, 16) |
|||
}; |
|||
|
|||
// Layout from VertexShader input signature
|
|||
var layout = new InputLayout( |
|||
device, |
|||
signature, |
|||
inputElements); |
|||
ThrowHResult(device.CreateInputLayout( |
|||
inputs, |
|||
inputCount, |
|||
vertexShaderSignature.GetBufferPointer(), |
|||
vertexShaderSignature.GetBufferSize(), |
|||
inputLayout.GetAddressOf())); |
|||
} |
|||
finally |
|||
{ |
|||
FreeString(positionNamePtr, NativeStringEncoding.LPStr); |
|||
FreeString(colorNamePtr, NativeStringEncoding.LPStr); |
|||
} |
|||
|
|||
// Instantiate Vertex buffer from vertex data
|
|||
using var vertices = Buffer.Create( |
|||
device, |
|||
BindFlags.VertexBuffer, |
|||
new[] |
|||
var vertices = new[] |
|||
{ |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front
|
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), // BACK
|
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), // Top
|
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), // Bottom
|
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), // Left
|
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), // Right
|
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
}; |
|||
|
|||
using ComPtr<ID3D11Buffer> vertexBuffer = default; |
|||
|
|||
fixed (Vector4* verticesPtr = vertices) |
|||
{ |
|||
var vertexBufferDesc = new BufferDesc |
|||
{ |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front
|
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), // BACK
|
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), // Top
|
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), // Bottom
|
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), // Left
|
|||
new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), // Right
|
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), |
|||
}); |
|||
ByteWidth = (uint)(sizeof(Vector4) * vertices.Length), |
|||
Usage = Usage.Default, |
|||
BindFlags = (uint)BindFlag.VertexBuffer, |
|||
CPUAccessFlags = (uint)CpuAccessFlag.None, |
|||
MiscFlags = (uint)ResourceMiscFlag.None, |
|||
StructureByteStride = 0 |
|||
}; |
|||
var subresourceData = new SubresourceData(verticesPtr); |
|||
ThrowHResult(device.CreateBuffer(&vertexBufferDesc, &subresourceData, vertexBuffer.GetAddressOf())); |
|||
} |
|||
|
|||
// Create Constant Buffer
|
|||
var constantBuffer = new Buffer(device, Utilities.SizeOf<Matrix>(), ResourceUsage.Default, |
|||
BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); |
|||
|
|||
var context = device.ImmediateContext; |
|||
ComPtr<ID3D11Buffer> constantBuffer = default; |
|||
var constantBufferDesc = new BufferDesc |
|||
{ |
|||
ByteWidth = (uint)sizeof(Matrix4x4), |
|||
Usage = Usage.Default, |
|||
BindFlags = (uint)BindFlag.ConstantBuffer, |
|||
CPUAccessFlags = (uint)CpuAccessFlag.None, |
|||
MiscFlags = (uint)ResourceMiscFlag.None, |
|||
StructureByteStride = 0 |
|||
}; |
|||
ThrowHResult(device.CreateBuffer(&constantBufferDesc, (SubresourceData*)null, constantBuffer.GetAddressOf())); |
|||
|
|||
// Prepare All the stages
|
|||
context.InputAssembler.InputLayout = layout; |
|||
context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; |
|||
context.InputAssembler.SetVertexBuffers(0, |
|||
new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0)); |
|||
context.VertexShader.SetConstantBuffer(0, constantBuffer); |
|||
context.VertexShader.Set(vertexShader); |
|||
context.PixelShader.Set(pixelShader); |
|||
using ComPtr<ID3D11DeviceContext> context = default; |
|||
device.GetImmediateContext(context.GetAddressOf()); |
|||
|
|||
context.IASetInputLayout(inputLayout); |
|||
context.IASetPrimitiveTopology(D3DPrimitiveTopology.D3D10PrimitiveTopologyTrianglelist); |
|||
var stride = (uint)(sizeof(Vector4) * 2); |
|||
var offset = 0u; |
|||
context.IASetVertexBuffers(0, 1, &vertexBuffer.Handle, &stride, &offset); |
|||
context.VSSetConstantBuffers(0, 1, &constantBuffer.Handle); |
|||
context.VSSetShader(vertexShader, (ID3D11ClassInstance**)null, 0); |
|||
context.PSSetShader(pixelShader, (ID3D11ClassInstance**)null, 0); |
|||
|
|||
return constantBuffer; |
|||
} |
|||
|
|||
private static unsafe ComPtr<ID3D10Blob> CompileShader(string fileName, string entryPoint, string profile) |
|||
{ |
|||
ComPtr<ID3D10Blob> blob = default; |
|||
ThrowHResult(s_compiler.CompileFromFile(fileName, null, null, entryPoint, profile, 0u, 0u, blob.GetAddressOf(), null)); |
|||
return blob; |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,7 @@ |
|||
namespace GpuInterop; |
|||
|
|||
public enum DemoType |
|||
{ |
|||
Vulkan, |
|||
D3D11 |
|||
} |
|||
@ -1,13 +1,5 @@ |
|||
<Window xmlns="https://github.com/avaloniaui" |
|||
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' |
|||
xmlns:gpuInterop="clr-namespace:GpuInterop" |
|||
xmlns:d3DDemo="clr-namespace:GpuInterop.D3DDemo" |
|||
xmlns:vulkanDemo="clr-namespace:GpuInterop.VulkanDemo" |
|||
x:Class="GpuInterop.MainWindow"> |
|||
<gpuInterop:GpuDemo> |
|||
<gpuInterop:GpuDemo.Demo> |
|||
<!--<d3DDemo:D3D11DemoControl/>--> |
|||
<vulkanDemo:VulkanDemoControl/> |
|||
</gpuInterop:GpuDemo.Demo> |
|||
</gpuInterop:GpuDemo> |
|||
|
|||
</Window> |
|||
|
|||
@ -0,0 +1,12 @@ |
|||
{ |
|||
"$schema": "http://json.schemastore.org/launchsettings.json", |
|||
"profiles": { |
|||
"GpuInterop (Vulkan)": { |
|||
"commandName": "Project", |
|||
}, |
|||
"GpuInterop (Direct3D)": { |
|||
"commandName": "Project", |
|||
"commandLineArgs": "--d3d" |
|||
} |
|||
} |
|||
} |
|||
@ -1,54 +1,97 @@ |
|||
using System; |
|||
using System.Runtime.CompilerServices; |
|||
using System.Runtime.InteropServices; |
|||
using Avalonia; |
|||
using SharpDX.Direct3D; |
|||
using SharpDX.Direct3D11; |
|||
using SharpDX.DXGI; |
|||
using D3DDevice = SharpDX.Direct3D11.Device; |
|||
using DxgiFactory1 = SharpDX.DXGI.Factory1; |
|||
using Silk.NET.Core.Native; |
|||
using Silk.NET.Direct3D11; |
|||
using Silk.NET.DXGI; |
|||
using VulkanFormat = Silk.NET.Vulkan.Format; |
|||
using static Silk.NET.Core.Native.SilkMarshal; |
|||
|
|||
namespace GpuInterop.VulkanDemo; |
|||
|
|||
public class D3DMemoryHelper |
|||
{ |
|||
public static D3DDevice CreateDeviceByLuid(Span<byte> luid) |
|||
private const int DxgiErrorNotFound = unchecked((int)0x887A0002); |
|||
|
|||
public static unsafe ComPtr<ID3D11Device> CreateDeviceByLuid(Luid luid) |
|||
{ |
|||
var factory = new DxgiFactory1(); |
|||
var longLuid = MemoryMarshal.Cast<byte, long>(luid)[0]; |
|||
for (var c = 0; c < factory.GetAdapterCount1(); c++) |
|||
using var dxgi = new DXGI(DXGI.CreateDefaultContext(["DXGI.dll"])); |
|||
using var d3d11 = new D3D11(D3D11.CreateDefaultContext(["d3d11.dll"])); |
|||
using var factory = dxgi.CreateDXGIFactory1<IDXGIFactory1>(); |
|||
using var adapter = GetAdapterByLuid(factory, luid); |
|||
|
|||
const int featureLevelCount = 8; |
|||
var featureLevels = stackalloc D3DFeatureLevel[featureLevelCount] |
|||
{ |
|||
using var adapter = factory.GetAdapter1(c); |
|||
if (adapter.Description1.Luid != longLuid) |
|||
continue; |
|||
|
|||
return new D3DDevice(adapter, DeviceCreationFlags.None, |
|||
new[] |
|||
{ |
|||
FeatureLevel.Level_12_1, FeatureLevel.Level_12_0, FeatureLevel.Level_11_1, |
|||
FeatureLevel.Level_11_0, FeatureLevel.Level_10_0, FeatureLevel.Level_9_3, |
|||
FeatureLevel.Level_9_2, FeatureLevel.Level_9_1, |
|||
}); |
|||
D3DFeatureLevel.Level121, |
|||
D3DFeatureLevel.Level120, |
|||
D3DFeatureLevel.Level111, |
|||
D3DFeatureLevel.Level110, |
|||
D3DFeatureLevel.Level100, |
|||
D3DFeatureLevel.Level93, |
|||
D3DFeatureLevel.Level92, |
|||
D3DFeatureLevel.Level91 |
|||
}; |
|||
|
|||
ComPtr<ID3D11Device> device = default; |
|||
ComPtr<ID3D11DeviceContext> context = default; |
|||
D3DFeatureLevel actualFeatureLevel; |
|||
ThrowHResult(d3d11.CreateDevice( |
|||
adapter, |
|||
D3DDriverType.Unknown, |
|||
IntPtr.Zero, |
|||
0u, |
|||
featureLevels, |
|||
featureLevelCount, |
|||
D3D11.SdkVersion, |
|||
device.GetAddressOf(), |
|||
&actualFeatureLevel, |
|||
context.GetAddressOf())); |
|||
|
|||
return device; |
|||
} |
|||
|
|||
private static unsafe ComPtr<IDXGIAdapter> GetAdapterByLuid(ComPtr<IDXGIFactory1> factory, Luid luid) |
|||
{ |
|||
var index = 0u; |
|||
ComPtr<IDXGIAdapter> adapter = default; |
|||
|
|||
while (factory.EnumAdapters(index, adapter.GetAddressOf()) != DxgiErrorNotFound) |
|||
{ |
|||
AdapterDesc adapterDesc; |
|||
if (adapter.GetDesc(&adapterDesc) == 0 & AreLuidsEqual(adapterDesc.AdapterLuid, luid)) |
|||
return adapter; |
|||
|
|||
adapter.Dispose(); |
|||
++index; |
|||
} |
|||
|
|||
throw new ArgumentException("Device with the corresponding LUID not found"); |
|||
} |
|||
|
|||
public static Texture2D CreateMemoryHandle(D3DDevice device, PixelSize size, Silk.NET.Vulkan.Format format) |
|||
public static unsafe ComPtr<ID3D11Texture2D> CreateMemoryHandle(ComPtr<ID3D11Device> device, PixelSize size, VulkanFormat format) |
|||
{ |
|||
if (format != Silk.NET.Vulkan.Format.R8G8B8A8Unorm) |
|||
if (format != VulkanFormat.R8G8B8A8Unorm) |
|||
throw new ArgumentException("Not supported format"); |
|||
return new Texture2D(device, |
|||
new Texture2DDescription |
|||
{ |
|||
Format = Format.R8G8B8A8_UNorm, |
|||
Width = size.Width, |
|||
Height = size.Height, |
|||
ArraySize = 1, |
|||
MipLevels = 1, |
|||
SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, |
|||
CpuAccessFlags = default, |
|||
OptionFlags = ResourceOptionFlags.SharedKeyedmutex|ResourceOptionFlags.SharedNthandle, |
|||
BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource |
|||
}); |
|||
|
|||
ComPtr<ID3D11Texture2D> texture = default; |
|||
var textureDesc = new Texture2DDesc |
|||
{ |
|||
Format = Format.FormatR8G8B8A8Unorm, |
|||
Width = (uint)size.Width, |
|||
Height = (uint)size.Height, |
|||
ArraySize = 1, |
|||
MipLevels = 1, |
|||
SampleDesc = new SampleDesc(1, 0), |
|||
Usage = Usage.Default, |
|||
BindFlags = (uint)(BindFlag.RenderTarget | BindFlag.ShaderResource), |
|||
CPUAccessFlags = 0, |
|||
MiscFlags = (uint)(ResourceMiscFlag.SharedKeyedmutex | ResourceMiscFlag.SharedNthandle) |
|||
}; |
|||
ThrowHResult(device.CreateTexture2D(&textureDesc, (SubresourceData*)null, texture.GetAddressOf())); |
|||
|
|||
return texture; |
|||
} |
|||
|
|||
private static bool AreLuidsEqual(Luid x, Luid y) |
|||
=> x.Low == y.Low && x.High == y.High; |
|||
} |
|||
|
|||
Loading…
Reference in new issue