d3d11: update to windows-rs 0.44
This commit is contained in:
parent
a2363c30a7
commit
acca9ce6f6
65
Cargo.lock
generated
65
Cargo.lock
generated
|
@ -1654,17 +1654,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.43.0"
|
||||
version = "0.44.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244"
|
||||
checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc 0.42.0",
|
||||
"windows_i686_gnu 0.42.0",
|
||||
"windows_i686_msvc 0.42.0",
|
||||
"windows_x86_64_gnu 0.42.0",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc 0.42.0",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1687,19 +1681,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc 0.42.0",
|
||||
"windows_i686_gnu 0.42.0",
|
||||
"windows_i686_msvc 0.42.0",
|
||||
"windows_x86_64_gnu 0.42.0",
|
||||
"windows_aarch64_msvc 0.42.1",
|
||||
"windows_i686_gnu 0.42.1",
|
||||
"windows_i686_msvc 0.42.1",
|
||||
"windows_x86_64_gnu 0.42.1",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc 0.42.0",
|
||||
"windows_x86_64_msvc 0.42.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc 0.42.1",
|
||||
"windows_i686_gnu 0.42.1",
|
||||
"windows_i686_msvc 0.42.1",
|
||||
"windows_x86_64_gnu 0.42.1",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc 0.42.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
|
||||
checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
|
@ -1709,9 +1718,9 @@ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
|
|||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
|
||||
checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
|
@ -1721,9 +1730,9 @@ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
|
|||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
|
||||
checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
|
@ -1733,9 +1742,9 @@ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
|
|||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
|
||||
checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
|
@ -1745,15 +1754,15 @@ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
|
|||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
|
||||
checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
|
||||
checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
|
@ -1763,9 +1772,9 @@ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
|
|||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.42.0"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
|
||||
checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
|
||||
|
||||
[[package]]
|
||||
name = "winit"
|
||||
|
|
|
@ -32,7 +32,7 @@ rustc-hash = "1.1.0"
|
|||
ash = { version = "0.37.2+1.3.238", optional = true }
|
||||
|
||||
[dependencies.windows]
|
||||
version = "0.43.0"
|
||||
version = "0.44.0"
|
||||
features = [
|
||||
"Win32_Graphics_Direct3D11",
|
||||
]
|
||||
|
|
|
@ -26,7 +26,7 @@ num-traits = "0.2.15"
|
|||
|
||||
[dependencies.windows]
|
||||
optional = true
|
||||
version = "0.43.0"
|
||||
version = "0.44.0"
|
||||
features = [
|
||||
"Win32_Foundation",
|
||||
"Win32_Graphics_Dxgi_Common",
|
||||
|
|
|
@ -24,7 +24,7 @@ rustc-hash = "1.1.0"
|
|||
bytemuck = "1.12.3"
|
||||
|
||||
[dependencies.windows]
|
||||
version = "0.43.0"
|
||||
version = "0.44.0"
|
||||
features = [
|
||||
"Win32_Foundation",
|
||||
"Win32_Graphics_Dxgi_Common",
|
||||
|
|
|
@ -9,8 +9,8 @@ use thiserror::Error;
|
|||
/// Cumulative error type for Direct3D11 filter chains.
|
||||
#[derive(Error, Debug)]
|
||||
pub enum FilterChainError {
|
||||
#[error("unable to get direct3d context")]
|
||||
Direct3DContextError,
|
||||
#[error("invariant assumption about d3d11 did not hold. report this as an issue.")]
|
||||
Direct3DOperationError(&'static str),
|
||||
#[error("direct3d driver error")]
|
||||
Direct3DError(#[from] windows::core::Error),
|
||||
#[error("SPIRV reflection error")]
|
||||
|
@ -27,5 +27,21 @@ pub enum FilterChainError {
|
|||
LutLoadError(#[from] ImageError),
|
||||
}
|
||||
|
||||
macro_rules! assume_d3d11_init {
|
||||
($value:ident, $call:literal) => {
|
||||
let $value = $value.ok_or($crate::error::FilterChainError::Direct3DOperationError(
|
||||
$call,
|
||||
))?;
|
||||
};
|
||||
(mut $value:ident, $call:literal) => {
|
||||
let mut $value = $value.ok_or($crate::error::FilterChainError::Direct3DOperationError(
|
||||
$call,
|
||||
))?;
|
||||
};
|
||||
}
|
||||
|
||||
/// Macro for unwrapping result of a D3D function.
|
||||
pub(crate) use assume_d3d11_init;
|
||||
|
||||
/// Result type for Direct3D11 filter chains.
|
||||
pub type Result<T> = std::result::Result<T, FilterChainError>;
|
||||
|
|
|
@ -16,7 +16,7 @@ use std::collections::VecDeque;
|
|||
|
||||
use std::path::Path;
|
||||
|
||||
use crate::error::FilterChainError;
|
||||
use crate::error::{assume_d3d11_init, FilterChainError};
|
||||
use crate::filter_pass::{ConstantBufferBinding, FilterPass};
|
||||
use crate::framebuffer::OwnedFramebuffer;
|
||||
use crate::options::{FilterChainOptionsD3D11, FrameOptionsD3D11};
|
||||
|
@ -101,17 +101,18 @@ impl FilterChainD3D11 {
|
|||
// initialize passes
|
||||
let filters = FilterChainD3D11::init_passes(device, passes, &semantics)?;
|
||||
|
||||
let mut immediate_context = None;
|
||||
unsafe {
|
||||
device.GetImmediateContext(&mut immediate_context);
|
||||
}
|
||||
|
||||
let Some(immediate_context) = immediate_context else {
|
||||
return Err(FilterChainError::Direct3DContextError)
|
||||
};
|
||||
let immediate_context = unsafe { device.GetImmediateContext()? };
|
||||
|
||||
let current_context = if use_deferred_context {
|
||||
unsafe { device.CreateDeferredContext(0)? }
|
||||
// check if device supports deferred contexts
|
||||
if let Err(_) = unsafe { device.CreateDeferredContext(0, None) } {
|
||||
immediate_context.clone()
|
||||
} else {
|
||||
let mut context = None;
|
||||
unsafe { device.CreateDeferredContext(0, Some(&mut context))? };
|
||||
assume_d3d11_init!(context, "CreateDeferredContext");
|
||||
context
|
||||
}
|
||||
} else {
|
||||
immediate_context.clone()
|
||||
};
|
||||
|
@ -197,7 +198,8 @@ impl FilterChainD3D11 {
|
|||
impl FilterChainD3D11 {
|
||||
fn create_constant_buffer(device: &ID3D11Device, size: u32) -> error::Result<ID3D11Buffer> {
|
||||
unsafe {
|
||||
let buffer = device.CreateBuffer(
|
||||
let mut buffer = None;
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
ByteWidth: size,
|
||||
Usage: D3D11_USAGE_DYNAMIC,
|
||||
|
@ -207,8 +209,9 @@ impl FilterChainD3D11 {
|
|||
StructureByteStride: 0,
|
||||
},
|
||||
None,
|
||||
Some(&mut buffer),
|
||||
)?;
|
||||
|
||||
assume_d3d11_init!(buffer, "CreateBuffer");
|
||||
Ok(buffer)
|
||||
}
|
||||
}
|
||||
|
@ -602,7 +605,12 @@ impl FilterChainD3D11 {
|
|||
|
||||
if self.common.d3d11.context_is_deferred {
|
||||
unsafe {
|
||||
let command_list = self.common.d3d11.current_context.FinishCommandList(false)?;
|
||||
let mut command_list = None;
|
||||
self.common
|
||||
.d3d11
|
||||
.current_context
|
||||
.FinishCommandList(false, Some(&mut command_list))?;
|
||||
assume_d3d11_init!(command_list, "FinishCommandList");
|
||||
self.common
|
||||
.d3d11
|
||||
.immediate_context
|
||||
|
|
|
@ -14,7 +14,8 @@ use rustc_hash::FxHashMap;
|
|||
use librashader_runtime::binding::{BindSemantics, TextureInput};
|
||||
use windows::Win32::Graphics::Direct3D11::{
|
||||
ID3D11Buffer, ID3D11InputLayout, ID3D11PixelShader, ID3D11SamplerState,
|
||||
ID3D11ShaderResourceView, ID3D11VertexShader, D3D11_MAP_WRITE_DISCARD,
|
||||
ID3D11ShaderResourceView, ID3D11VertexShader, D3D11_MAPPED_SUBRESOURCE,
|
||||
D3D11_MAP_WRITE_DISCARD,
|
||||
};
|
||||
|
||||
use crate::render_target::RenderTarget;
|
||||
|
@ -181,7 +182,8 @@ impl FilterPass {
|
|||
if let Some(ubo) = &self.uniform_buffer {
|
||||
// upload uniforms
|
||||
unsafe {
|
||||
let map = context.Map(&ubo.buffer, 0, D3D11_MAP_WRITE_DISCARD, 0)?;
|
||||
let mut map = D3D11_MAPPED_SUBRESOURCE::default();
|
||||
context.Map(&ubo.buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, Some(&mut map))?;
|
||||
std::ptr::copy_nonoverlapping(
|
||||
self.uniform_storage.ubo_pointer(),
|
||||
map.pData.cast(),
|
||||
|
@ -191,21 +193,18 @@ impl FilterPass {
|
|||
}
|
||||
|
||||
if ubo.stage_mask.contains(BindingStage::VERTEX) {
|
||||
unsafe {
|
||||
context.VSSetConstantBuffers(ubo.binding, Some(&[Some(ubo.buffer.clone())]))
|
||||
}
|
||||
unsafe { context.VSSetConstantBuffers(ubo.binding, Some(&[ubo.buffer.clone()])) }
|
||||
}
|
||||
if ubo.stage_mask.contains(BindingStage::FRAGMENT) {
|
||||
unsafe {
|
||||
context.PSSetConstantBuffers(ubo.binding, Some(&[Some(ubo.buffer.clone())]))
|
||||
}
|
||||
unsafe { context.PSSetConstantBuffers(ubo.binding, Some(&[ubo.buffer.clone()])) }
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(push) = &self.push_buffer {
|
||||
// upload push constants
|
||||
unsafe {
|
||||
let map = context.Map(&push.buffer, 0, D3D11_MAP_WRITE_DISCARD, 0)?;
|
||||
let mut map = D3D11_MAPPED_SUBRESOURCE::default();
|
||||
context.Map(&push.buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, Some(&mut map))?;
|
||||
std::ptr::copy_nonoverlapping(
|
||||
self.uniform_storage.push_pointer(),
|
||||
map.pData.cast(),
|
||||
|
@ -215,14 +214,10 @@ impl FilterPass {
|
|||
}
|
||||
|
||||
if push.stage_mask.contains(BindingStage::VERTEX) {
|
||||
unsafe {
|
||||
context.VSSetConstantBuffers(push.binding, Some(&[Some(push.buffer.clone())]))
|
||||
}
|
||||
unsafe { context.VSSetConstantBuffers(push.binding, Some(&[push.buffer.clone()])) }
|
||||
}
|
||||
if push.stage_mask.contains(BindingStage::FRAGMENT) {
|
||||
unsafe {
|
||||
context.PSSetConstantBuffers(push.binding, Some(&[Some(push.buffer.clone())]))
|
||||
}
|
||||
unsafe { context.PSSetConstantBuffers(push.binding, Some(&[push.buffer.clone()])) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -232,10 +227,16 @@ impl FilterPass {
|
|||
}
|
||||
|
||||
unsafe {
|
||||
context.PSSetShaderResources(0, Some(&textures));
|
||||
context.PSSetSamplers(0, Some(&samplers));
|
||||
// SAFETY: Niche optimization for Option<NonNull<T>>
|
||||
// Assumes that IUnknown is defined as IUnknown(std::ptr::NonNull<std::ffi::c_void>)
|
||||
const _: () = assert!(
|
||||
std::mem::size_of::<Option<windows::core::IUnknown>>()
|
||||
== std::mem::size_of::<windows::core::IUnknown>()
|
||||
);
|
||||
context.PSSetShaderResources(0, Some(std::mem::transmute(textures.as_ref())));
|
||||
context.PSSetSamplers(0, Some(std::mem::transmute(samplers.as_ref())));
|
||||
|
||||
context.OMSetRenderTargets(Some(&[Some(output.output.rtv.clone())]), None);
|
||||
context.OMSetRenderTargets(Some(&[output.output.rtv.clone()]), None);
|
||||
context.RSSetViewports(Some(&[output.output.viewport]))
|
||||
}
|
||||
|
||||
|
@ -246,7 +247,7 @@ impl FilterPass {
|
|||
|
||||
unsafe {
|
||||
// unbind resources.
|
||||
context.PSSetShaderResources(0, Some(NULL_TEXTURES));
|
||||
context.PSSetShaderResources(0, Some(std::mem::transmute(NULL_TEXTURES.as_ref())));
|
||||
context.OMSetRenderTargets(None, None);
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::error;
|
||||
use crate::error::assume_d3d11_init;
|
||||
use crate::texture::{D3D11InputView, InputTexture};
|
||||
use crate::util::d3d11_get_closest_format;
|
||||
use librashader_common::{ImageFormat, Size};
|
||||
|
@ -43,7 +44,9 @@ impl OwnedFramebuffer {
|
|||
| D3D11_FORMAT_SUPPORT_RENDER_TARGET.0,
|
||||
);
|
||||
let desc = default_desc(size, format, 1);
|
||||
let texture = device.CreateTexture2D(&desc, None)?;
|
||||
let mut texture = None;
|
||||
device.CreateTexture2D(&desc, None, Some(&mut texture))?;
|
||||
assume_d3d11_init!(texture, "CreateTexture2D");
|
||||
|
||||
Ok(OwnedFramebuffer {
|
||||
texture,
|
||||
|
@ -101,7 +104,10 @@ impl OwnedFramebuffer {
|
|||
// todo: fix mipmap handling
|
||||
let desc = default_desc(size, format, 1);
|
||||
unsafe {
|
||||
let mut texture = self.device.CreateTexture2D(&desc, None)?;
|
||||
let mut texture = None;
|
||||
self.device
|
||||
.CreateTexture2D(&desc, None, Some(&mut texture))?;
|
||||
assume_d3d11_init!(mut texture, "CreateTexture2D");
|
||||
std::mem::swap(&mut self.texture, &mut texture);
|
||||
drop(texture)
|
||||
}
|
||||
|
@ -112,8 +118,9 @@ impl OwnedFramebuffer {
|
|||
}
|
||||
|
||||
pub fn create_shader_resource_view(&self) -> error::Result<ID3D11ShaderResourceView> {
|
||||
let mut srv = None;
|
||||
unsafe {
|
||||
Ok(self.device.CreateShaderResourceView(
|
||||
self.device.CreateShaderResourceView(
|
||||
&self.texture,
|
||||
Some(&D3D11_SHADER_RESOURCE_VIEW_DESC {
|
||||
Format: self.format,
|
||||
|
@ -125,13 +132,17 @@ impl OwnedFramebuffer {
|
|||
},
|
||||
},
|
||||
}),
|
||||
)?)
|
||||
Some(&mut srv),
|
||||
)?;
|
||||
}
|
||||
assume_d3d11_init!(srv, "CreateShaderResourceView");
|
||||
Ok(srv)
|
||||
}
|
||||
|
||||
pub fn create_render_target_view(&self) -> error::Result<ID3D11RenderTargetView> {
|
||||
let mut rtv = None;
|
||||
unsafe {
|
||||
Ok(self.device.CreateRenderTargetView(
|
||||
self.device.CreateRenderTargetView(
|
||||
&self.texture,
|
||||
Some(&D3D11_RENDER_TARGET_VIEW_DESC {
|
||||
Format: self.format,
|
||||
|
@ -140,8 +151,12 @@ impl OwnedFramebuffer {
|
|||
Texture2D: D3D11_TEX2D_RTV { MipSlice: 0 },
|
||||
},
|
||||
}),
|
||||
)?)
|
||||
Some(&mut rtv),
|
||||
)?
|
||||
}
|
||||
|
||||
assume_d3d11_init!(rtv, "CreateRenderTargetView");
|
||||
Ok(rtv)
|
||||
}
|
||||
|
||||
pub fn as_output_framebuffer(&self) -> error::Result<OutputFramebuffer> {
|
||||
|
@ -154,11 +169,7 @@ impl OwnedFramebuffer {
|
|||
|
||||
pub fn copy_from(&mut self, image: &D3D11InputView) -> error::Result<()> {
|
||||
let original_resource: ID3D11Texture2D = unsafe {
|
||||
let mut resource = None;
|
||||
image.handle.GetResource(&mut resource);
|
||||
let Some(resource) = resource else {
|
||||
return Ok(())
|
||||
};
|
||||
let resource = image.handle.GetResource()?;
|
||||
resource.cast()?
|
||||
};
|
||||
|
||||
|
|
|
@ -298,15 +298,22 @@ pub mod d3d11_hello_triangle {
|
|||
)
|
||||
};
|
||||
|
||||
let vs = unsafe { self.device.CreateVertexShader(vs_compiled, None) }?;
|
||||
let vs = unsafe {
|
||||
let mut vso = None;
|
||||
self.device
|
||||
.CreateVertexShader(vs_compiled, None, Some(&mut vso))?;
|
||||
vso.unwrap()
|
||||
};
|
||||
|
||||
let ps = unsafe {
|
||||
let ps = slice::from_raw_parts(
|
||||
ps_blob.GetBufferPointer().cast::<u8>(),
|
||||
ps_blob.GetBufferSize(),
|
||||
);
|
||||
self.device.CreatePixelShader(ps, None)
|
||||
}?;
|
||||
let mut pso = None;
|
||||
self.device.CreatePixelShader(ps, None, Some(&mut pso))?;
|
||||
pso.unwrap()
|
||||
};
|
||||
|
||||
let (input_layout, stencil_state, raster_state) =
|
||||
create_pipeline_state(&self.device, vs_compiled)?;
|
||||
|
@ -370,11 +377,13 @@ pub mod d3d11_hello_triangle {
|
|||
let buffer_number = 0;
|
||||
|
||||
unsafe {
|
||||
let mapped_resource = self.context.Map(
|
||||
let mut mapped_resource = Default::default();
|
||||
self.context.Map(
|
||||
&resources.triangle_uniforms,
|
||||
0,
|
||||
D3D11_MAP_WRITE_DISCARD,
|
||||
0,
|
||||
Some(&mut mapped_resource),
|
||||
)?;
|
||||
std::ptr::copy_nonoverlapping(
|
||||
&resources.triangle_uniform_values,
|
||||
|
@ -387,10 +396,10 @@ pub mod d3d11_hello_triangle {
|
|||
unsafe {
|
||||
self.context.VSSetConstantBuffers(
|
||||
buffer_number,
|
||||
Some(&[Some(resources.triangle_uniforms.clone())]),
|
||||
Some(&[resources.triangle_uniforms.clone()]),
|
||||
);
|
||||
self.context.OMSetRenderTargets(
|
||||
Some(&[Some(resources.rtv.clone())]),
|
||||
Some(&[resources.rtv.clone()]),
|
||||
&resources.depth_stencil_view,
|
||||
);
|
||||
self.context.RSSetViewports(Some(&[resources.viewport]))
|
||||
|
@ -435,18 +444,23 @@ pub mod d3d11_hello_triangle {
|
|||
unsafe {
|
||||
let mut tex2d_desc = Default::default();
|
||||
resources.backbuffer.GetDesc(&mut tex2d_desc);
|
||||
let backup = self.device.CreateTexture2D(
|
||||
let mut backup = None;
|
||||
|
||||
self.device.CreateTexture2D(
|
||||
&D3D11_TEXTURE2D_DESC {
|
||||
BindFlags: D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET,
|
||||
CPUAccessFlags: D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE,
|
||||
..tex2d_desc
|
||||
},
|
||||
None,
|
||||
Some(&mut backup),
|
||||
)?;
|
||||
let backup = backup.unwrap();
|
||||
|
||||
self.context.CopyResource(&backup, &resources.backbuffer);
|
||||
|
||||
let srv = self.device.CreateShaderResourceView(
|
||||
let mut srv = None;
|
||||
self.device.CreateShaderResourceView(
|
||||
&backup,
|
||||
Some(&D3D11_SHADER_RESOURCE_VIEW_DESC {
|
||||
Format: tex2d_desc.Format,
|
||||
|
@ -458,11 +472,17 @@ pub mod d3d11_hello_triangle {
|
|||
},
|
||||
},
|
||||
}),
|
||||
Some(&mut srv),
|
||||
)?;
|
||||
let srv = srv.unwrap();
|
||||
|
||||
let shader_out = self.device.CreateTexture2D(&tex2d_desc, None)?;
|
||||
let mut shader_out = None;
|
||||
self.device
|
||||
.CreateTexture2D(&tex2d_desc, None, Some(&mut shader_out))?;
|
||||
let shader_out = shader_out.unwrap();
|
||||
|
||||
let _rtv = self.device.CreateRenderTargetView(
|
||||
let mut rtv = None;
|
||||
self.device.CreateRenderTargetView(
|
||||
&shader_out,
|
||||
Some(&D3D11_RENDER_TARGET_VIEW_DESC {
|
||||
Format: tex2d_desc.Format,
|
||||
|
@ -471,6 +491,7 @@ pub mod d3d11_hello_triangle {
|
|||
Texture2D: D3D11_TEX2D_RTV { MipSlice: 0 },
|
||||
},
|
||||
}),
|
||||
Some(&mut rtv),
|
||||
)?;
|
||||
|
||||
// OutputFramebuffer {
|
||||
|
@ -533,9 +554,10 @@ pub mod d3d11_hello_triangle {
|
|||
) -> Result<(ID3D11RenderTargetView, ID3D11Texture2D)> {
|
||||
unsafe {
|
||||
let backbuffer: ID3D11Texture2D = swapchain.GetBuffer(0)?;
|
||||
let rtv = device.CreateRenderTargetView(&backbuffer, None)?;
|
||||
let mut rtv = None;
|
||||
device.CreateRenderTargetView(&backbuffer, None, Some(&mut rtv))?;
|
||||
|
||||
Ok((rtv, backbuffer))
|
||||
Ok((rtv.unwrap(), backbuffer))
|
||||
}
|
||||
}
|
||||
fn create_pipeline_state(
|
||||
|
@ -547,7 +569,8 @@ pub mod d3d11_hello_triangle {
|
|||
ID3D11RasterizerState,
|
||||
)> {
|
||||
unsafe {
|
||||
let input_layout = device.CreateInputLayout(
|
||||
let mut input_layout = None;
|
||||
device.CreateInputLayout(
|
||||
&[
|
||||
D3D11_INPUT_ELEMENT_DESC {
|
||||
SemanticName: s!("POSITION"),
|
||||
|
@ -569,42 +592,55 @@ pub mod d3d11_hello_triangle {
|
|||
},
|
||||
],
|
||||
vs_blob,
|
||||
Some(&mut input_layout),
|
||||
)?;
|
||||
|
||||
let stencil_state = device.CreateDepthStencilState(&D3D11_DEPTH_STENCIL_DESC {
|
||||
DepthEnable: BOOL::from(true),
|
||||
DepthWriteMask: D3D11_DEPTH_WRITE_MASK_ALL,
|
||||
DepthFunc: D3D11_COMPARISON_LESS,
|
||||
StencilEnable: BOOL::from(true),
|
||||
StencilReadMask: 0xff,
|
||||
StencilWriteMask: 0xff,
|
||||
FrontFace: D3D11_DEPTH_STENCILOP_DESC {
|
||||
StencilFailOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilDepthFailOp: D3D11_STENCIL_OP_INCR,
|
||||
StencilPassOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilFunc: D3D11_COMPARISON_ALWAYS,
|
||||
},
|
||||
BackFace: D3D11_DEPTH_STENCILOP_DESC {
|
||||
StencilFailOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilDepthFailOp: D3D11_STENCIL_OP_DECR,
|
||||
StencilPassOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilFunc: D3D11_COMPARISON_ALWAYS,
|
||||
},
|
||||
})?;
|
||||
let input_layout = input_layout.unwrap();
|
||||
|
||||
let rasterizer_state = device.CreateRasterizerState(&D3D11_RASTERIZER_DESC {
|
||||
AntialiasedLineEnable: BOOL::from(false),
|
||||
CullMode: D3D11_CULL_NONE,
|
||||
DepthBias: 0,
|
||||
DepthBiasClamp: 0.0f32,
|
||||
DepthClipEnable: BOOL::from(true),
|
||||
FillMode: D3D11_FILL_SOLID,
|
||||
FrontCounterClockwise: BOOL::from(false),
|
||||
MultisampleEnable: BOOL::from(false),
|
||||
ScissorEnable: BOOL::from(false),
|
||||
SlopeScaledDepthBias: 0.0f32,
|
||||
})?;
|
||||
let mut stencil_state = None;
|
||||
device.CreateDepthStencilState(
|
||||
&D3D11_DEPTH_STENCIL_DESC {
|
||||
DepthEnable: BOOL::from(true),
|
||||
DepthWriteMask: D3D11_DEPTH_WRITE_MASK_ALL,
|
||||
DepthFunc: D3D11_COMPARISON_LESS,
|
||||
StencilEnable: BOOL::from(true),
|
||||
StencilReadMask: 0xff,
|
||||
StencilWriteMask: 0xff,
|
||||
FrontFace: D3D11_DEPTH_STENCILOP_DESC {
|
||||
StencilFailOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilDepthFailOp: D3D11_STENCIL_OP_INCR,
|
||||
StencilPassOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilFunc: D3D11_COMPARISON_ALWAYS,
|
||||
},
|
||||
BackFace: D3D11_DEPTH_STENCILOP_DESC {
|
||||
StencilFailOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilDepthFailOp: D3D11_STENCIL_OP_DECR,
|
||||
StencilPassOp: D3D11_STENCIL_OP_KEEP,
|
||||
StencilFunc: D3D11_COMPARISON_ALWAYS,
|
||||
},
|
||||
},
|
||||
Some(&mut stencil_state),
|
||||
)?;
|
||||
let stencil_state = stencil_state.unwrap();
|
||||
|
||||
let mut rasterizer_state = None;
|
||||
device.CreateRasterizerState(
|
||||
&D3D11_RASTERIZER_DESC {
|
||||
AntialiasedLineEnable: BOOL::from(false),
|
||||
CullMode: D3D11_CULL_NONE,
|
||||
DepthBias: 0,
|
||||
DepthBiasClamp: 0.0f32,
|
||||
DepthClipEnable: BOOL::from(true),
|
||||
FillMode: D3D11_FILL_SOLID,
|
||||
FrontCounterClockwise: BOOL::from(false),
|
||||
MultisampleEnable: BOOL::from(false),
|
||||
ScissorEnable: BOOL::from(false),
|
||||
SlopeScaledDepthBias: 0.0f32,
|
||||
},
|
||||
Some(&mut rasterizer_state),
|
||||
)?;
|
||||
|
||||
let rasterizer_state = rasterizer_state.unwrap();
|
||||
Ok((input_layout, stencil_state, rasterizer_state))
|
||||
}
|
||||
}
|
||||
|
@ -613,7 +649,8 @@ pub mod d3d11_hello_triangle {
|
|||
device: &ID3D11Device,
|
||||
) -> Result<(ID3D11Texture2D, ID3D11DepthStencilView)> {
|
||||
unsafe {
|
||||
let buffer = device.CreateTexture2D(
|
||||
let mut buffer = None;
|
||||
device.CreateTexture2D(
|
||||
&D3D11_TEXTURE2D_DESC {
|
||||
Width: WIDTH as u32,
|
||||
Height: HEIGHT as u32,
|
||||
|
@ -630,9 +667,13 @@ pub mod d3d11_hello_triangle {
|
|||
MiscFlags: Default::default(),
|
||||
},
|
||||
None,
|
||||
Some(&mut buffer),
|
||||
)?;
|
||||
|
||||
let view = device.CreateDepthStencilView(
|
||||
let buffer = buffer.unwrap();
|
||||
|
||||
let mut view = None;
|
||||
device.CreateDepthStencilView(
|
||||
&buffer,
|
||||
Some(&D3D11_DEPTH_STENCIL_VIEW_DESC {
|
||||
Format: DXGI_FORMAT_D24_UNORM_S8_UINT,
|
||||
|
@ -642,13 +683,17 @@ pub mod d3d11_hello_triangle {
|
|||
},
|
||||
..Default::default()
|
||||
}),
|
||||
Some(&mut view),
|
||||
)?;
|
||||
|
||||
let view = view.unwrap();
|
||||
|
||||
Ok((buffer, view))
|
||||
}
|
||||
}
|
||||
|
||||
fn create_triangle_uniforms(device: &ID3D11Device) -> Result<ID3D11Buffer> {
|
||||
let mut buffer = None;
|
||||
unsafe {
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
|
@ -660,8 +705,10 @@ pub mod d3d11_hello_triangle {
|
|||
StructureByteStride: 0,
|
||||
},
|
||||
None,
|
||||
)
|
||||
Some(&mut buffer),
|
||||
)?;
|
||||
}
|
||||
Ok(buffer.unwrap())
|
||||
}
|
||||
|
||||
fn create_triangle_buffers(device: &ID3D11Device) -> Result<(ID3D11Buffer, ID3D11Buffer)> {
|
||||
|
@ -682,7 +729,8 @@ pub mod d3d11_hello_triangle {
|
|||
|
||||
let indices = [0, 1, 2];
|
||||
unsafe {
|
||||
let vertex_buffer = device.CreateBuffer(
|
||||
let mut vertex_buffer = None;
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
ByteWidth: (std::mem::size_of::<Vertex>() * vertices.len()) as u32,
|
||||
Usage: D3D11_USAGE_DEFAULT,
|
||||
|
@ -696,9 +744,11 @@ pub mod d3d11_hello_triangle {
|
|||
SysMemPitch: 0,
|
||||
SysMemSlicePitch: 0,
|
||||
}),
|
||||
Some(&mut vertex_buffer),
|
||||
)?;
|
||||
|
||||
let index_buffer = device.CreateBuffer(
|
||||
let mut index_buffer = None;
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
ByteWidth: (std::mem::size_of::<u32>() * indices.len()) as u32,
|
||||
Usage: D3D11_USAGE_DEFAULT,
|
||||
|
@ -712,9 +762,10 @@ pub mod d3d11_hello_triangle {
|
|||
SysMemPitch: 0,
|
||||
SysMemSlicePitch: 0,
|
||||
}),
|
||||
Some(&mut index_buffer),
|
||||
)?;
|
||||
|
||||
Ok((vertex_buffer, index_buffer))
|
||||
Ok((vertex_buffer.unwrap(), index_buffer.unwrap()))
|
||||
}
|
||||
}
|
||||
fn create_device() -> Result<(IDXGIFactory4, ID3D11Device, ID3D11DeviceContext)> {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::error;
|
||||
use crate::error::assume_d3d11_init;
|
||||
use bytemuck::offset_of;
|
||||
use windows::core::PCSTR;
|
||||
use windows::Win32::Graphics::Direct3D::D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
|
||||
|
@ -52,7 +53,8 @@ pub(crate) struct DrawQuad {
|
|||
impl DrawQuad {
|
||||
pub fn new(device: &ID3D11Device, context: &ID3D11DeviceContext) -> error::Result<DrawQuad> {
|
||||
unsafe {
|
||||
let buffer = device.CreateBuffer(
|
||||
let mut buffer = None;
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
ByteWidth: std::mem::size_of::<[D3D11Vertex; 4]>() as u32,
|
||||
Usage: D3D11_USAGE_IMMUTABLE,
|
||||
|
@ -66,7 +68,9 @@ impl DrawQuad {
|
|||
SysMemPitch: 0,
|
||||
SysMemSlicePitch: 0,
|
||||
}),
|
||||
Some(&mut buffer),
|
||||
)?;
|
||||
assume_d3d11_init!(buffer, "CreateBuffer");
|
||||
|
||||
Ok(DrawQuad {
|
||||
buffer,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::error::Result;
|
||||
use crate::error::{assume_d3d11_init, Result};
|
||||
use librashader_common::{FilterMode, WrapMode};
|
||||
use rustc_hash::FxHashMap;
|
||||
use windows::Win32::Graphics::Direct3D11::{
|
||||
|
@ -23,31 +23,42 @@ impl SamplerSet {
|
|||
];
|
||||
for wrap_mode in wrap_modes {
|
||||
unsafe {
|
||||
let linear = device.CreateSamplerState(&D3D11_SAMPLER_DESC {
|
||||
Filter: FilterMode::Linear.into(),
|
||||
AddressU: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressV: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressW: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
MipLODBias: 0.0,
|
||||
MaxAnisotropy: 1,
|
||||
ComparisonFunc: D3D11_COMPARISON_NEVER,
|
||||
BorderColor: [0.0, 0.0, 0.0, 0.0],
|
||||
MinLOD: -D3D11_FLOAT32_MAX,
|
||||
MaxLOD: D3D11_FLOAT32_MAX,
|
||||
})?;
|
||||
let mut linear = None;
|
||||
device.CreateSamplerState(
|
||||
&D3D11_SAMPLER_DESC {
|
||||
Filter: FilterMode::Linear.into(),
|
||||
AddressU: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressV: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressW: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
MipLODBias: 0.0,
|
||||
MaxAnisotropy: 1,
|
||||
ComparisonFunc: D3D11_COMPARISON_NEVER,
|
||||
BorderColor: [0.0, 0.0, 0.0, 0.0],
|
||||
MinLOD: -D3D11_FLOAT32_MAX,
|
||||
MaxLOD: D3D11_FLOAT32_MAX,
|
||||
},
|
||||
Some(&mut linear),
|
||||
)?;
|
||||
|
||||
let nearest = device.CreateSamplerState(&D3D11_SAMPLER_DESC {
|
||||
Filter: FilterMode::Nearest.into(),
|
||||
AddressU: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressV: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressW: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
MipLODBias: 0.0,
|
||||
MaxAnisotropy: 1,
|
||||
ComparisonFunc: D3D11_COMPARISON_NEVER,
|
||||
BorderColor: [0.0, 0.0, 0.0, 0.0],
|
||||
MinLOD: -D3D11_FLOAT32_MAX,
|
||||
MaxLOD: D3D11_FLOAT32_MAX,
|
||||
})?;
|
||||
assume_d3d11_init!(linear, "CreateSamplerState");
|
||||
|
||||
let mut nearest = None;
|
||||
device.CreateSamplerState(
|
||||
&D3D11_SAMPLER_DESC {
|
||||
Filter: FilterMode::Nearest.into(),
|
||||
AddressU: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressV: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
AddressW: D3D11_TEXTURE_ADDRESS_MODE::from(*wrap_mode),
|
||||
MipLODBias: 0.0,
|
||||
MaxAnisotropy: 1,
|
||||
ComparisonFunc: D3D11_COMPARISON_NEVER,
|
||||
BorderColor: [0.0, 0.0, 0.0, 0.0],
|
||||
MinLOD: -D3D11_FLOAT32_MAX,
|
||||
MaxLOD: D3D11_FLOAT32_MAX,
|
||||
},
|
||||
Some(&mut nearest),
|
||||
)?;
|
||||
assume_d3d11_init!(nearest, "CreateSamplerState");
|
||||
|
||||
samplers.insert((*wrap_mode, FilterMode::Linear), linear);
|
||||
samplers.insert((*wrap_mode, FilterMode::Nearest), nearest);
|
||||
|
|
|
@ -11,7 +11,7 @@ use windows::Win32::Graphics::Direct3D11::{
|
|||
};
|
||||
use windows::Win32::Graphics::Dxgi::Common::DXGI_SAMPLE_DESC;
|
||||
|
||||
use crate::error::Result;
|
||||
use crate::error::{assume_d3d11_init, Result};
|
||||
use crate::framebuffer::OwnedFramebuffer;
|
||||
|
||||
/// An image view for use as a shader resource.
|
||||
|
@ -131,10 +131,13 @@ impl LutTexture {
|
|||
// since we load them with the Image module.
|
||||
|
||||
unsafe {
|
||||
let handle = device.CreateTexture2D(&desc, None).unwrap();
|
||||
let mut handle = None;
|
||||
device.CreateTexture2D(&desc, None, Some(&mut handle))?;
|
||||
assume_d3d11_init!(handle, "CreateTexture2D");
|
||||
|
||||
// need a staging texture to defer mipmap generation
|
||||
let staging = device.CreateTexture2D(
|
||||
let mut staging = None;
|
||||
device.CreateTexture2D(
|
||||
&D3D11_TEXTURE2D_DESC {
|
||||
MipLevels: 1,
|
||||
BindFlags: D3D11_BIND_FLAG(0),
|
||||
|
@ -148,7 +151,9 @@ impl LutTexture {
|
|||
SysMemPitch: source.pitch as u32,
|
||||
SysMemSlicePitch: 0,
|
||||
}),
|
||||
Some(&mut staging),
|
||||
)?;
|
||||
assume_d3d11_init!(staging, "CreateTexture2D");
|
||||
|
||||
// todo: do format conversion (leverage image crate..?
|
||||
// is this necessary with CopySubresourceRegion)...
|
||||
|
@ -171,7 +176,8 @@ impl LutTexture {
|
|||
}),
|
||||
);
|
||||
|
||||
let srv = device.CreateShaderResourceView(
|
||||
let mut srv = None;
|
||||
device.CreateShaderResourceView(
|
||||
&handle,
|
||||
Some(&D3D11_SHADER_RESOURCE_VIEW_DESC {
|
||||
Format: desc.Format,
|
||||
|
@ -183,7 +189,9 @@ impl LutTexture {
|
|||
},
|
||||
},
|
||||
}),
|
||||
Some(&mut srv),
|
||||
)?;
|
||||
assume_d3d11_init!(srv, "CreateShaderResourceView");
|
||||
|
||||
if (desc.MiscFlags & D3D11_RESOURCE_MISC_GENERATE_MIPS).0 != 0 {
|
||||
context.GenerateMips(&srv)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::error;
|
||||
use crate::error::assume_d3d11_init;
|
||||
use std::slice;
|
||||
use windows::core::PCSTR;
|
||||
use windows::Win32::Graphics::Direct3D::Fxc::{
|
||||
|
@ -129,8 +130,12 @@ pub fn d3d_compile_shader(source: &[u8], entry: &[u8], version: &[u8]) -> error:
|
|||
}
|
||||
}
|
||||
|
||||
pub type ShaderFactory<'a, L, T> =
|
||||
unsafe fn(&'a ID3D11Device, &[u8], linkage: L) -> windows::core::Result<T>;
|
||||
pub type ShaderFactory<'a, L, T> = unsafe fn(
|
||||
&'a ID3D11Device,
|
||||
&[u8],
|
||||
linkage: L,
|
||||
Option<*mut Option<T>>,
|
||||
) -> windows::core::Result<()>;
|
||||
|
||||
pub fn d3d11_compile_bound_shader<'a, T, L>(
|
||||
device: &'a ID3D11Device,
|
||||
|
@ -139,14 +144,16 @@ pub fn d3d11_compile_bound_shader<'a, T, L>(
|
|||
factory: ShaderFactory<'a, L, T>,
|
||||
) -> error::Result<T>
|
||||
where
|
||||
L: Into<windows::core::InParam<'a, ID3D11ClassLinkage>>,
|
||||
L: Into<windows::core::InParam<ID3D11ClassLinkage>>,
|
||||
{
|
||||
unsafe {
|
||||
// SAFETY: slice as valid for as long as vs_blob is alive.
|
||||
let dxil =
|
||||
slice::from_raw_parts(blob.GetBufferPointer().cast::<u8>(), blob.GetBufferSize());
|
||||
|
||||
let compiled = factory(device, dxil, linkage)?;
|
||||
let mut compiled = None;
|
||||
factory(device, dxil, linkage, Some(&mut compiled))?;
|
||||
assume_d3d11_init!(compiled, "CreateXXShader");
|
||||
Ok(compiled)
|
||||
}
|
||||
}
|
||||
|
@ -160,8 +167,9 @@ pub fn d3d11_create_input_layout(
|
|||
// SAFETY: slice as valid for as long as vs_blob is alive.
|
||||
let dxil =
|
||||
slice::from_raw_parts(blob.GetBufferPointer().cast::<u8>(), blob.GetBufferSize());
|
||||
|
||||
let compiled = device.CreateInputLayout(desc, dxil)?;
|
||||
Ok(compiled)
|
||||
let mut input_layout = None;
|
||||
device.CreateInputLayout(desc, dxil, Some(&mut input_layout))?;
|
||||
assume_d3d11_init!(input_layout, "CreateInputLayout");
|
||||
Ok(input_layout)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ librashader-runtime-vk = { path = "../librashader-runtime-vk", version = "0.1.0-
|
|||
ash = { version = "0.37.1+1.3.235", optional = true }
|
||||
|
||||
[dependencies.windows]
|
||||
version = "0.43.0"
|
||||
version = "0.44.0"
|
||||
features = [
|
||||
"Win32_Graphics_Direct3D11",
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue