1 #include "ImageParam.h"
2 
3 #include <utility>
4 
5 namespace Halide {
6 
ImageParam(Type t,int d)7 ImageParam::ImageParam(Type t, int d)
8     : OutputImageParam(
9           Internal::Parameter(t, true, d, Internal::make_entity_name(this, "Halide:.*:ImageParam", 'p')),
10           Argument::InputBuffer,
11           Func()) {
12     // We must call create_func() after the super-ctor has completed.
13     func = create_func();
14 }
15 
ImageParam(Type t,int d,const std::string & n)16 ImageParam::ImageParam(Type t, int d, const std::string &n)
17     : OutputImageParam(
18           Internal::Parameter(t, true, d, n),
19           Argument::InputBuffer,
20           Func()) {
21     // We must call create_func() after the super-ctor has completed.
22     func = create_func();
23 }
24 
create_func() const25 Func ImageParam::create_func() const {
26     std::vector<Var> args;
27     std::vector<Expr> args_expr;
28     for (int i = 0; i < dimensions(); ++i) {
29         args.push_back(Var::implicit(i));
30         args_expr.push_back(Var::implicit(i));
31     }
32     if (!name().empty()) {
33         // Discourage future Funcs from having the same name
34         Internal::unique_name(name());
35     }
36     Func f(name() + "_im");
37     f(args) = Internal::Call::make(param, args_expr);
38     return f;
39 }
40 
set(const Buffer<> & b)41 void ImageParam::set(const Buffer<> &b) {
42     if (b.defined()) {
43         user_assert(b.type() == type())
44             << "Can't bind ImageParam " << name()
45             << " of type " << type()
46             << " to Buffer " << b.name()
47             << " of type " << Type(b.type()) << "\n";
48     }
49     param.set_buffer(b);
50 }
51 
get() const52 Buffer<> ImageParam::get() const {
53     return param.buffer();
54 }
55 
reset()56 void ImageParam::reset() {
57     set(Buffer<>());
58 }
59 
operator ()(std::vector<Expr> args_passed) const60 Expr ImageParam::operator()(std::vector<Expr> args_passed) const {
61     return func(std::move(args_passed));
62 }
63 
operator ()(std::vector<Var> args_passed) const64 Expr ImageParam::operator()(std::vector<Var> args_passed) const {
65     return func(std::move(args_passed));
66 }
67 
operator Func() const68 ImageParam::operator Func() const {
69     return func;
70 }
71 
in(const Func & f)72 Func ImageParam::in(const Func &f) {
73     internal_assert(func.defined());
74     return func.in(f);
75 }
76 
in(const std::vector<Func> & fs)77 Func ImageParam::in(const std::vector<Func> &fs) {
78     internal_assert(func.defined());
79     return func.in(fs);
80 }
81 
in()82 Func ImageParam::in() {
83     internal_assert(func.defined());
84     return func.in();
85 }
86 
trace_loads()87 void ImageParam::trace_loads() {
88     internal_assert(func.defined());
89     func.trace_loads();
90 }
91 
add_trace_tag(const std::string & trace_tag)92 ImageParam &ImageParam::add_trace_tag(const std::string &trace_tag) {
93     internal_assert(func.defined());
94     func.add_trace_tag(trace_tag);
95     return *this;
96 }
97 
98 }  // namespace Halide
99