use anyhow::Result;
use gpui_engine::ImportedTextureHandle;
use windows::Win32::Graphics::{
Direct3D11::{D3D11_BIND_SHADER_RESOURCE, D3D11_TEXTURE2D_DESC, ID3D11Texture2D},
Dxgi::Common::{DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB},
};
#[derive(Clone)]
pub struct DirectXImportedTexture {
pub(crate) texture: ID3D11Texture2D,
}
unsafe impl Send for DirectXImportedTexture {}
unsafe impl Sync for DirectXImportedTexture {}
pub trait DirectXTextureExt {
fn to_imported_handle(&self) -> Result<ImportedTextureHandle>;
}
impl DirectXTextureExt for ID3D11Texture2D {
fn to_imported_handle(&self) -> Result<ImportedTextureHandle> {
let desc = unsafe {
let mut desc = D3D11_TEXTURE2D_DESC::default();
self.GetDesc(&mut desc);
desc
};
anyhow::ensure!(
matches!(
desc.Format,
DXGI_FORMAT_B8G8R8A8_UNORM | DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
),
"an imported texture must be B8G8R8A8, the channel order the Direct3D target is in, \
but this one is {:?}",
desc.Format
);
anyhow::ensure!(
desc.BindFlags & D3D11_BIND_SHADER_RESOURCE.0 as u32 != 0,
"an imported texture must be created with D3D11_BIND_SHADER_RESOURCE"
);
Ok(ImportedTextureHandle::new(DirectXImportedTexture {
texture: self.clone(),
}))
}
}