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 System.Numerics; |
||||
using SharpDX.D3DCompiler; |
using Silk.NET.Core.Native; |
||||
using SharpDX.Direct3D; |
using Silk.NET.Direct3D.Compilers; |
||||
|
using Silk.NET.Direct3D11; |
||||
using System; |
using Silk.NET.DXGI; |
||||
using System.Linq; |
using static Silk.NET.Core.Native.SilkMarshal; |
||||
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; |
|
||||
|
|
||||
|
|
||||
namespace GpuInterop.D3DDemo; |
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
|
// Compile Vertex and Pixel shaders
|
||||
var vertexShaderByteCode = ShaderBytecode.CompileFromFile("D3DDemo\\MiniCube.fx", "VS", "vs_4_0"); |
using var vertexShaderByteCode = CompileShader("D3DDemo\\MiniCube.fx", "VS", "vs_4_0"); |
||||
var vertexShader = new VertexShader(device, vertexShaderByteCode); |
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"); |
using var pixelShaderByteCode = CompileShader("D3DDemo\\MiniCube.fx", "PS", "ps_4_0"); |
||||
var pixelShader = new PixelShader(device, pixelShaderByteCode); |
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), |
const int inputCount = 2; |
||||
new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) |
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
|
ThrowHResult(device.CreateInputLayout( |
||||
var layout = new InputLayout( |
inputs, |
||||
device, |
inputCount, |
||||
signature, |
vertexShaderSignature.GetBufferPointer(), |
||||
inputElements); |
vertexShaderSignature.GetBufferSize(), |
||||
|
inputLayout.GetAddressOf())); |
||||
|
} |
||||
|
finally |
||||
|
{ |
||||
|
FreeString(positionNamePtr, NativeStringEncoding.LPStr); |
||||
|
FreeString(colorNamePtr, NativeStringEncoding.LPStr); |
||||
|
} |
||||
|
|
||||
// Instantiate Vertex buffer from vertex data
|
// Instantiate Vertex buffer from vertex data
|
||||
using var vertices = Buffer.Create( |
var vertices = new[] |
||||
device, |
{ |
||||
BindFlags.VertexBuffer, |
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front
|
||||
new[] |
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
|
ByteWidth = (uint)(sizeof(Vector4) * vertices.Length), |
||||
new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
Usage = Usage.Default, |
||||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
BindFlags = (uint)BindFlag.VertexBuffer, |
||||
new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
CPUAccessFlags = (uint)CpuAccessFlag.None, |
||||
new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
MiscFlags = (uint)ResourceMiscFlag.None, |
||||
new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), |
StructureByteStride = 0 |
||||
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), |
var subresourceData = new SubresourceData(verticesPtr); |
||||
new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), |
ThrowHResult(device.CreateBuffer(&vertexBufferDesc, &subresourceData, vertexBuffer.GetAddressOf())); |
||||
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), |
|
||||
}); |
|
||||
|
|
||||
// Create Constant Buffer
|
// Create Constant Buffer
|
||||
var constantBuffer = new Buffer(device, Utilities.SizeOf<Matrix>(), ResourceUsage.Default, |
ComPtr<ID3D11Buffer> constantBuffer = default; |
||||
BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); |
var constantBufferDesc = new BufferDesc |
||||
|
{ |
||||
var context = device.ImmediateContext; |
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
|
// Prepare All the stages
|
||||
context.InputAssembler.InputLayout = layout; |
using ComPtr<ID3D11DeviceContext> context = default; |
||||
context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; |
device.GetImmediateContext(context.GetAddressOf()); |
||||
context.InputAssembler.SetVertexBuffers(0, |
|
||||
new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0)); |
context.IASetInputLayout(inputLayout); |
||||
context.VertexShader.SetConstantBuffer(0, constantBuffer); |
context.IASetPrimitiveTopology(D3DPrimitiveTopology.D3D10PrimitiveTopologyTrianglelist); |
||||
context.VertexShader.Set(vertexShader); |
var stride = (uint)(sizeof(Vector4) * 2); |
||||
context.PixelShader.Set(pixelShader); |
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; |
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" |
<Window xmlns="https://github.com/avaloniaui" |
||||
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' |
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"> |
x:Class="GpuInterop.MainWindow"> |
||||
<gpuInterop:GpuDemo> |
|
||||
<gpuInterop:GpuDemo.Demo> |
|
||||
<!--<d3DDemo:D3D11DemoControl/>--> |
|
||||
<vulkanDemo:VulkanDemoControl/> |
|
||||
</gpuInterop:GpuDemo.Demo> |
|
||||
</gpuInterop:GpuDemo> |
|
||||
</Window> |
</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; |
||||
using System.Runtime.CompilerServices; |
|
||||
using System.Runtime.InteropServices; |
|
||||
using Avalonia; |
using Avalonia; |
||||
using SharpDX.Direct3D; |
using Silk.NET.Core.Native; |
||||
using SharpDX.Direct3D11; |
using Silk.NET.Direct3D11; |
||||
using SharpDX.DXGI; |
using Silk.NET.DXGI; |
||||
using D3DDevice = SharpDX.Direct3D11.Device; |
using VulkanFormat = Silk.NET.Vulkan.Format; |
||||
using DxgiFactory1 = SharpDX.DXGI.Factory1; |
using static Silk.NET.Core.Native.SilkMarshal; |
||||
|
|
||||
namespace GpuInterop.VulkanDemo; |
namespace GpuInterop.VulkanDemo; |
||||
|
|
||||
public class D3DMemoryHelper |
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(); |
using var dxgi = new DXGI(DXGI.CreateDefaultContext(["DXGI.dll"])); |
||||
var longLuid = MemoryMarshal.Cast<byte, long>(luid)[0]; |
using var d3d11 = new D3D11(D3D11.CreateDefaultContext(["d3d11.dll"])); |
||||
for (var c = 0; c < factory.GetAdapterCount1(); c++) |
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); |
D3DFeatureLevel.Level121, |
||||
if (adapter.Description1.Luid != longLuid) |
D3DFeatureLevel.Level120, |
||||
continue; |
D3DFeatureLevel.Level111, |
||||
|
D3DFeatureLevel.Level110, |
||||
return new D3DDevice(adapter, DeviceCreationFlags.None, |
D3DFeatureLevel.Level100, |
||||
new[] |
D3DFeatureLevel.Level93, |
||||
{ |
D3DFeatureLevel.Level92, |
||||
FeatureLevel.Level_12_1, FeatureLevel.Level_12_0, FeatureLevel.Level_11_1, |
D3DFeatureLevel.Level91 |
||||
FeatureLevel.Level_11_0, FeatureLevel.Level_10_0, FeatureLevel.Level_9_3, |
}; |
||||
FeatureLevel.Level_9_2, FeatureLevel.Level_9_1, |
|
||||
}); |
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"); |
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"); |
throw new ArgumentException("Not supported format"); |
||||
return new Texture2D(device, |
|
||||
new Texture2DDescription |
ComPtr<ID3D11Texture2D> texture = default; |
||||
{ |
var textureDesc = new Texture2DDesc |
||||
Format = Format.R8G8B8A8_UNorm, |
{ |
||||
Width = size.Width, |
Format = Format.FormatR8G8B8A8Unorm, |
||||
Height = size.Height, |
Width = (uint)size.Width, |
||||
ArraySize = 1, |
Height = (uint)size.Height, |
||||
MipLevels = 1, |
ArraySize = 1, |
||||
SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, |
MipLevels = 1, |
||||
CpuAccessFlags = default, |
SampleDesc = new SampleDesc(1, 0), |
||||
OptionFlags = ResourceOptionFlags.SharedKeyedmutex|ResourceOptionFlags.SharedNthandle, |
Usage = Usage.Default, |
||||
BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource |
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