Halide
Halide::BoundaryConditions Namespace Reference

namespace to hold functions for imposing boundary conditions on Halide Funcs. More...

Namespaces

 Internal
 

Functions

Func constant_exterior (const Func &source, const Tuple &value, const Region &bounds)
 Impose a boundary condition such that a given expression is returned everywhere outside the boundary. More...
 
Func constant_exterior (const Func &source, const Expr &value, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Tuple &value, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Expr &value, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Tuple &value)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Expr &value)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Tuple &value, Bounds &&... bounds)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func constant_exterior (const T &func_like, const Expr &value, Bounds &&... bounds)
 
Func repeat_edge (const Func &source, const Region &bounds)
 Impose a boundary condition such that the nearest edge sample is returned everywhere outside the given region. More...
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func repeat_edge (const T &func_like, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func repeat_edge (const T &func_like)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func repeat_edge (const T &func_like, Bounds &&... bounds)
 
Func repeat_image (const Func &source, const Region &bounds)
 Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other. More...
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func repeat_image (const T &func_like, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func repeat_image (const T &func_like)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func repeat_image (const T &func_like, Bounds &&... bounds)
 
Func mirror_image (const Func &source, const Region &bounds)
 Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other, but mirror them such that adjacent edges are the same. More...
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func mirror_image (const T &func_like, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func mirror_image (const T &func_like)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func mirror_image (const T &func_like, Bounds &&... bounds)
 
Func mirror_interior (const Func &source, const Region &bounds)
 Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other, but mirror them such that adjacent edges are the same and then overlap the edges. More...
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func mirror_interior (const T &func_like, const Region &bounds)
 
template<typename T >
HALIDE_NO_USER_CODE_INLINE Func mirror_interior (const T &func_like)
 
template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func mirror_interior (const T &func_like, Bounds &&... bounds)
 

Detailed Description

namespace to hold functions for imposing boundary conditions on Halide Funcs.

All functions in this namespace transform a source Func to a result Func where the result produces the values of the source within a given region and a different set of values outside the given region. A region is an N dimensional box specified by mins and extents.

Three areas are defined: The image is the entire set of values in the region. The edge is the set of pixels in the image but adjacent to coordinates that are not The interior is the image minus the edge (and is undefined if the extent of any region is 1 or less).

If the source Func has more dimensions than are specified, the extra ones are unmodified. Additionally, passing an undefined (default constructed) 'Expr' for the min and extent of a dimension will keep that dimension unmodified.

Numerous options for specifing the outside area are provided, including replacement with an expression, repeating the edge samples, mirroring over the edge, and repeating or mirroring the entire image.

Using these functions to express your boundary conditions is highly recommended for correctness and performance. Some of these are hard to get right. The versions here are both understood by bounds inference, and also judiciously use the 'likely' intrinsic to minimize runtime overhead.

Function Documentation

◆ constant_exterior() [1/8]

Func Halide::BoundaryConditions::constant_exterior ( const Func source,
const Tuple value,
const Region bounds 
)

Impose a boundary condition such that a given expression is returned everywhere outside the boundary.

Generally the expression will be a constant, though the code currently allows accessing the arguments of source.

An ImageParam, Buffer<T>, or similar can be passed instead of a Func. If this is done and no bounds are given, the boundaries will be taken from the min and extent methods of the passed object. Note that objects are taken by mutable ref. Pipelines capture Buffers via mutable refs, because running a pipeline might alter the Buffer metadata (e.g. device allocation state).

(This is similar to setting GL_TEXTURE_WRAP_* to GL_CLAMP_TO_BORDER and putting value in the border of the texture.)

You may pass undefined Exprs for dimensions that you do not wish to bound.

Referenced by constant_exterior().

◆ constant_exterior() [2/8]

Func Halide::BoundaryConditions::constant_exterior ( const Func source,
const Expr value,
const Region bounds 
)

◆ constant_exterior() [3/8]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Tuple value,
const Region bounds 
)

◆ constant_exterior() [4/8]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Expr value,
const Region bounds 
)

◆ constant_exterior() [5/8]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Tuple value 
)

◆ constant_exterior() [6/8]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Expr value 
)

Definition at line 120 of file BoundaryConditions.h.

References constant_exterior().

◆ constant_exterior() [7/8]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Tuple value,
Bounds &&...  bounds 
)

◆ constant_exterior() [8/8]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::constant_exterior ( const T &  func_like,
const Expr value,
Bounds &&...  bounds 
)

Definition at line 134 of file BoundaryConditions.h.

References constant_exterior().

◆ repeat_edge() [1/4]

Func Halide::BoundaryConditions::repeat_edge ( const Func source,
const Region bounds 
)

Impose a boundary condition such that the nearest edge sample is returned everywhere outside the given region.

An ImageParam, Buffer<T>, or similar can be passed instead of a Func. If this is done and no bounds are given, the boundaries will be taken from the min and extent methods of the passed object.

(This is similar to setting GL_TEXTURE_WRAP_* to GL_CLAMP_TO_EDGE.)

You may pass undefined Exprs for dimensions that you do not wish to bound.

Examples
tutorial/lesson_09_update_definitions.cpp.

Referenced by repeat_edge().

◆ repeat_edge() [2/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_edge ( const T &  func_like,
const Region bounds 
)

◆ repeat_edge() [3/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_edge ( const T &  func_like)

◆ repeat_edge() [4/4]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_edge ( const T &  func_like,
Bounds &&...  bounds 
)

◆ repeat_image() [1/4]

Func Halide::BoundaryConditions::repeat_image ( const Func source,
const Region bounds 
)

Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other.

An ImageParam, Buffer<T>, or similar can be passed instead of a Func. If this is done and no bounds are given, the boundaries will be taken from the min and extent methods of the passed object.

(This is similar to setting GL_TEXTURE_WRAP_* to GL_REPEAT.)

You may pass undefined Exprs for dimensions that you do not wish to bound.

Referenced by repeat_image().

◆ repeat_image() [2/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_image ( const T &  func_like,
const Region bounds 
)

◆ repeat_image() [3/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_image ( const T &  func_like)

◆ repeat_image() [4/4]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::repeat_image ( const T &  func_like,
Bounds &&...  bounds 
)

◆ mirror_image() [1/4]

Func Halide::BoundaryConditions::mirror_image ( const Func source,
const Region bounds 
)

Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other, but mirror them such that adjacent edges are the same.

An ImageParam, Buffer<T>, or similar can be passed instead of a Func. If this is done and no bounds are given, the boundaries will be taken from the min and extent methods of the passed object.

(This is similar to setting GL_TEXTURE_WRAP_* to GL_MIRRORED_REPEAT.)

You may pass undefined Exprs for dimensions that you do not wish to bound.

Referenced by mirror_image().

◆ mirror_image() [2/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_image ( const T &  func_like,
const Region bounds 
)

◆ mirror_image() [3/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_image ( const T &  func_like)

◆ mirror_image() [4/4]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_image ( const T &  func_like,
Bounds &&...  bounds 
)

◆ mirror_interior() [1/4]

Func Halide::BoundaryConditions::mirror_interior ( const Func source,
const Region bounds 
)

Impose a boundary condition such that the entire coordinate space is tiled with copies of the image abutted against each other, but mirror them such that adjacent edges are the same and then overlap the edges.

This produces an error if any extent is 1 or less. (TODO: check this.)

An ImageParam, Buffer<T>, or similar can be passed instead of a Func. If this is done and no bounds are given, the boundaries will be taken from the min and extent methods of the passed object.

(I do not believe there is a direct GL_TEXTURE_WRAP_* equivalent for this.)

You may pass undefined Exprs for dimensions that you do not wish to bound.

Referenced by mirror_interior().

◆ mirror_interior() [2/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_interior ( const T &  func_like,
const Region bounds 
)

◆ mirror_interior() [3/4]

template<typename T >
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_interior ( const T &  func_like)

◆ mirror_interior() [4/4]

template<typename T , typename... Bounds, typename std::enable_if< Halide::Internal::all_are_convertible< Expr, Bounds... >::value >::type * = nullptr>
HALIDE_NO_USER_CODE_INLINE Func Halide::BoundaryConditions::mirror_interior ( const T &  func_like,
Bounds &&...  bounds 
)