为什么 D3D12GetDebugInterface 使用 Rust 的 windows-rs 板条箱失败并显示“不支持此类接口”?

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

使用 windows-rs 板条箱在 Rust 中获取

D3D12DebugInterface
时,出现以下错误:

failed to get d3d12 debug interface: No such interface supported (0x80004002)

这是我认为应该有效的代码:

#[derive(Default)]
struct DebugLayer {
    d3d12_debug: Option<ID3D12Debug6>,
    dxgi_debug: Option<IDXGIDebug1>,
}

impl DebugLayer {
    fn init() -> Self {
        unsafe {
            let mut debug_layer = Self::default();

            match D3D12GetDebugInterface(&mut debug_layer.d3d12_debug) {
                Ok(()) => {
                    if let Some(ref d3d12_debug) = debug_layer.d3d12_debug {
                        d3d12_debug.EnableDebugLayer();
                        println!("d3d12: debug layer enabled");

                        match DXGIGetDebugInterface1::<IDXGIDebug1>(0) {
                            Ok(dxgi_debug) => {
                                dxgi_debug.EnableLeakTrackingForThread();
                                println!("d3d12: leak tracking enabled");

                                debug_layer.dxgi_debug = Some(dxgi_debug);
                            }

                            Err(err) => println!("failed to get dxgi debug interface: {}", err),
                        }
                    }
                }

                Err(err) => println!("failed to get d3d12 debug interface: {}", err),
            }

            debug_layer
        }
    }
}

以及我在 Cargo.toml 中启用的功能:

[target.'cfg(target_os = "windows")'.dependencies.windows]
version = "0.52.0"
features = [
    "Win32_Foundation",
    "Win32_Graphics_Gdi",
    "Win32_Graphics_Direct3D_Fxc",
    "Win32_Graphics_Direct3D12",
    "Win32_Graphics_Dxgi_Common",
    "Win32_Security",
    "Win32_System_LibraryLoader",
    "Win32_System_Threading",
    "Win32_System_WindowsProgramming",
    "Win32_UI_Input_KeyboardAndMouse",
    "Win32_UI_WindowsAndMessaging",
]

我使用的是 Windows 10,我已检查我的设置并安装了图形工具。我错过了什么/做错了什么?

rust direct3d direct3d12 windows-rs
1个回答
0
投票

错误诊断是准确的:

ID3D12Debug6
在您的系统(或我的1)上不可用。这就是错误代码
0x80004002
i.e.
E_NOINTERFACE
)所传达的信息。

这是说明问题的最小示例。

Cargo.toml

[package]
name = "d3d12_debug_layer"
version = "0.0.0"
edition = "2021"

[dependencies.windows]
version = "0.52.0"
features = ["Win32_Graphics_Direct3D12"]

src/main.rs

use windows::{
    core::Result,
    Win32::Graphics::Direct3D12::{D3D12GetDebugInterface, ID3D12Debug6},
};

fn main() -> Result<()> {
    let mut dbg_itf: Option<ID3D12Debug6> = None;
    unsafe { D3D12GetDebugInterface(&mut dbg_itf) }?;

    Ok(())
}

发出

cargo run
会产生以下输出1

Error: Error { code: HRESULT(0x80004002), message: "No such interface supported" }

这不是您可以通过更改代码来“修复”的问题。所请求的接口 (

ID3D12Debug6
) 未在操作系统发行版附带的二进制文件中实现。


1 Windows 10 版本 22H2(操作系统内部版本 19045.3693)。

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