如何在 Rust/WinRT 中获取 IDirect3DDevice?

问题描述 投票:0回答:1

我想在

winrt-rs
项目中捕获屏幕,因此请遵循 这些说明

但是,我不知道如何获得

IDirect3DDevice
的第一个参数
Direct3D11CaptureFramePool.Create()

对于C++/WinRT,

Windows.graphics.directx.direct3d11.interop.h
中有一个获取接口的函数,但是在Rust中我该怎么做?

rust windows-runtime directx
1个回答
0
投票

从截图-rs 示例中,定义了三个函数来创建 d3d 设备。

fn create_d3d_device_with_type(
    driver_type: D3D_DRIVER_TYPE,
    flags: D3D11_CREATE_DEVICE_FLAG,
    device: *mut Option<ID3D11Device>,
) -> Result<()> {
    unsafe {
        D3D11CreateDevice(
            None,
            driver_type,
            None,
            flags,
            None,
            D3D11_SDK_VERSION,
            Some(device),
            None,
            None,
        )
    }
}

这个主要示例是一个允许创建不同设备类型、修改指向结构的可变指针的函数。

pub fn create_d3d_device() -> Result<ID3D11Device> {
    let mut device = None;
    let mut result = create_d3d_device_with_type(
        D3D_DRIVER_TYPE_HARDWARE,
        D3D11_CREATE_DEVICE_BGRA_SUPPORT,
        &mut device,
    );
    if let Err(error) = &result {
        if error.code() == DXGI_ERROR_UNSUPPORTED {
            result = create_d3d_device_with_type(
                D3D_DRIVER_TYPE_WARP,
                D3D11_CREATE_DEVICE_BGRA_SUPPORT,
                &mut device,
            );
        }
    }
    result?;
    Ok(device.unwrap())
}

第二个示例展示了如何创建默认设备,并返回新值作为函数结果。

pub fn create_direct3d_device(d3d_device: &ID3D11Device) -> Result<IDirect3DDevice> {
    let dxgi_device: IDXGIDevice = d3d_device.cast()?;
    let inspectable = unsafe { CreateDirect3D11DeviceFromDXGIDevice(&dxgi_device)? };
    inspectable.cast()
}

这展示了当您已经拥有 dxgi 设备时如何获取设备。

所有代码示例均取自 2024 年 4 月 8 日上午 8:24 的 snapshot-rs 存储库的主分支。

© www.soinside.com 2019 - 2024. All rights reserved.