SlimDx Dx9->Dx11 Исключение общей поверхности в Texture2D Ctor
Что я делаю
У меня есть приложение WPF, и я использую SlimDX. Я создал usercontrol, который содержит d3dImage. При инициализации я создаю новую задачу, которая рендерится на Texture2D с помощью устройства Dx11. После рендеринга я использую объект IProgress, чтобы установить текстуру в качестве Backbuffer объекта D3dImage через объект Device9Ex. Я использую KeyedMutex, чтобы синхронизировать общую поверхность.
Проблема Проблема возникает на шаге, где я использую объект Device9Ex, чтобы установить буфер для D3dImage. Конструктор Texture2d выдает исключение.
public void Dx9SetbackBuffer(Texture2D toSetAsBackBuffer)
{
_mutex.Acquire(1,int.MaxValue);
Format textureFormat = TranslateDx11ToDx9Format(toSetAsBackBuffer);
_sharedTexture?.Dispose();
IntPtr handle;
using (var resource = new SlimDX.DXGI.Resource(toSetAsBackBuffer))
{
handle = resource.SharedHandle;
}
// the next line throws Exception: SlimDX.Direct3D9.Direct3D9Exception: "D3DERR_INVALIDCALL: Invalid call (-2005530516)"
_sharedTexture = new Texture(_device,
toSetAsBackBuffer.Description.Width,
toSetAsBackBuffer.Description.Height,
1,
Usage.RenderTarget|Usage.WriteOnly,
textureFormat,
Pool.Default,
ref handle);
using (Surface surface = _sharedTexture.GetSurfaceLevel(0))
{
_renderTo.Lock();
_renderTo.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.ComPointer);
_renderTo.AddDirtyRect(new Int32Rect(0, 0, _renderTo.PixelWidth, _renderTo.PixelHeight));
_renderTo.Unlock();
}
_mutex.Release(0);
}
код для инициализации устройства dx11 и создания общей текстуры
_device = new Device(DriverType.Hardware, DeviceCreationFlags.Debug |
DeviceCreationFlags.BgraSupport,
FeatureLevel.Level_11_0);
TextureDescription = new Texture2DDescription()
{
BindFlags = BindFlags.RenderTarget|BindFlags.ShaderResource,
Format = Format.B8G8R8A8_UNorm,
ArraySize = 1,
Width = _width > 0 ? _width : 800,
Height = _height > 0 ? _height : 600,
MipLevels = 1,
Usage = ResourceUsage.Default,
SampleDescription = new SampleDescription(1, 0),
CpuAccessFlags = CpuAccessFlags.None,
OptionFlags = ResourceOptionFlags.Shared
};
var depthDescription = new Texture2DDescription()
{
...
};
var mutexDescription = new Texture2DDescription()
{
...
};
_mutexTexture = new Texture2D(_device,mutexDescription);
_mutex = new KeyedMutex(_mutexTexture);
//this is the texture, that is copied by the d9Device
SharedTexture = new Texture2D(_device, TextureDescription);
DepthTexture = new Texture2D(_device, depthDescription);
SampleRenderView = new RenderTargetView(_device, SharedTexture);
SampleDepthView = new DepthStencilView(_device, DepthTexture);
Как вы можете видеть, я использую выделенную текстуру только для синхронизации поверхности. Я не уверен, является ли это правильным подходом, так как у меня были проблемы с инициализацией одной текстуры с флагом shared и keyedmutex.
Если вам нужно больше информации, дайте мне знать.
Я был бы очень признателен за любую помощь.