You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: convolution.rs
    path of file: ./repos/juice/rcudnn/cudnn/src/api
    
    the code of the file until where you have to start completion: //! Provides the convolution functionality from the CUDA cuDNN API.
//!
//! Includes the convolution and filter functionality.

use crate::ffi::*;
use crate::{Error, API};

impl API {
    //
    // cuDNN Filter
    //

    /// Creates a generic CUDA cuDNN Filter Descriptor.
    pub fn create_filter_descriptor() -> Result<cudnnFilterDescriptor_t, Error> {
        unsafe { API::ffi_create_filter_descriptor() }
    }

    /// Destroys a CUDA cuDNN Filter Descriptor.
    ///
    /// Should b
    
    unsafe fn ffi_create_convolution_descriptor() -> Result<cudnnConvolutionDescriptor_t, Error> {
        let mut desc: cudnnConvolutionDescriptor_t = ::std::ptr::null_mut();
        match cudnnCreateConvolutionDescriptor(&mut desc) {
            cudnnStatus_t::CUDNN_STATUS_SUCCESS => Ok(desc),
            cudnnStatus_t::CUDNN_STATUS_ALLOC_FAILED => {
                Err(Error::AllocFailed("The resources could not be allocated."))
            }
            status => Err(Error::Unknown(
                "Unable to create generic CUDA cuDNN Convolution Descriptor.",
                status as i32 as u64,
            )),
        }
    }