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