use windows::Win32::Foundation::RECT;
use windows::Win32::Graphics::Direct3D12::*;
use crate::directx::context::DxContext;
use crate::directx::texture::transition_barrier;
impl DxContext {
pub(in crate::directx) fn begin_fullscreen_rt(
&self,
cmd: &ID3D12GraphicsCommandList,
output: &ID3D12Resource,
output_rtv: D3D12_CPU_DESCRIPTOR_HANDLE,
) {
let to_rt = transition_barrier(
output,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
D3D12_RESOURCE_STATE_RENDER_TARGET,
);
unsafe { cmd.ResourceBarrier(&[to_rt]) };
self.bind_fullscreen_rt(cmd, output, output_rtv);
}
pub(in crate::directx) fn bind_fullscreen_rt(
&self,
cmd: &ID3D12GraphicsCommandList,
output: &ID3D12Resource,
output_rtv: D3D12_CPU_DESCRIPTOR_HANDLE,
) {
let desc = unsafe { output.GetDesc() };
let w = desc.Width as u32;
let h = desc.Height;
unsafe {
cmd.OMSetRenderTargets(1, Some(&output_rtv), false, None);
let vp = D3D12_VIEWPORT {
TopLeftX: 0.0,
TopLeftY: 0.0,
Width: w as f32,
Height: h as f32,
MinDepth: 0.0,
MaxDepth: 1.0,
};
cmd.RSSetViewports(&[vp]);
let scissor = RECT {
left: 0,
top: 0,
right: w as i32,
bottom: h as i32,
};
cmd.RSSetScissorRects(&[scissor]);
cmd.SetDescriptorHeaps(&[Some(self.descriptors.srv_heap.clone())]);
}
}
pub(in crate::directx) fn end_fullscreen_rt(
&self,
cmd: &ID3D12GraphicsCommandList,
output: &ID3D12Resource,
) {
let to_psr = transition_barrier(
output,
D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
);
unsafe { cmd.ResourceBarrier(&[to_psr]) };
}
}