rt: unify drawquad type
This commit is contained in:
parent
95ac8adc20
commit
c7d1d347a4
15 changed files with 147 additions and 181 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1591,6 +1591,7 @@ dependencies = [
|
|||
name = "librashader-runtime"
|
||||
version = "0.2.2"
|
||||
dependencies = [
|
||||
"array-concat",
|
||||
"bytemuck",
|
||||
"image",
|
||||
"librashader-common",
|
||||
|
|
|
@ -2,7 +2,7 @@ use crate::error;
|
|||
use crate::error::assume_d3d11_init;
|
||||
use array_concat::concat_arrays;
|
||||
use bytemuck::offset_of;
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use windows::core::PCSTR;
|
||||
use windows::Win32::Graphics::Direct3D::D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
|
||||
use windows::Win32::Graphics::Direct3D11::{
|
||||
|
@ -12,52 +12,45 @@ use windows::Win32::Graphics::Direct3D11::{
|
|||
};
|
||||
use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_R32G32_FLOAT;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default)]
|
||||
struct D3D11Vertex {
|
||||
position: [f32; 2],
|
||||
texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
const OFFSCREEN_VBO_DATA: [D3D11Vertex; 4] = [
|
||||
D3D11Vertex {
|
||||
position: [-1.0, -1.0],
|
||||
const OFFSCREEN_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [-1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [1.0, -1.0],
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
const FINAL_VBO_DATA: [D3D11Vertex; 4] = [
|
||||
D3D11Vertex {
|
||||
position: [0.0, 0.0],
|
||||
const FINAL_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [0.0, 1.0],
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [1.0, 0.0],
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
D3D11Vertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
static VBO_DATA: &[D3D11Vertex; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
static VBO_DATA: &[VertexInput; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
|
||||
pub(crate) struct DrawQuad {
|
||||
stride: u32,
|
||||
|
@ -70,7 +63,7 @@ impl DrawQuad {
|
|||
let mut vbo = None;
|
||||
device.CreateBuffer(
|
||||
&D3D11_BUFFER_DESC {
|
||||
ByteWidth: 2 * std::mem::size_of::<[D3D11Vertex; 4]>() as u32,
|
||||
ByteWidth: 2 * std::mem::size_of::<[VertexInput; 4]>() as u32,
|
||||
Usage: D3D11_USAGE_IMMUTABLE,
|
||||
BindFlags: D3D11_BIND_VERTEX_BUFFER,
|
||||
CPUAccessFlags: Default::default(),
|
||||
|
@ -88,7 +81,7 @@ impl DrawQuad {
|
|||
|
||||
Ok(DrawQuad {
|
||||
vbo,
|
||||
stride: std::mem::size_of::<D3D11Vertex>() as u32,
|
||||
stride: std::mem::size_of::<VertexInput>() as u32,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -125,7 +118,7 @@ impl DrawQuad {
|
|||
SemanticIndex: 0,
|
||||
Format: DXGI_FORMAT_R32G32_FLOAT,
|
||||
InputSlot: 0,
|
||||
AlignedByteOffset: offset_of!(D3D11Vertex, position) as u32,
|
||||
AlignedByteOffset: offset_of!(VertexInput, position) as u32,
|
||||
InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA,
|
||||
InstanceDataStepRate: 0,
|
||||
},
|
||||
|
@ -134,7 +127,7 @@ impl DrawQuad {
|
|||
SemanticIndex: 1,
|
||||
Format: DXGI_FORMAT_R32G32_FLOAT,
|
||||
InputSlot: 0,
|
||||
AlignedByteOffset: offset_of!(D3D11Vertex, texcoord) as u32,
|
||||
AlignedByteOffset: offset_of!(VertexInput, texcoord) as u32,
|
||||
InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA,
|
||||
InstanceDataStepRate: 0,
|
||||
},
|
||||
|
|
|
@ -12,13 +12,13 @@ use librashader_runtime_d3d11::options::FilterChainOptionsD3D11;
|
|||
// const FILTER_PATH: &str =
|
||||
// "../test/Mega_Bezel_Packs/Duimon-Mega-Bezel/Presets/Advanced/Nintendo_GBA_SP/GBA_SP-[ADV]-[LCD-GRID].slangp";
|
||||
|
||||
// const FILTER_PATH: &str =
|
||||
// "../test/shaders_slang/bezel/Mega_Bezel/Presets/MBZ__0__SMOOTH-ADV.slangp";
|
||||
const FILTER_PATH: &str =
|
||||
"../test/shaders_slang/bezel/Mega_Bezel/Presets/MBZ__0__SMOOTH-ADV.slangp";
|
||||
|
||||
// const FILTER_PATH: &str = "../test/slang-shaders/test/history.slangp";
|
||||
// const FILTER_PATH: &str = "../test/slang-shaders/test/feedback.slangp";
|
||||
|
||||
const FILTER_PATH: &str = "../test/shaders_slang/crt/crt-royale.slangp";
|
||||
// const FILTER_PATH: &str = "../test/shaders_slang/crt/crt-royale.slangp";
|
||||
const IMAGE_PATH: &str = "../triangle.png";
|
||||
#[test]
|
||||
fn triangle_d3d11_args() {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use crate::buffer::D3D12Buffer;
|
||||
use crate::error;
|
||||
use array_concat::concat_arrays;
|
||||
use bytemuck::{offset_of, Pod, Zeroable};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use bytemuck::offset_of;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use windows::core::PCSTR;
|
||||
use windows::Win32::Graphics::Direct3D::D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
|
||||
use windows::Win32::Graphics::Direct3D12::{
|
||||
|
@ -11,52 +11,45 @@ use windows::Win32::Graphics::Direct3D12::{
|
|||
};
|
||||
use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_R32G32_FLOAT;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
struct D3D12Vertex {
|
||||
position: [f32; 2],
|
||||
texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
const OFFSCREEN_VBO_DATA: [D3D12Vertex; 4] = [
|
||||
D3D12Vertex {
|
||||
position: [-1.0, -1.0],
|
||||
const OFFSCREEN_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [-1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [1.0, -1.0],
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
const FINAL_VBO_DATA: [D3D12Vertex; 4] = [
|
||||
D3D12Vertex {
|
||||
position: [0.0, 0.0],
|
||||
const FINAL_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [0.0, 1.0],
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [1.0, 0.0],
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
D3D12Vertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
static VBO_DATA: &[D3D12Vertex; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
static VBO_DATA: &[VertexInput; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
|
||||
pub(crate) struct DrawQuad {
|
||||
_buffer: ID3D12Resource,
|
||||
|
@ -65,8 +58,8 @@ pub(crate) struct DrawQuad {
|
|||
|
||||
impl DrawQuad {
|
||||
pub fn new(device: &ID3D12Device) -> error::Result<DrawQuad> {
|
||||
let stride = std::mem::size_of::<D3D12Vertex>() as u32;
|
||||
let size = 2 * std::mem::size_of::<[D3D12Vertex; 4]>() as u32;
|
||||
let stride = std::mem::size_of::<VertexInput>() as u32;
|
||||
let size = 2 * std::mem::size_of::<[VertexInput; 4]>() as u32;
|
||||
let mut buffer = D3D12Buffer::new(device, size as usize)?;
|
||||
buffer
|
||||
.map(None)?
|
||||
|
@ -110,7 +103,7 @@ impl DrawQuad {
|
|||
SemanticIndex: 0,
|
||||
Format: DXGI_FORMAT_R32G32_FLOAT,
|
||||
InputSlot: 0,
|
||||
AlignedByteOffset: offset_of!(D3D12Vertex, position) as u32,
|
||||
AlignedByteOffset: offset_of!(VertexInput, position) as u32,
|
||||
InputSlotClass: D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,
|
||||
InstanceDataStepRate: 0,
|
||||
},
|
||||
|
@ -119,7 +112,7 @@ impl DrawQuad {
|
|||
SemanticIndex: 1,
|
||||
Format: DXGI_FORMAT_R32G32_FLOAT,
|
||||
InputSlot: 0,
|
||||
AlignedByteOffset: offset_of!(D3D12Vertex, texcoord) as u32,
|
||||
AlignedByteOffset: offset_of!(VertexInput, texcoord) as u32,
|
||||
InputSlotClass: D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,
|
||||
InstanceDataStepRate: 0,
|
||||
},
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use crate::gl::{DrawQuad, OpenGLVertex};
|
||||
use crate::gl::DrawQuad;
|
||||
use crate::gl::{FINAL_VBO_DATA, OFFSCREEN_VBO_DATA};
|
||||
use bytemuck::offset_of;
|
||||
use gl::types::{GLsizei, GLsizeiptr, GLuint};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
pub struct Gl3DrawQuad {
|
||||
vbo: [GLuint; 2],
|
||||
vao: GLuint,
|
||||
|
@ -59,16 +59,16 @@ impl DrawQuad for Gl3DrawQuad {
|
|||
4,
|
||||
gl::FLOAT,
|
||||
gl::FALSE,
|
||||
std::mem::size_of::<OpenGLVertex>() as GLsizei,
|
||||
sptr::invalid(offset_of!(OpenGLVertex, position)),
|
||||
std::mem::size_of::<VertexInput>() as GLsizei,
|
||||
sptr::invalid(offset_of!(VertexInput, position)),
|
||||
);
|
||||
gl::VertexAttribPointer(
|
||||
1,
|
||||
2,
|
||||
gl::FLOAT,
|
||||
gl::FALSE,
|
||||
std::mem::size_of::<OpenGLVertex>() as GLsizei,
|
||||
sptr::invalid(offset_of!(OpenGLVertex, texcoord)),
|
||||
std::mem::size_of::<VertexInput>() as GLsizei,
|
||||
sptr::invalid(offset_of!(VertexInput, texcoord)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use crate::gl::{DrawQuad, OpenGLVertex};
|
||||
use crate::gl::DrawQuad;
|
||||
use crate::gl::{FINAL_VBO_DATA, OFFSCREEN_VBO_DATA};
|
||||
use bytemuck::offset_of;
|
||||
use gl::types::{GLint, GLsizeiptr, GLuint};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
|
||||
pub struct Gl46DrawQuad {
|
||||
vbo: [GLuint; 2],
|
||||
|
@ -41,7 +41,7 @@ impl DrawQuad for Gl46DrawQuad {
|
|||
4,
|
||||
gl::FLOAT,
|
||||
gl::FALSE,
|
||||
offset_of!(OpenGLVertex, position) as GLuint,
|
||||
offset_of!(VertexInput, position) as GLuint,
|
||||
);
|
||||
gl::VertexArrayAttribFormat(
|
||||
vao,
|
||||
|
@ -49,7 +49,7 @@ impl DrawQuad for Gl46DrawQuad {
|
|||
2,
|
||||
gl::FLOAT,
|
||||
gl::FALSE,
|
||||
offset_of!(OpenGLVertex, texcoord) as GLuint,
|
||||
offset_of!(VertexInput, texcoord) as GLuint,
|
||||
);
|
||||
|
||||
gl::VertexArrayAttribBinding(vao, 0, 0);
|
||||
|
@ -71,7 +71,7 @@ impl DrawQuad for Gl46DrawQuad {
|
|||
0,
|
||||
self.vbo[buffer_index],
|
||||
0,
|
||||
std::mem::size_of::<OpenGLVertex>() as GLint,
|
||||
std::mem::size_of::<VertexInput>() as GLint,
|
||||
);
|
||||
|
||||
gl::BindVertexArray(self.vao);
|
||||
|
|
|
@ -7,7 +7,6 @@ use crate::error::Result;
|
|||
use crate::framebuffer::GLImage;
|
||||
use crate::samplers::SamplerSet;
|
||||
use crate::texture::InputTexture;
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
pub use framebuffer::GLFramebuffer;
|
||||
use gl::types::{GLenum, GLuint};
|
||||
use librashader_common::map::FastHashMap;
|
||||
|
@ -16,50 +15,42 @@ use librashader_presets::{Scale2D, TextureConfig};
|
|||
use librashader_reflect::back::glsl::CrossGlslContext;
|
||||
use librashader_reflect::back::ShaderCompilerOutput;
|
||||
use librashader_reflect::reflect::semantics::{BufferReflection, TextureBinding};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use librashader_runtime::uniforms::UniformStorageAccess;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
|
||||
pub(crate) struct OpenGLVertex {
|
||||
pub position: [f32; 4],
|
||||
pub texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
static OFFSCREEN_VBO_DATA: &[OpenGLVertex; 4] = &[
|
||||
OpenGLVertex {
|
||||
static OFFSCREEN_VBO_DATA: &[VertexInput; 4] = &[
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
];
|
||||
|
||||
static FINAL_VBO_DATA: &[OpenGLVertex; 4] = &[
|
||||
OpenGLVertex {
|
||||
static FINAL_VBO_DATA: &[VertexInput; 4] = &[
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
OpenGLVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
use array_concat::concat_arrays;
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
use icrate::Metal::{
|
||||
MTLBuffer, MTLDevice, MTLPrimitiveTypeTriangleStrip, MTLRenderCommandEncoder,
|
||||
MTLResourceStorageModeManaged, MTLResourceStorageModeShared,
|
||||
};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use objc2::rc::Id;
|
||||
use objc2::runtime::ProtocolObject;
|
||||
use std::ffi::c_void;
|
||||
|
@ -13,52 +12,45 @@ use std::ptr::NonNull;
|
|||
use crate::error::{FilterChainError, Result};
|
||||
use crate::graphics_pipeline::VERTEX_BUFFER_INDEX;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
pub(crate) struct MetalVertex {
|
||||
pub position: [f32; 4],
|
||||
pub texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
const OFFSCREEN_VBO_DATA: [MetalVertex; 4] = [
|
||||
MetalVertex {
|
||||
const OFFSCREEN_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
const FINAL_VBO_DATA: [MetalVertex; 4] = [
|
||||
MetalVertex {
|
||||
const FINAL_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
MetalVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
];
|
||||
|
||||
const VBO_DATA: [MetalVertex; 8] = concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
const VBO_DATA: [VertexInput; 8] = concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
|
||||
pub struct DrawQuad {
|
||||
buffer: Id<ProtocolObject<dyn MTLBuffer>>,
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use crate::draw_quad::MetalVertex;
|
||||
use crate::error::{FilterChainError, Result};
|
||||
use crate::select_optimal_pixel_format;
|
||||
use bytemuck::offset_of;
|
||||
|
@ -14,7 +13,9 @@ use icrate::Metal::{
|
|||
};
|
||||
use librashader_reflect::back::msl::{CrossMslContext, NagaMslContext};
|
||||
use librashader_reflect::back::ShaderCompilerOutput;
|
||||
use librashader_runtime::quad::VertexInput;
|
||||
use librashader_runtime::render_target::RenderTarget;
|
||||
|
||||
use objc2::rc::Id;
|
||||
use objc2::runtime::ProtocolObject;
|
||||
|
||||
|
@ -90,18 +91,18 @@ impl PipelineLayoutObjects {
|
|||
// hopefully metal fills in vertices otherwise we'll need to use the vec4 stuff.
|
||||
position.setFormat(MTLVertexFormatFloat4);
|
||||
position.setBufferIndex(VERTEX_BUFFER_INDEX);
|
||||
position.setOffset(offset_of!(MetalVertex, position));
|
||||
position.setOffset(offset_of!(VertexInput, position));
|
||||
|
||||
texcoord.setFormat(MTLVertexFormatFloat2);
|
||||
texcoord.setBufferIndex(VERTEX_BUFFER_INDEX);
|
||||
texcoord.setOffset(offset_of!(MetalVertex, texcoord));
|
||||
texcoord.setOffset(offset_of!(VertexInput, texcoord));
|
||||
|
||||
attributes.setObject_atIndexedSubscript(Some(&position), 0);
|
||||
|
||||
attributes.setObject_atIndexedSubscript(Some(&texcoord), 1);
|
||||
|
||||
binding.setStepFunction(MTLVertexStepFunctionPerVertex);
|
||||
binding.setStride(std::mem::size_of::<MetalVertex>());
|
||||
binding.setStride(std::mem::size_of::<VertexInput>());
|
||||
layouts.setObject_atIndexedSubscript(Some(&binding), VERTEX_BUFFER_INDEX);
|
||||
|
||||
descriptor
|
||||
|
|
|
@ -2,59 +2,50 @@ use crate::error;
|
|||
use crate::memory::VulkanBuffer;
|
||||
use array_concat::concat_arrays;
|
||||
use ash::vk;
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
use gpu_allocator::vulkan::Allocator;
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use parking_lot::RwLock;
|
||||
use std::sync::Arc;
|
||||
|
||||
// Vulkan does vertex expansion
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
struct VulkanVertex {
|
||||
position: [f32; 2],
|
||||
texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
const OFFSCREEN_VBO_DATA: [VulkanVertex; 4] = [
|
||||
VulkanVertex {
|
||||
position: [-1.0, -1.0],
|
||||
const OFFSCREEN_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [-1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [1.0, -1.0],
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
];
|
||||
|
||||
const FINAL_VBO_DATA: [VulkanVertex; 4] = [
|
||||
VulkanVertex {
|
||||
position: [0.0, 0.0],
|
||||
const FINAL_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [0.0, 1.0],
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [1.0, 0.0],
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
VulkanVertex {
|
||||
position: [1.0, 1.0],
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
];
|
||||
|
||||
static VBO_DATA: &[VulkanVertex; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
static VBO_DATA: &[VertexInput; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
|
||||
pub struct DrawQuad {
|
||||
buffer: VulkanBuffer,
|
||||
|
@ -70,7 +61,7 @@ impl DrawQuad {
|
|||
device,
|
||||
allocator,
|
||||
vk::BufferUsageFlags::VERTEX_BUFFER,
|
||||
std::mem::size_of::<[VulkanVertex; 8]>(),
|
||||
std::mem::size_of::<[VertexInput; 8]>(),
|
||||
)?;
|
||||
|
||||
{
|
||||
|
|
|
@ -5,14 +5,15 @@ use crate::error::FilterChainError;
|
|||
use crate::framebuffer::OutputImage;
|
||||
use crate::render_pass::VulkanRenderPass;
|
||||
use ash::vk::PushConstantRange;
|
||||
use bytemuck::offset_of;
|
||||
use librashader_cache::cache_pipeline;
|
||||
use librashader_reflect::back::ShaderCompilerOutput;
|
||||
use librashader_reflect::reflect::semantics::{BufferReflection, TextureBinding};
|
||||
use librashader_reflect::reflect::ShaderReflection;
|
||||
use librashader_runtime::quad::VertexInput;
|
||||
use librashader_runtime::render_target::RenderTarget;
|
||||
use std::ffi::CStr;
|
||||
use std::sync::Arc;
|
||||
|
||||
const ENTRY_POINT: &CStr = unsafe { CStr::from_bytes_with_nul_unchecked(b"main\0") };
|
||||
|
||||
pub struct PipelineDescriptors {
|
||||
|
@ -201,19 +202,19 @@ impl VulkanGraphicsPipeline {
|
|||
location: 0,
|
||||
binding: 0,
|
||||
format: vk::Format::R32G32_SFLOAT,
|
||||
offset: 0,
|
||||
offset: offset_of!(VertexInput, position) as u32,
|
||||
},
|
||||
vk::VertexInputAttributeDescription {
|
||||
location: 1,
|
||||
binding: 0,
|
||||
format: vk::Format::R32G32_SFLOAT,
|
||||
offset: (2 * std::mem::size_of::<f32>()) as u32,
|
||||
offset: offset_of!(VertexInput, texcoord) as u32,
|
||||
},
|
||||
];
|
||||
|
||||
let input_binding = vk::VertexInputBindingDescription::builder()
|
||||
.binding(0)
|
||||
.stride(4 * std::mem::size_of::<f32>() as u32)
|
||||
.stride(std::mem::size_of::<VertexInput>() as u32)
|
||||
.input_rate(vk::VertexInputRate::VERTEX);
|
||||
|
||||
let input_binding = [*input_binding];
|
||||
|
|
|
@ -1,57 +1,47 @@
|
|||
use array_concat::concat_arrays;
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
use librashader_runtime::quad::QuadType;
|
||||
use librashader_runtime::quad::{QuadType, VertexInput};
|
||||
use wgpu::util::{BufferInitDescriptor, DeviceExt};
|
||||
use wgpu::{Buffer, Device, RenderPass};
|
||||
|
||||
// As per https://www.w3.org/TR/webgpu/#vertex-processing,
|
||||
// WGPU does vertex expansion
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
pub struct WgpuVertex {
|
||||
pub position: [f32; 4],
|
||||
pub texcoord: [f32; 2],
|
||||
}
|
||||
|
||||
const OFFSCREEN_VBO_DATA: [WgpuVertex; 4] = [
|
||||
WgpuVertex {
|
||||
const OFFSCREEN_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [-1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [-1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [1.0, -1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
];
|
||||
|
||||
const FINAL_VBO_DATA: [WgpuVertex; 4] = [
|
||||
WgpuVertex {
|
||||
const FINAL_VBO_DATA: [VertexInput; 4] = [
|
||||
VertexInput {
|
||||
position: [0.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 0.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [0.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [0.0, 1.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 0.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 0.0],
|
||||
},
|
||||
WgpuVertex {
|
||||
VertexInput {
|
||||
position: [1.0, 1.0, 0.0, 1.0],
|
||||
texcoord: [1.0, 1.0],
|
||||
},
|
||||
];
|
||||
|
||||
static VBO_DATA: &[WgpuVertex; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
static VBO_DATA: &[VertexInput; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
||||
|
||||
pub struct DrawQuad {
|
||||
buffer: Buffer,
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
use crate::draw_quad::WgpuVertex;
|
||||
use crate::framebuffer::WgpuOutputView;
|
||||
use crate::util;
|
||||
use librashader_reflect::back::wgsl::NagaWgslContext;
|
||||
use librashader_reflect::back::ShaderCompilerOutput;
|
||||
use librashader_reflect::reflect::ShaderReflection;
|
||||
use librashader_runtime::render_target::RenderTarget;
|
||||
use librashader_runtime::quad::VertexInput;
|
||||
use std::borrow::Cow;
|
||||
use std::sync::Arc;
|
||||
use wgpu::{
|
||||
|
@ -153,18 +153,18 @@ impl PipelineLayoutObjects {
|
|||
module: &self.vertex,
|
||||
entry_point: &self.vertex_entry_name,
|
||||
buffers: &[VertexBufferLayout {
|
||||
array_stride: std::mem::size_of::<WgpuVertex>() as wgpu::BufferAddress,
|
||||
array_stride: std::mem::size_of::<VertexInput>() as wgpu::BufferAddress,
|
||||
step_mode: wgpu::VertexStepMode::Vertex,
|
||||
attributes: &[
|
||||
wgpu::VertexAttribute {
|
||||
format: wgpu::VertexFormat::Float32x4,
|
||||
offset: bytemuck::offset_of!(WgpuVertex, position)
|
||||
offset: bytemuck::offset_of!(VertexInput, position)
|
||||
as wgpu::BufferAddress,
|
||||
shader_location: 0,
|
||||
},
|
||||
wgpu::VertexAttribute {
|
||||
format: wgpu::VertexFormat::Float32x2,
|
||||
offset: bytemuck::offset_of!(WgpuVertex, texcoord)
|
||||
offset: bytemuck::offset_of!(VertexInput, texcoord)
|
||||
as wgpu::BufferAddress,
|
||||
shader_location: 1,
|
||||
},
|
||||
|
|
|
@ -18,6 +18,7 @@ librashader-preprocess = { path = "../librashader-preprocess", version = "0.2.2"
|
|||
librashader-reflect = { path = "../librashader-reflect", version = "0.2.2" }
|
||||
bytemuck = "1.12.3"
|
||||
num-traits = "0.2.15"
|
||||
array-concat = "0.5.2"
|
||||
|
||||
tinymap = "0.4.0"
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use bytemuck::{Pod, Zeroable};
|
||||
|
||||
/// Different type of quad to render to depending on pass type
|
||||
pub enum QuadType {
|
||||
/// Offscreen, intermediate passes.
|
||||
|
@ -23,3 +25,13 @@ pub static DEFAULT_MVP: &[f32; 16] = &[
|
|||
0.0, 0.0, 0.0, 0.0,
|
||||
-1.0, -1.0, 0.0, 1.0,
|
||||
];
|
||||
|
||||
/// The vertex inputs to a slang shader
|
||||
///
|
||||
/// See [IO interface variables](https://github.com/libretro/slang-shaders?tab=readme-ov-file#io-interface-variables)
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
||||
pub struct VertexInput {
|
||||
pub position: [f32; 4], // vec4 position
|
||||
pub texcoord: [f32; 2], // vec2 texcoord;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue