diff options
Diffstat (limited to 'src/pipeline/graphics_pipeline/creation_error.rs')
-rw-r--r-- | src/pipeline/graphics_pipeline/creation_error.rs | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/src/pipeline/graphics_pipeline/creation_error.rs b/src/pipeline/graphics_pipeline/creation_error.rs new file mode 100644 index 0000000..434426e --- /dev/null +++ b/src/pipeline/graphics_pipeline/creation_error.rs @@ -0,0 +1,380 @@ +// Copyright (c) 2017 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. + +use crate::pipeline::input_assembly::PrimitiveTopology; +use crate::pipeline::layout::PipelineLayoutSupersetError; +use crate::pipeline::shader::ShaderInterfaceMismatchError; +use crate::pipeline::vertex::IncompatibleVertexDefinitionError; +use crate::Error; +use crate::OomError; +use std::error; +use std::fmt; +use std::u32; + +/// Error that can happen when creating a graphics pipeline. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum GraphicsPipelineCreationError { + /// Not enough memory. + OomError(OomError), + + /// The pipeline layout is not compatible with what the shaders expect. + IncompatiblePipelineLayout(PipelineLayoutSupersetError), + + /// The provided specialization constants are not compatible with what the shader expects. + IncompatibleSpecializationConstants, + + /// The output interface of one shader and the input interface of the next shader does not match. + ShaderStagesMismatch(ShaderInterfaceMismatchError), + + /// The output of the fragment shader is not compatible with what the render pass subpass + /// expects. + FragmentShaderRenderPassIncompatible, + + /// The vertex definition is not compatible with the input of the vertex shader. + IncompatibleVertexDefinition(IncompatibleVertexDefinitionError), + + /// The maximum stride value for vertex input (ie. the distance between two vertex elements) + /// has been exceeded. + MaxVertexInputBindingStrideExceeded { + /// Index of the faulty binding. + binding: u32, + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: u32, + }, + + /// The maximum number of vertex sources has been exceeded. + MaxVertexInputBindingsExceeded { + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: u32, + }, + + /// The maximum offset for a vertex attribute has been exceeded. This means that your vertex + /// struct is too large. + MaxVertexInputAttributeOffsetExceeded { + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: u32, + }, + + /// The maximum number of vertex attributes has been exceeded. + MaxVertexInputAttributesExceeded { + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: usize, + }, + + /// The `vertex_attribute_instance_rate_divisor` feature must be enabled in order to use + /// instance rate divisors. + VertexAttributeInstanceRateDivisorFeatureNotEnabled, + + /// The `vertex_attribute_instance_rate_zero_divisor` feature must be enabled in order to use + /// an instance rate divisor of zero. + VertexAttributeInstanceRateZeroDivisorFeatureNotEnabled, + + /// The maximum value for the instance rate divisor has been exceeded. + MaxVertexAttribDivisorExceeded { + /// Index of the faulty binding. + binding: u32, + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: u32, + }, + + /// The user requested to use primitive restart, but the primitive topology doesn't support it. + PrimitiveDoesntSupportPrimitiveRestart { + /// The topology that doesn't support primitive restart. + primitive: PrimitiveTopology, + }, + + /// The `multi_viewport` feature must be enabled in order to use multiple viewports at once. + MultiViewportFeatureNotEnabled, + + /// The maximum number of viewports has been exceeded. + MaxViewportsExceeded { + /// Maximum allowed value. + max: u32, + /// Value that was passed. + obtained: u32, + }, + + /// The maximum dimensions of viewports has been exceeded. + MaxViewportDimensionsExceeded, + + /// The minimum or maximum bounds of viewports have been exceeded. + ViewportBoundsExceeded, + + /// The `wide_lines` feature must be enabled in order to use a line width greater than 1.0. + WideLinesFeatureNotEnabled, + + /// The `depth_clamp` feature must be enabled in order to use depth clamping. + DepthClampFeatureNotEnabled, + + /// The `depth_bias_clamp` feature must be enabled in order to use a depth bias clamp different + /// from 0.0. + DepthBiasClampFeatureNotEnabled, + + /// The `fill_mode_non_solid` feature must be enabled in order to use a polygon mode different + /// from `Fill`. + FillModeNonSolidFeatureNotEnabled, + + /// The `depth_bounds` feature must be enabled in order to use depth bounds testing. + DepthBoundsFeatureNotEnabled, + + /// The requested stencil test is invalid. + WrongStencilState, + + /// The primitives topology does not match what the geometry shader expects. + TopologyNotMatchingGeometryShader, + + /// The `geometry_shader` feature must be enabled in order to use geometry shaders. + GeometryShaderFeatureNotEnabled, + + /// The `tessellation_shader` feature must be enabled in order to use tessellation shaders. + TessellationShaderFeatureNotEnabled, + + /// The number of attachments specified in the blending does not match the number of + /// attachments in the subpass. + MismatchBlendingAttachmentsCount, + + /// The `independent_blend` feature must be enabled in order to use different blending + /// operations per attachment. + IndependentBlendFeatureNotEnabled, + + /// The `logic_op` feature must be enabled in order to use logic operations. + LogicOpFeatureNotEnabled, + + /// The depth test requires a depth attachment but render pass has no depth attachment, or + /// depth writing is enabled and the depth attachment is read-only. + NoDepthAttachment, + + /// The stencil test requires a stencil attachment but render pass has no stencil attachment, or + /// stencil writing is enabled and the stencil attachment is read-only. + NoStencilAttachment, + + /// Tried to use a patch list without a tessellation shader, or a non-patch-list with a + /// tessellation shader. + InvalidPrimitiveTopology, + + /// The `maxTessellationPatchSize` limit was exceeded. + MaxTessellationPatchSizeExceeded, + + /// The wrong type of shader has been passed. + /// + /// For example you passed a vertex shader as the fragment shader. + WrongShaderType, + + /// The `sample_rate_shading` feature must be enabled in order to use sample shading. + SampleRateShadingFeatureNotEnabled, + + /// The `alpha_to_one` feature must be enabled in order to use alpha-to-one. + AlphaToOneFeatureNotEnabled, + + /// The device doesn't support using the `multiview´ feature with geometry shaders. + MultiviewGeometryShaderNotSupported, + + /// The device doesn't support using the `multiview´ feature with tessellation shaders. + MultiviewTessellationShaderNotSupported, +} + +impl error::Error for GraphicsPipelineCreationError { + #[inline] + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match *self { + GraphicsPipelineCreationError::OomError(ref err) => Some(err), + GraphicsPipelineCreationError::IncompatiblePipelineLayout(ref err) => Some(err), + GraphicsPipelineCreationError::ShaderStagesMismatch(ref err) => Some(err), + GraphicsPipelineCreationError::IncompatibleVertexDefinition(ref err) => Some(err), + _ => None, + } + } +} + +impl fmt::Display for GraphicsPipelineCreationError { + // TODO: finish + #[inline] + fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!( + fmt, + "{}", + match *self { + GraphicsPipelineCreationError::OomError(_) => "not enough memory available", + GraphicsPipelineCreationError::ShaderStagesMismatch(_) => { + "the output interface of one shader and the input interface of the next shader does not match" + } + GraphicsPipelineCreationError::IncompatiblePipelineLayout(_) => { + "the pipeline layout is not compatible with what the shaders expect" + } + GraphicsPipelineCreationError::IncompatibleSpecializationConstants => { + "the provided specialization constants are not compatible with what the shader expects" + } + GraphicsPipelineCreationError::FragmentShaderRenderPassIncompatible => { + "the output of the fragment shader is not compatible with what the render pass \ + subpass expects" + } + GraphicsPipelineCreationError::IncompatibleVertexDefinition(_) => { + "the vertex definition is not compatible with the input of the vertex shader" + } + GraphicsPipelineCreationError::MaxVertexInputBindingStrideExceeded { .. } => { + "the maximum stride value for vertex input (ie. the distance between two vertex \ + elements) has been exceeded" + } + GraphicsPipelineCreationError::MaxVertexInputBindingsExceeded { .. } => { + "the maximum number of vertex sources has been exceeded" + } + GraphicsPipelineCreationError::MaxVertexInputAttributeOffsetExceeded { .. } => { + "the maximum offset for a vertex attribute has been exceeded" + } + GraphicsPipelineCreationError::MaxVertexInputAttributesExceeded { .. } => { + "the maximum number of vertex attributes has been exceeded" + } + GraphicsPipelineCreationError::VertexAttributeInstanceRateDivisorFeatureNotEnabled => { + "the `vertex_attribute_instance_rate_divisor` feature must be enabled in order to use instance rate divisors" + } + GraphicsPipelineCreationError::VertexAttributeInstanceRateZeroDivisorFeatureNotEnabled => { + "the `vertex_attribute_instance_rate_zero_divisor` feature must be enabled in order to use an instance rate divisor of zero" + } + GraphicsPipelineCreationError::MaxVertexAttribDivisorExceeded { .. } => { + "the maximum value for the instance rate divisor has been exceeded" + } + GraphicsPipelineCreationError::PrimitiveDoesntSupportPrimitiveRestart { + .. + } => { + "the user requested to use primitive restart, but the primitive topology \ + doesn't support it" + } + GraphicsPipelineCreationError::MultiViewportFeatureNotEnabled => { + "the `multi_viewport` feature must be enabled in order to use multiple viewports \ + at once" + } + GraphicsPipelineCreationError::MaxViewportsExceeded { .. } => { + "the maximum number of viewports has been exceeded" + } + GraphicsPipelineCreationError::MaxViewportDimensionsExceeded => { + "the maximum dimensions of viewports has been exceeded" + } + GraphicsPipelineCreationError::ViewportBoundsExceeded => { + "the minimum or maximum bounds of viewports have been exceeded" + } + GraphicsPipelineCreationError::WideLinesFeatureNotEnabled => { + "the `wide_lines` feature must be enabled in order to use a line width \ + greater than 1.0" + } + GraphicsPipelineCreationError::DepthClampFeatureNotEnabled => { + "the `depth_clamp` feature must be enabled in order to use depth clamping" + } + GraphicsPipelineCreationError::DepthBiasClampFeatureNotEnabled => { + "the `depth_bias_clamp` feature must be enabled in order to use a depth bias \ + clamp different from 0.0." + } + GraphicsPipelineCreationError::FillModeNonSolidFeatureNotEnabled => { + "the `fill_mode_non_solid` feature must be enabled in order to use a polygon mode \ + different from `Fill`" + } + GraphicsPipelineCreationError::DepthBoundsFeatureNotEnabled => { + "the `depth_bounds` feature must be enabled in order to use depth bounds testing" + } + GraphicsPipelineCreationError::WrongStencilState => { + "the requested stencil test is invalid" + } + GraphicsPipelineCreationError::TopologyNotMatchingGeometryShader => { + "the primitives topology does not match what the geometry shader expects" + } + GraphicsPipelineCreationError::GeometryShaderFeatureNotEnabled => { + "the `geometry_shader` feature must be enabled in order to use geometry shaders" + } + GraphicsPipelineCreationError::TessellationShaderFeatureNotEnabled => { + "the `tessellation_shader` feature must be enabled in order to use tessellation \ + shaders" + } + GraphicsPipelineCreationError::MismatchBlendingAttachmentsCount => { + "the number of attachments specified in the blending does not match the number of \ + attachments in the subpass" + } + GraphicsPipelineCreationError::IndependentBlendFeatureNotEnabled => { + "the `independent_blend` feature must be enabled in order to use different \ + blending operations per attachment" + } + GraphicsPipelineCreationError::LogicOpFeatureNotEnabled => { + "the `logic_op` feature must be enabled in order to use logic operations" + } + GraphicsPipelineCreationError::NoDepthAttachment => { + "the depth attachment of the render pass does not match the depth test" + } + GraphicsPipelineCreationError::NoStencilAttachment => { + "the stencil attachment of the render pass does not match the stencil test" + } + GraphicsPipelineCreationError::InvalidPrimitiveTopology => { + "trying to use a patch list without a tessellation shader, or a non-patch-list \ + with a tessellation shader" + } + GraphicsPipelineCreationError::MaxTessellationPatchSizeExceeded => { + "the maximum tessellation patch size was exceeded" + } + GraphicsPipelineCreationError::WrongShaderType => { + "the wrong type of shader has been passed" + } + GraphicsPipelineCreationError::SampleRateShadingFeatureNotEnabled => { + "the `sample_rate_shading` feature must be enabled in order to use sample shading" + } + GraphicsPipelineCreationError::AlphaToOneFeatureNotEnabled => { + "the `alpha_to_one` feature must be enabled in order to use alpha-to-one" + } + GraphicsPipelineCreationError::MultiviewGeometryShaderNotSupported => { + "the device doesn't support using the `multiview´ feature with geometry shaders" + } + GraphicsPipelineCreationError::MultiviewTessellationShaderNotSupported => { + "the device doesn't support using the `multiview´ feature with tessellation shaders" + } + } + ) + } +} + +impl From<OomError> for GraphicsPipelineCreationError { + #[inline] + fn from(err: OomError) -> GraphicsPipelineCreationError { + GraphicsPipelineCreationError::OomError(err) + } +} + +impl From<PipelineLayoutSupersetError> for GraphicsPipelineCreationError { + #[inline] + fn from(err: PipelineLayoutSupersetError) -> GraphicsPipelineCreationError { + GraphicsPipelineCreationError::IncompatiblePipelineLayout(err) + } +} + +impl From<IncompatibleVertexDefinitionError> for GraphicsPipelineCreationError { + #[inline] + fn from(err: IncompatibleVertexDefinitionError) -> GraphicsPipelineCreationError { + GraphicsPipelineCreationError::IncompatibleVertexDefinition(err) + } +} + +impl From<Error> for GraphicsPipelineCreationError { + #[inline] + fn from(err: Error) -> GraphicsPipelineCreationError { + match err { + err @ Error::OutOfHostMemory => { + GraphicsPipelineCreationError::OomError(OomError::from(err)) + } + err @ Error::OutOfDeviceMemory => { + GraphicsPipelineCreationError::OomError(OomError::from(err)) + } + _ => panic!("unexpected error: {:?}", err), + } + } +} |