dx12: render identity MVP in intermediate passes

This commit is contained in:
chyyran 2023-02-05 23:26:14 -05:00
parent 99954f011f
commit d4525ee23e
2 changed files with 60 additions and 14 deletions

View file

@ -24,7 +24,7 @@ use librashader_reflect::reflect::semantics::{BindingMeta, ShaderSemantics, MAX_
use librashader_reflect::reflect::ReflectShader; use librashader_reflect::reflect::ReflectShader;
use librashader_runtime::binding::{BindingUtil, TextureInput}; use librashader_runtime::binding::{BindingUtil, TextureInput};
use librashader_runtime::image::{Image, UVDirection}; use librashader_runtime::image::{Image, UVDirection};
use librashader_runtime::quad::{QuadType, DEFAULT_MVP}; use librashader_runtime::quad::{QuadType, DEFAULT_MVP, IDENTITY_MVP};
use librashader_runtime::uniforms::UniformStorage; use librashader_runtime::uniforms::UniformStorage;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use spirv_cross::hlsl::ShaderModel; use spirv_cross::hlsl::ShaderModel;
@ -639,7 +639,7 @@ impl FilterChainD3D12 {
let out = RenderTarget { let out = RenderTarget {
x: 0.0, x: 0.0,
y: 0.0, y: 0.0,
mvp: DEFAULT_MVP, mvp: IDENTITY_MVP,
output: OutputTexture { output: OutputTexture {
descriptor: view.descriptor, descriptor: view.descriptor,
size, size,

View file

@ -20,7 +20,30 @@ struct D3D12Vertex {
const CLEAR: [f32; 4] = [1.0, 1.0, 1.0, 1.0]; const CLEAR: [f32; 4] = [1.0, 1.0, 1.0, 1.0];
static QUAD_VBO_DATA: &[D3D12Vertex; 4] = &[ static OFFSCREEN_VBO_DATA: &[D3D12Vertex; 4] = &[
D3D12Vertex {
position: [-1.0, -1.0],
texcoord: [0.0, 1.0],
color: CLEAR,
},
D3D12Vertex {
position: [-1.0, 1.0],
texcoord: [0.0, 0.0],
color: CLEAR,
},
D3D12Vertex {
position: [1.0, -1.0],
texcoord: [1.0, 1.0],
color: CLEAR,
},
D3D12Vertex {
position: [1.0, 1.0],
texcoord: [1.0, 0.0],
color: CLEAR,
},
];
static FINAL_VBO_DATA: &[D3D12Vertex; 4] = &[
D3D12Vertex { D3D12Vertex {
position: [0.0, 0.0], position: [0.0, 0.0],
texcoord: [0.0, 1.0], texcoord: [0.0, 1.0],
@ -44,34 +67,57 @@ static QUAD_VBO_DATA: &[D3D12Vertex; 4] = &[
]; ];
pub(crate) struct DrawQuad { pub(crate) struct DrawQuad {
buffer: ID3D12Resource, offscreen_buffer: ID3D12Resource,
view: D3D12_VERTEX_BUFFER_VIEW, offscreen_view: D3D12_VERTEX_BUFFER_VIEW,
final_buffer: ID3D12Resource,
final_view: D3D12_VERTEX_BUFFER_VIEW,
} }
impl DrawQuad { impl DrawQuad {
pub fn new(device: &ID3D12Device) -> error::Result<DrawQuad> { pub fn new(device: &ID3D12Device) -> error::Result<DrawQuad> {
let stride = std::mem::size_of::<D3D12Vertex>() as u32; let stride = std::mem::size_of::<D3D12Vertex>() as u32;
let size = std::mem::size_of::<[D3D12Vertex; 4]>() as u32; let size = std::mem::size_of::<[D3D12Vertex; 4]>() as u32;
let mut buffer = D3D12Buffer::new(device, size as usize)?; let mut offscreen_buffer = D3D12Buffer::new(device, size as usize)?;
buffer offscreen_buffer
.map(None)? .map(None)?
.slice .slice
.copy_from_slice(bytemuck::cast_slice(QUAD_VBO_DATA)); .copy_from_slice(bytemuck::cast_slice(OFFSCREEN_VBO_DATA));
let view = D3D12_VERTEX_BUFFER_VIEW { let offscreen_view = D3D12_VERTEX_BUFFER_VIEW {
BufferLocation: buffer.gpu_address(), BufferLocation: offscreen_buffer.gpu_address(),
SizeInBytes: size, SizeInBytes: size,
StrideInBytes: stride, StrideInBytes: stride,
}; };
let buffer = buffer.into_raw(); let offscreen_buffer = offscreen_buffer.into_raw();
Ok(DrawQuad { buffer, view })
let mut final_buffer = D3D12Buffer::new(device, size as usize)?;
final_buffer
.map(None)?
.slice
.copy_from_slice(bytemuck::cast_slice(FINAL_VBO_DATA));
let final_view = D3D12_VERTEX_BUFFER_VIEW {
BufferLocation: final_buffer.gpu_address(),
SizeInBytes: size,
StrideInBytes: stride,
};
let final_buffer = final_buffer.into_raw();
Ok(DrawQuad { offscreen_buffer, offscreen_view, final_buffer, final_view })
} }
pub fn bind_vertices(&self, cmd: &ID3D12GraphicsCommandList, _vbo_type: QuadType) { pub fn bind_vertices(&self, cmd: &ID3D12GraphicsCommandList, vbo_type: QuadType) {
unsafe { unsafe {
cmd.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); cmd.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
cmd.IASetVertexBuffers(0, Some(&[self.view]));
let view = match vbo_type {
QuadType::Offscreen => [self.offscreen_view],
QuadType::Final => [self.final_view],
};
cmd.IASetVertexBuffers(0, Some(&view));
} }
} }