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.

Если вам нужно больше информации, дайте мне знать.

Я был бы очень признателен за любую помощь.

0 ответов

Другие вопросы по тегам