aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/graphics_pipeline/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipeline/graphics_pipeline/tests.rs')
-rw-r--r--src/pipeline/graphics_pipeline/tests.rs395
1 files changed, 395 insertions, 0 deletions
diff --git a/src/pipeline/graphics_pipeline/tests.rs b/src/pipeline/graphics_pipeline/tests.rs
new file mode 100644
index 0000000..53ef2eb
--- /dev/null
+++ b/src/pipeline/graphics_pipeline/tests.rs
@@ -0,0 +1,395 @@
+// Copyright (c) 2016 The vulkano developers
+// Licensed under the Apache License, Version 2.0
+// <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
+// license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
+// at your option. All files in the project carrying such
+// notice may not be copied, modified, or distributed except
+// according to those terms.
+
+//! This module contains the unit tests of `GraphicsPipeline`.
+
+#![cfg(test)]
+
+use format::Format;
+use framebuffer::Subpass;
+use pipeline::blend::Blend;
+use pipeline::depth_stencil::DepthStencil;
+use pipeline::input_assembly::InputAssembly;
+use pipeline::input_assembly::PrimitiveTopology;
+use pipeline::layout::PipelineLayoutDesc;
+use pipeline::multisample::Multisample;
+use pipeline::shader::ShaderInterface;
+use pipeline::shader::ShaderModule;
+use pipeline::vertex::SingleBufferDefinition;
+use pipeline::viewport::ViewportsState;
+use pipeline::GraphicsPipeline;
+use pipeline::GraphicsPipelineCreationError;
+use pipeline::GraphicsPipelineParams;
+use std::ffi::CString;
+
+#[test]
+fn create() {
+ let (device, _) = gfx_dev_and_queue!();
+
+ let vs = unsafe { ShaderModule::new(device.clone(), &BASIC_VS).unwrap() };
+ let fs = unsafe { ShaderModule::new(device.clone(), &BASIC_FS).unwrap() };
+
+ let _ = GraphicsPipeline::new(
+ &device,
+ GraphicsPipelineParams {
+ vertex_input: SingleBufferDefinition::<()>::new(),
+ vertex_shader: unsafe {
+ vs.vertex_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ input_assembly: InputAssembly::triangle_list(),
+ tessellation: None,
+ geometry_shader: None,
+ viewport: ViewportsState::Dynamic { num: 1 },
+ raster: Default::default(),
+ multisample: Multisample::disabled(),
+ fragment_shader: unsafe {
+ fs.fragment_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ depth_stencil: DepthStencil::disabled(),
+ blend: Blend::pass_through(),
+ render_pass: Subpass::from(
+ simple_rp::CustomRenderPass::new(&device, &{
+ simple_rp::Formats {
+ color: (Format::R8G8B8A8Unorm, 1),
+ }
+ })
+ .unwrap(),
+ 0,
+ )
+ .unwrap(),
+ },
+ )
+ .unwrap();
+}
+
+#[test]
+fn bad_primitive_restart() {
+ let (device, _) = gfx_dev_and_queue!();
+
+ let vs = unsafe { ShaderModule::new(device.clone(), &BASIC_VS).unwrap() };
+ let fs = unsafe { ShaderModule::new(device.clone(), &BASIC_FS).unwrap() };
+
+ let result = GraphicsPipeline::new(
+ &device,
+ GraphicsPipelineParams {
+ vertex_input: SingleBufferDefinition::<()>::new(),
+ vertex_shader: unsafe {
+ vs.vertex_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ input_assembly: InputAssembly {
+ topology: PrimitiveTopology::TriangleList,
+ primitive_restart_enable: true,
+ },
+ tessellation: None,
+ geometry_shader: None,
+ viewport: ViewportsState::Dynamic { num: 1 },
+ raster: Default::default(),
+ multisample: Multisample::disabled(),
+ fragment_shader: unsafe {
+ fs.fragment_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ depth_stencil: DepthStencil::disabled(),
+ blend: Blend::pass_through(),
+ render_pass: Subpass::from(
+ simple_rp::CustomRenderPass::new(&device, &{
+ simple_rp::Formats {
+ color: (Format::R8G8B8A8Unorm, 1),
+ }
+ })
+ .unwrap(),
+ 0,
+ )
+ .unwrap(),
+ },
+ );
+
+ match result {
+ Err(GraphicsPipelineCreationError::PrimitiveDoesntSupportPrimitiveRestart { .. }) => (),
+ _ => panic!(),
+ }
+}
+
+#[test]
+fn multi_viewport_feature() {
+ let (device, _) = gfx_dev_and_queue!();
+
+ let vs = unsafe { ShaderModule::new(device.clone(), &BASIC_VS).unwrap() };
+ let fs = unsafe { ShaderModule::new(device.clone(), &BASIC_FS).unwrap() };
+
+ let result = GraphicsPipeline::new(
+ &device,
+ GraphicsPipelineParams {
+ vertex_input: SingleBufferDefinition::<()>::new(),
+ vertex_shader: unsafe {
+ vs.vertex_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ input_assembly: InputAssembly::triangle_list(),
+ tessellation: None,
+ geometry_shader: None,
+ viewport: ViewportsState::Dynamic { num: 2 },
+ raster: Default::default(),
+ multisample: Multisample::disabled(),
+ fragment_shader: unsafe {
+ fs.fragment_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ depth_stencil: DepthStencil::disabled(),
+ blend: Blend::pass_through(),
+ render_pass: Subpass::from(
+ simple_rp::CustomRenderPass::new(&device, &{
+ simple_rp::Formats {
+ color: (Format::R8G8B8A8Unorm, 1),
+ }
+ })
+ .unwrap(),
+ 0,
+ )
+ .unwrap(),
+ },
+ );
+
+ match result {
+ Err(GraphicsPipelineCreationError::MultiViewportFeatureNotEnabled) => (),
+ _ => panic!(),
+ }
+}
+
+#[test]
+fn max_viewports() {
+ let (device, _) = gfx_dev_and_queue!(multi_viewport);
+
+ let vs = unsafe { ShaderModule::new(device.clone(), &BASIC_VS).unwrap() };
+ let fs = unsafe { ShaderModule::new(device.clone(), &BASIC_FS).unwrap() };
+
+ let result = GraphicsPipeline::new(
+ &device,
+ GraphicsPipelineParams {
+ vertex_input: SingleBufferDefinition::<()>::new(),
+ vertex_shader: unsafe {
+ vs.vertex_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ input_assembly: InputAssembly::triangle_list(),
+ tessellation: None,
+ geometry_shader: None,
+ viewport: ViewportsState::Dynamic { num: !0 },
+ raster: Default::default(),
+ multisample: Multisample::disabled(),
+ fragment_shader: unsafe {
+ fs.fragment_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ depth_stencil: DepthStencil::disabled(),
+ blend: Blend::pass_through(),
+ render_pass: Subpass::from(
+ simple_rp::CustomRenderPass::new(&device, &{
+ simple_rp::Formats {
+ color: (Format::R8G8B8A8Unorm, 1),
+ }
+ })
+ .unwrap(),
+ 0,
+ )
+ .unwrap(),
+ },
+ );
+
+ match result {
+ Err(GraphicsPipelineCreationError::MaxViewportsExceeded { .. }) => (),
+ _ => panic!(),
+ }
+}
+
+#[test]
+fn no_depth_attachment() {
+ let (device, _) = gfx_dev_and_queue!();
+
+ let vs = unsafe { ShaderModule::new(device.clone(), &BASIC_VS).unwrap() };
+ let fs = unsafe { ShaderModule::new(device.clone(), &BASIC_FS).unwrap() };
+
+ let result = GraphicsPipeline::new(
+ &device,
+ GraphicsPipelineParams {
+ vertex_input: SingleBufferDefinition::<()>::new(),
+ vertex_shader: unsafe {
+ vs.vertex_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ input_assembly: InputAssembly::triangle_list(),
+ tessellation: None,
+ geometry_shader: None,
+ viewport: ViewportsState::Dynamic { num: 1 },
+ raster: Default::default(),
+ multisample: Multisample::disabled(),
+ fragment_shader: unsafe {
+ fs.fragment_shader_entry_point::<(), _, _, _>(
+ &CString::new("main").unwrap(),
+ ShaderInterface::empty(),
+ ShaderInterface::empty(),
+ PipelineLayoutDesc::empty(),
+ )
+ },
+ depth_stencil: DepthStencil::simple_depth_test(),
+ blend: Blend::pass_through(),
+ render_pass: Subpass::from(
+ simple_rp::CustomRenderPass::new(&device, &{
+ simple_rp::Formats {
+ color: (Format::R8G8B8A8Unorm, 1),
+ }
+ })
+ .unwrap(),
+ 0,
+ )
+ .unwrap(),
+ },
+ );
+
+ match result {
+ Err(GraphicsPipelineCreationError::NoDepthAttachment) => (),
+ _ => panic!(),
+ }
+}
+
+mod simple_rp {
+ use format::Format;
+
+ single_pass_renderpass! {
+ attachments: {
+ color: {
+ load: Clear,
+ store: Store,
+ format: Format,
+ }
+ },
+ pass: {
+ color: [color],
+ depth_stencil: {}
+ }
+ }
+}
+
+/*
+ #version 450
+
+ #extension GL_ARB_separate_shader_objects : enable
+ #extension GL_ARB_shading_language_420pack : enable
+
+ layout(location = 0) in vec2 position;
+
+ void main() {
+ gl_Position = vec4(position, 0.0, 1.0);
+ }
+*/
+const BASIC_VS: [u8; 912] = [
+ 3, 2, 35, 7, 0, 0, 1, 0, 1, 0, 8, 0, 27, 0, 0, 0, 0, 0, 0, 0, 17, 0, 2, 0, 1, 0, 0, 0, 17, 0,
+ 2, 0, 32, 0, 0, 0, 17, 0, 2, 0, 33, 0, 0, 0, 11, 0, 6, 0, 1, 0, 0, 0, 71, 76, 83, 76, 46, 115,
+ 116, 100, 46, 52, 53, 48, 0, 0, 0, 0, 14, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 15, 0, 7, 0, 0, 0,
+ 0, 0, 4, 0, 0, 0, 109, 97, 105, 110, 0, 0, 0, 0, 13, 0, 0, 0, 18, 0, 0, 0, 3, 0, 3, 0, 2, 0, 0,
+ 0, 194, 1, 0, 0, 4, 0, 9, 0, 71, 76, 95, 65, 82, 66, 95, 115, 101, 112, 97, 114, 97, 116, 101,
+ 95, 115, 104, 97, 100, 101, 114, 95, 111, 98, 106, 101, 99, 116, 115, 0, 0, 4, 0, 9, 0, 71, 76,
+ 95, 65, 82, 66, 95, 115, 104, 97, 100, 105, 110, 103, 95, 108, 97, 110, 103, 117, 97, 103, 101,
+ 95, 52, 50, 48, 112, 97, 99, 107, 0, 5, 0, 4, 0, 4, 0, 0, 0, 109, 97, 105, 110, 0, 0, 0, 0, 5,
+ 0, 6, 0, 11, 0, 0, 0, 103, 108, 95, 80, 101, 114, 86, 101, 114, 116, 101, 120, 0, 0, 0, 0, 6,
+ 0, 6, 0, 11, 0, 0, 0, 0, 0, 0, 0, 103, 108, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 6, 0,
+ 7, 0, 11, 0, 0, 0, 1, 0, 0, 0, 103, 108, 95, 80, 111, 105, 110, 116, 83, 105, 122, 101, 0, 0,
+ 0, 0, 6, 0, 7, 0, 11, 0, 0, 0, 2, 0, 0, 0, 103, 108, 95, 67, 108, 105, 112, 68, 105, 115, 116,
+ 97, 110, 99, 101, 0, 6, 0, 7, 0, 11, 0, 0, 0, 3, 0, 0, 0, 103, 108, 95, 67, 117, 108, 108, 68,
+ 105, 115, 116, 97, 110, 99, 101, 0, 5, 0, 3, 0, 13, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 18, 0, 0,
+ 0, 112, 111, 115, 105, 116, 105, 111, 110, 0, 0, 0, 0, 72, 0, 5, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 0, 0, 72, 0, 5, 0, 11, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 72, 0,
+ 5, 0, 11, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 72, 0, 5, 0, 11, 0, 0, 0, 3, 0, 0, 0,
+ 11, 0, 0, 0, 4, 0, 0, 0, 71, 0, 3, 0, 11, 0, 0, 0, 2, 0, 0, 0, 71, 0, 4, 0, 18, 0, 0, 0, 30, 0,
+ 0, 0, 0, 0, 0, 0, 19, 0, 2, 0, 2, 0, 0, 0, 33, 0, 3, 0, 3, 0, 0, 0, 2, 0, 0, 0, 22, 0, 3, 0, 6,
+ 0, 0, 0, 32, 0, 0, 0, 23, 0, 4, 0, 7, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 21, 0, 4, 0, 8, 0, 0, 0,
+ 32, 0, 0, 0, 0, 0, 0, 0, 43, 0, 4, 0, 8, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 28, 0, 4, 0, 10, 0,
+ 0, 0, 6, 0, 0, 0, 9, 0, 0, 0, 30, 0, 6, 0, 11, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0,
+ 10, 0, 0, 0, 32, 0, 4, 0, 12, 0, 0, 0, 3, 0, 0, 0, 11, 0, 0, 0, 59, 0, 4, 0, 12, 0, 0, 0, 13,
+ 0, 0, 0, 3, 0, 0, 0, 21, 0, 4, 0, 14, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 43, 0, 4, 0, 14, 0, 0,
+ 0, 15, 0, 0, 0, 0, 0, 0, 0, 23, 0, 4, 0, 16, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 32, 0, 4, 0, 17,
+ 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 59, 0, 4, 0, 17, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 43, 0, 4,
+ 0, 6, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 43, 0, 4, 0, 6, 0, 0, 0, 21, 0, 0, 0, 0, 0, 128, 63,
+ 32, 0, 4, 0, 25, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 54, 0, 5, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 248, 0, 2, 0, 5, 0, 0, 0, 61, 0, 4, 0, 16, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0,
+ 81, 0, 5, 0, 6, 0, 0, 0, 22, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 81, 0, 5, 0, 6, 0, 0, 0, 23, 0,
+ 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 80, 0, 7, 0, 7, 0, 0, 0, 24, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 65, 0, 5, 0, 25, 0, 0, 0, 26, 0, 0, 0, 13, 0, 0, 0, 15, 0, 0, 0, 62,
+ 0, 3, 0, 26, 0, 0, 0, 24, 0, 0, 0, 253, 0, 1, 0, 56, 0, 1, 0,
+];
+
+/*
+ #version 450
+
+ #extension GL_ARB_separate_shader_objects : enable
+ #extension GL_ARB_shading_language_420pack : enable
+
+ layout(location = 0) out vec4 f_color;
+
+ void main() {
+ f_color = vec4(1.0, 0.0, 0.0, 1.0);
+ }
+*/
+const BASIC_FS: [u8; 420] = [
+ 3, 2, 35, 7, 0, 0, 1, 0, 1, 0, 8, 0, 13, 0, 0, 0, 0, 0, 0, 0, 17, 0, 2, 0, 1, 0, 0, 0, 11, 0,
+ 6, 0, 1, 0, 0, 0, 71, 76, 83, 76, 46, 115, 116, 100, 46, 52, 53, 48, 0, 0, 0, 0, 14, 0, 3, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 15, 0, 6, 0, 4, 0, 0, 0, 4, 0, 0, 0, 109, 97, 105, 110, 0, 0, 0, 0, 9,
+ 0, 0, 0, 16, 0, 3, 0, 4, 0, 0, 0, 7, 0, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 194, 1, 0, 0, 4, 0, 9, 0,
+ 71, 76, 95, 65, 82, 66, 95, 115, 101, 112, 97, 114, 97, 116, 101, 95, 115, 104, 97, 100, 101,
+ 114, 95, 111, 98, 106, 101, 99, 116, 115, 0, 0, 4, 0, 9, 0, 71, 76, 95, 65, 82, 66, 95, 115,
+ 104, 97, 100, 105, 110, 103, 95, 108, 97, 110, 103, 117, 97, 103, 101, 95, 52, 50, 48, 112, 97,
+ 99, 107, 0, 5, 0, 4, 0, 4, 0, 0, 0, 109, 97, 105, 110, 0, 0, 0, 0, 5, 0, 4, 0, 9, 0, 0, 0, 102,
+ 95, 99, 111, 108, 111, 114, 0, 71, 0, 4, 0, 9, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 19, 0, 2, 0,
+ 2, 0, 0, 0, 33, 0, 3, 0, 3, 0, 0, 0, 2, 0, 0, 0, 22, 0, 3, 0, 6, 0, 0, 0, 32, 0, 0, 0, 23, 0,
+ 4, 0, 7, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 32, 0, 4, 0, 8, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 59,
+ 0, 4, 0, 8, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 43, 0, 4, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 128,
+ 63, 43, 0, 4, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 44, 0, 7, 0, 7, 0, 0, 0, 12, 0, 0, 0, 10,
+ 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 54, 0, 5, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 248, 0, 2, 0, 5, 0, 0, 0, 62, 0, 3, 0, 9, 0, 0, 0, 12, 0, 0, 0, 253, 0, 1, 0,
+ 56, 0, 1, 0,
+];