Adding an internal bound array to LiveViz. This would make it possible to have a...
[charm.git] / src / libs / ck-libs / liveViz / liveViz.h
1 /*
2   Data types, function prototypes,  etc. exported by liveViz.
3   This layer does image assembly, and is the most commonly-used 
4   interface to liveViz.
5  */
6 #ifndef __UIUC_CHARM_LIVEVIZ_H
7 #define __UIUC_CHARM_LIVEVIZ_H
8
9 #include "liveViz0.h"
10 #include "ckimage.h"
11 #include "colorScale.h"
12 #include "pup_toNetwork.h"
13
14 /********************** LiveViz ***********************/
15 #include "liveViz.decl.h"
16
17 typedef enum {
18   sum_image_data,
19   max_image_data,
20   sum_float_image_data,
21   max_float_image_data
22 } liveVizCombine_t;
23
24 /*
25   Start liveViz.  This routine should be called once on processor 0
26   when you are ready to begin receiving image requests.
27
28   The arrayID is the array that will make deposits into liveViz.
29
30   The callback is signalled each time a client requests an image.
31   The image parameters are passed in as a "liveVizRequestMsg *" message.
32 */
33 void liveVizInit(const liveVizConfig &cfg, CkArrayID a, CkCallback c);
34 void liveVizInit(const liveVizConfig &cfg, CkArrayID a, CkCallback c, CkArrayOptions &opts);
35
36 class liveVizRequestMsg : public CMessage_liveVizRequestMsg {
37 public:
38         liveVizRequest req;
39         
40         /// Additional client request data: raw network bytes from client.
41         /// Use liveVizRequestUnpack to extract the data from this message.
42         char *data;
43         int dataLen;
44         
45         liveVizRequestMsg() {}
46         static liveVizRequestMsg *buildNew(const liveVizRequest &req,const void *data,int dataLen);
47 };
48
49 /// Unpack the extra client request data as network-byte-order ints,
50 ///  by calling pup on this class.
51 template<class T>
52 inline void liveVizRequestUnpack(const liveVizRequestMsg *src,T &dest)
53 {
54         PUP_toNetwork_unpack p(src->data);
55         p|dest;
56         if (p.size()!=src->dataLen) {
57                 CkError("liveVizRequestUnpack: client sent %d bytes, but you wanted %d bytes!\n",
58                         src->dataLen, p.size());
59                 CkAbort("liveVizRequestUnpack size mismatch\n");
60         }
61 }
62
63 /*
64   Deposit a (sizex x sizey) pixel portion of the final image,
65   starting at pixel (startx,starty) in the final image.
66   The "client" pointer is used to perform reductions, it's
67   normally "this".  Each array element must call deposit, even
68   if it's just an empty deposit, like:
69         liveVizDeposit(0,0, 0,0, NULL, this);
70 */
71 void liveVizDeposit(const liveVizRequest &req,
72                     int startx, int starty,
73                     int sizex, int sizey, const byte * imageData,
74                     ArrayElement* client,
75                     liveVizCombine_t combine=sum_image_data);
76
77
78 //As above, but taking a message instead of a request:
79 inline void liveVizDeposit(liveVizRequestMsg *reqMsg,
80                     int startx, int starty,
81                     int sizex, int sizey, const byte * imageData,
82                     ArrayElement* client,
83                    liveVizCombine_t combine=sum_image_data)
84 {
85         liveVizDeposit(reqMsg->req,startx,starty,sizex,sizey,imageData,client,
86                        combine);
87         delete reqMsg;
88 }
89
90 /**
91   A user-written routine to convert floating-point pixels
92   (when initialized with liveVizConfig::pix_float) to 
93   RGB pixels, which are actually sent across the wire.
94   This routine will only be called on processor 0, at the
95   end of a liveViz image assembly, in pix_float mode.
96 */
97 extern "C"
98 void liveVizFloatToRGB(liveVizRequest &req, 
99         const float *floatSrc, unsigned char *destRgb,
100         int nPixels);
101
102 /********************** LiveVizPoll **********************
103 These declarations should probably live in a header named "liveVizPoll.h"
104 */
105 #include "liveVizPoll.decl.h"
106
107
108
109 /**
110 Initialize the poll mode of liveViz.  This routine should
111 be called from main::main.
112
113 */
114 void liveVizPollInit();
115
116
117 typedef liveVizRequestMsg liveVizPollRequestMsg;
118
119
120 /**
121 Th Poll Mode has been extensively rewritten, Please read the new description in the manual.
122
123 Note the big changes:
124    liveVizPoll() no longer exists
125    liveVizPollDeposit requires some additional parameters
126
127 */
128
129 void liveVizPollDeposit(ArrayElement *from,
130                                                 int startx, int starty, 
131                                                 int sizex, int sizey,             // The dimensions of the piece I'm depositing
132                                                 int imagewidth, int imageheight,  // The dimensions of the entire image
133                                                 const byte * imageData,
134                                                 liveVizCombine_t _image_combine_reducer=sum_image_data,
135                                                 int bytes_per_pixel=3
136                                                 );
137
138
139 class LiveVizBoundElement : public CBase_LiveVizBoundElement {
140 public:
141         LiveVizBoundElement(){}
142         LiveVizBoundElement(CkMigrateMessage *msg){}
143         ~LiveVizBoundElement(){}
144         
145         void deposit(CkReductionMsg *msg){
146                 contribute(msg);
147         }
148 };
149
150
151
152 #endif /* def(thisHeader) */