Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / auxiliary / rbug / rbug_context.c
1 /*
2  * Copyright 2009 VMware, Inc.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * on the rights to use, copy, modify, merge, publish, distribute, sub
9  * license, and/or sell copies of the Software, and to permit persons to whom
10  * the Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19  * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22  * USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25 /*
26  * This file holds the function implementation for one of the rbug extensions.
27  * Prototypes and declerations of functions and structs is in the same folder
28  * in the header file matching this file's name.
29  *
30  * The functions starting rbug_send_* encodes a call to the write format and
31  * sends that to the supplied connection, while functions starting with
32  * rbug_demarshal_* demarshal data in the wire protocol.
33  *
34  * Functions ending with _reply are replies to requests.
35  */
36
37 #include "rbug_internal.h"
38 #include "rbug/rbug_context.h"
39
40 int rbug_send_context_list(struct rbug_connection *__con,
41                            uint32_t *__serial)
42 {
43         uint32_t __len = 0;
44         uint32_t __pos = 0;
45         uint8_t *__data = NULL;
46         int __ret = 0;
47
48         LEN(8); /* header */
49
50         /* align */
51         PAD(__len, 8);
52
53         __data = (uint8_t*)MALLOC(__len);
54         if (!__data)
55                 return -ENOMEM;
56
57         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST));
58         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
59
60         /* final pad */
61         PAD(__pos, 8);
62
63         if (__pos != __len) {
64                 __ret = -EINVAL;
65         } else {
66                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST, __len);
67                 rbug_connection_write(__con, __data, __len);
68                 __ret = rbug_connection_send_finish(__con, __serial);
69         }
70
71         FREE(__data);
72         return __ret;
73 }
74
75 int rbug_send_context_info(struct rbug_connection *__con,
76                            rbug_context_t context,
77                            uint32_t *__serial)
78 {
79         uint32_t __len = 0;
80         uint32_t __pos = 0;
81         uint8_t *__data = NULL;
82         int __ret = 0;
83
84         LEN(8); /* header */
85         LEN(8); /* context */
86
87         /* align */
88         PAD(__len, 8);
89
90         __data = (uint8_t*)MALLOC(__len);
91         if (!__data)
92                 return -ENOMEM;
93
94         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO));
95         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
96         WRITE(8, rbug_context_t, context); /* context */
97
98         /* final pad */
99         PAD(__pos, 8);
100
101         if (__pos != __len) {
102                 __ret = -EINVAL;
103         } else {
104                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO, __len);
105                 rbug_connection_write(__con, __data, __len);
106                 __ret = rbug_connection_send_finish(__con, __serial);
107         }
108
109         FREE(__data);
110         return __ret;
111 }
112
113 int rbug_send_context_draw_block(struct rbug_connection *__con,
114                                  rbug_context_t context,
115                                  rbug_block_t block,
116                                  uint32_t *__serial)
117 {
118         uint32_t __len = 0;
119         uint32_t __pos = 0;
120         uint8_t *__data = NULL;
121         int __ret = 0;
122
123         LEN(8); /* header */
124         LEN(8); /* context */
125         LEN(4); /* block */
126
127         /* align */
128         PAD(__len, 8);
129
130         __data = (uint8_t*)MALLOC(__len);
131         if (!__data)
132                 return -ENOMEM;
133
134         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK));
135         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
136         WRITE(8, rbug_context_t, context); /* context */
137         WRITE(4, rbug_block_t, block); /* block */
138
139         /* final pad */
140         PAD(__pos, 8);
141
142         if (__pos != __len) {
143                 __ret = -EINVAL;
144         } else {
145                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCK, __len);
146                 rbug_connection_write(__con, __data, __len);
147                 __ret = rbug_connection_send_finish(__con, __serial);
148         }
149
150         FREE(__data);
151         return __ret;
152 }
153
154 int rbug_send_context_draw_step(struct rbug_connection *__con,
155                                 rbug_context_t context,
156                                 rbug_block_t step,
157                                 uint32_t *__serial)
158 {
159         uint32_t __len = 0;
160         uint32_t __pos = 0;
161         uint8_t *__data = NULL;
162         int __ret = 0;
163
164         LEN(8); /* header */
165         LEN(8); /* context */
166         LEN(4); /* step */
167
168         /* align */
169         PAD(__len, 8);
170
171         __data = (uint8_t*)MALLOC(__len);
172         if (!__data)
173                 return -ENOMEM;
174
175         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_STEP));
176         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
177         WRITE(8, rbug_context_t, context); /* context */
178         WRITE(4, rbug_block_t, step); /* step */
179
180         /* final pad */
181         PAD(__pos, 8);
182
183         if (__pos != __len) {
184                 __ret = -EINVAL;
185         } else {
186                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_STEP, __len);
187                 rbug_connection_write(__con, __data, __len);
188                 __ret = rbug_connection_send_finish(__con, __serial);
189         }
190
191         FREE(__data);
192         return __ret;
193 }
194
195 int rbug_send_context_draw_unblock(struct rbug_connection *__con,
196                                    rbug_context_t context,
197                                    rbug_block_t unblock,
198                                    uint32_t *__serial)
199 {
200         uint32_t __len = 0;
201         uint32_t __pos = 0;
202         uint8_t *__data = NULL;
203         int __ret = 0;
204
205         LEN(8); /* header */
206         LEN(8); /* context */
207         LEN(4); /* unblock */
208
209         /* align */
210         PAD(__len, 8);
211
212         __data = (uint8_t*)MALLOC(__len);
213         if (!__data)
214                 return -ENOMEM;
215
216         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK));
217         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
218         WRITE(8, rbug_context_t, context); /* context */
219         WRITE(4, rbug_block_t, unblock); /* unblock */
220
221         /* final pad */
222         PAD(__pos, 8);
223
224         if (__pos != __len) {
225                 __ret = -EINVAL;
226         } else {
227                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_UNBLOCK, __len);
228                 rbug_connection_write(__con, __data, __len);
229                 __ret = rbug_connection_send_finish(__con, __serial);
230         }
231
232         FREE(__data);
233         return __ret;
234 }
235
236 int rbug_send_context_draw_rule(struct rbug_connection *__con,
237                                 rbug_context_t context,
238                                 rbug_shader_t vertex,
239                                 rbug_shader_t fragment,
240                                 rbug_texture_t texture,
241                                 rbug_texture_t surface,
242                                 rbug_block_t block,
243                                 uint32_t *__serial)
244 {
245         uint32_t __len = 0;
246         uint32_t __pos = 0;
247         uint8_t *__data = NULL;
248         int __ret = 0;
249
250         LEN(8); /* header */
251         LEN(8); /* context */
252         LEN(8); /* vertex */
253         LEN(8); /* fragment */
254         LEN(8); /* texture */
255         LEN(8); /* surface */
256         LEN(4); /* block */
257
258         /* align */
259         PAD(__len, 8);
260
261         __data = (uint8_t*)MALLOC(__len);
262         if (!__data)
263                 return -ENOMEM;
264
265         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_RULE));
266         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
267         WRITE(8, rbug_context_t, context); /* context */
268         WRITE(8, rbug_shader_t, vertex); /* vertex */
269         WRITE(8, rbug_shader_t, fragment); /* fragment */
270         WRITE(8, rbug_texture_t, texture); /* texture */
271         WRITE(8, rbug_texture_t, surface); /* surface */
272         WRITE(4, rbug_block_t, block); /* block */
273
274         /* final pad */
275         PAD(__pos, 8);
276
277         if (__pos != __len) {
278                 __ret = -EINVAL;
279         } else {
280                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_RULE, __len);
281                 rbug_connection_write(__con, __data, __len);
282                 __ret = rbug_connection_send_finish(__con, __serial);
283         }
284
285         FREE(__data);
286         return __ret;
287 }
288
289 int rbug_send_context_flush(struct rbug_connection *__con,
290                             rbug_context_t context,
291                             uint32_t *__serial)
292 {
293         uint32_t __len = 0;
294         uint32_t __pos = 0;
295         uint8_t *__data = NULL;
296         int __ret = 0;
297
298         LEN(8); /* header */
299         LEN(8); /* context */
300
301         /* align */
302         PAD(__len, 8);
303
304         __data = (uint8_t*)MALLOC(__len);
305         if (!__data)
306                 return -ENOMEM;
307
308         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_FLUSH));
309         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
310         WRITE(8, rbug_context_t, context); /* context */
311
312         /* final pad */
313         PAD(__pos, 8);
314
315         if (__pos != __len) {
316                 __ret = -EINVAL;
317         } else {
318                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_FLUSH, __len);
319                 rbug_connection_write(__con, __data, __len);
320                 __ret = rbug_connection_send_finish(__con, __serial);
321         }
322
323         FREE(__data);
324         return __ret;
325 }
326
327 int rbug_send_context_list_reply(struct rbug_connection *__con,
328                                  uint32_t serial,
329                                  rbug_context_t *contexts,
330                                  uint32_t contexts_len,
331                                  uint32_t *__serial)
332 {
333         uint32_t __len = 0;
334         uint32_t __pos = 0;
335         uint8_t *__data = NULL;
336         int __ret = 0;
337
338         LEN(8); /* header */
339         LEN(4); /* serial */
340         LEN_ARRAY(8, contexts); /* contexts */
341
342         /* align */
343         PAD(__len, 8);
344
345         __data = (uint8_t*)MALLOC(__len);
346         if (!__data)
347                 return -ENOMEM;
348
349         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST_REPLY));
350         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
351         WRITE(4, uint32_t, serial); /* serial */
352         WRITE_ARRAY(8, rbug_context_t, contexts); /* contexts */
353
354         /* final pad */
355         PAD(__pos, 8);
356
357         if (__pos != __len) {
358                 __ret = -EINVAL;
359         } else {
360                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST_REPLY, __len);
361                 rbug_connection_write(__con, __data, __len);
362                 __ret = rbug_connection_send_finish(__con, __serial);
363         }
364
365         FREE(__data);
366         return __ret;
367 }
368
369 int rbug_send_context_info_reply(struct rbug_connection *__con,
370                                  uint32_t serial,
371                                  rbug_shader_t vertex,
372                                  rbug_shader_t fragment,
373                                  rbug_texture_t *texs,
374                                  uint32_t texs_len,
375                                  rbug_texture_t *cbufs,
376                                  uint32_t cbufs_len,
377                                  rbug_texture_t zsbuf,
378                                  rbug_block_t blocker,
379                                  rbug_block_t blocked,
380                                  uint32_t *__serial)
381 {
382         uint32_t __len = 0;
383         uint32_t __pos = 0;
384         uint8_t *__data = NULL;
385         int __ret = 0;
386
387         LEN(8); /* header */
388         LEN(4); /* serial */
389         LEN(8); /* vertex */
390         LEN(8); /* fragment */
391         LEN_ARRAY(8, texs); /* texs */
392         LEN_ARRAY(8, cbufs); /* cbufs */
393         LEN(8); /* zsbuf */
394         LEN(4); /* blocker */
395         LEN(4); /* blocked */
396
397         /* align */
398         PAD(__len, 8);
399
400         __data = (uint8_t*)MALLOC(__len);
401         if (!__data)
402                 return -ENOMEM;
403
404         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO_REPLY));
405         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
406         WRITE(4, uint32_t, serial); /* serial */
407         WRITE(8, rbug_shader_t, vertex); /* vertex */
408         WRITE(8, rbug_shader_t, fragment); /* fragment */
409         WRITE_ARRAY(8, rbug_texture_t, texs); /* texs */
410         WRITE_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
411         WRITE(8, rbug_texture_t, zsbuf); /* zsbuf */
412         WRITE(4, rbug_block_t, blocker); /* blocker */
413         WRITE(4, rbug_block_t, blocked); /* blocked */
414
415         /* final pad */
416         PAD(__pos, 8);
417
418         if (__pos != __len) {
419                 __ret = -EINVAL;
420         } else {
421                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO_REPLY, __len);
422                 rbug_connection_write(__con, __data, __len);
423                 __ret = rbug_connection_send_finish(__con, __serial);
424         }
425
426         FREE(__data);
427         return __ret;
428 }
429
430 int rbug_send_context_draw_blocked(struct rbug_connection *__con,
431                                    rbug_context_t context,
432                                    rbug_block_t block,
433                                    uint32_t *__serial)
434 {
435         uint32_t __len = 0;
436         uint32_t __pos = 0;
437         uint8_t *__data = NULL;
438         int __ret = 0;
439
440         LEN(8); /* header */
441         LEN(8); /* context */
442         LEN(4); /* block */
443
444         /* align */
445         PAD(__len, 8);
446
447         __data = (uint8_t*)MALLOC(__len);
448         if (!__data)
449                 return -ENOMEM;
450
451         WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED));
452         WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
453         WRITE(8, rbug_context_t, context); /* context */
454         WRITE(4, rbug_block_t, block); /* block */
455
456         /* final pad */
457         PAD(__pos, 8);
458
459         if (__pos != __len) {
460                 __ret = -EINVAL;
461         } else {
462                 rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCKED, __len);
463                 rbug_connection_write(__con, __data, __len);
464                 __ret = rbug_connection_send_finish(__con, __serial);
465         }
466
467         FREE(__data);
468         return __ret;
469 }
470
471 struct rbug_proto_context_list * rbug_demarshal_context_list(struct rbug_proto_header *header)
472 {
473         struct rbug_proto_context_list *ret;
474
475         if (!header)
476                 return NULL;
477         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST)
478                 return NULL;
479
480         ret = MALLOC(sizeof(*ret));
481         if (!ret)
482                 return NULL;
483
484         ret->header.__message = header;
485         ret->header.opcode = header->opcode;
486
487         return ret;
488 }
489
490 struct rbug_proto_context_info * rbug_demarshal_context_info(struct rbug_proto_header *header)
491 {
492         uint32_t len = 0;
493         uint32_t pos = 0;
494         uint8_t *data =  NULL;
495         struct rbug_proto_context_info *ret;
496
497         if (!header)
498                 return NULL;
499         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO)
500                 return NULL;
501
502         pos = 0;
503         len = header->length * 4;
504         data = (uint8_t*)&header[1];
505         ret = MALLOC(sizeof(*ret));
506         if (!ret)
507                 return NULL;
508
509         ret->header.__message = header;
510         ret->header.opcode = header->opcode;
511
512         READ(8, rbug_context_t, context); /* context */
513
514         return ret;
515 }
516
517 struct rbug_proto_context_draw_block * rbug_demarshal_context_draw_block(struct rbug_proto_header *header)
518 {
519         uint32_t len = 0;
520         uint32_t pos = 0;
521         uint8_t *data =  NULL;
522         struct rbug_proto_context_draw_block *ret;
523
524         if (!header)
525                 return NULL;
526         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK)
527                 return NULL;
528
529         pos = 0;
530         len = header->length * 4;
531         data = (uint8_t*)&header[1];
532         ret = MALLOC(sizeof(*ret));
533         if (!ret)
534                 return NULL;
535
536         ret->header.__message = header;
537         ret->header.opcode = header->opcode;
538
539         READ(8, rbug_context_t, context); /* context */
540         READ(4, rbug_block_t, block); /* block */
541
542         return ret;
543 }
544
545 struct rbug_proto_context_draw_step * rbug_demarshal_context_draw_step(struct rbug_proto_header *header)
546 {
547         uint32_t len = 0;
548         uint32_t pos = 0;
549         uint8_t *data =  NULL;
550         struct rbug_proto_context_draw_step *ret;
551
552         if (!header)
553                 return NULL;
554         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_STEP)
555                 return NULL;
556
557         pos = 0;
558         len = header->length * 4;
559         data = (uint8_t*)&header[1];
560         ret = MALLOC(sizeof(*ret));
561         if (!ret)
562                 return NULL;
563
564         ret->header.__message = header;
565         ret->header.opcode = header->opcode;
566
567         READ(8, rbug_context_t, context); /* context */
568         READ(4, rbug_block_t, step); /* step */
569
570         return ret;
571 }
572
573 struct rbug_proto_context_draw_unblock * rbug_demarshal_context_draw_unblock(struct rbug_proto_header *header)
574 {
575         uint32_t len = 0;
576         uint32_t pos = 0;
577         uint8_t *data =  NULL;
578         struct rbug_proto_context_draw_unblock *ret;
579
580         if (!header)
581                 return NULL;
582         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK)
583                 return NULL;
584
585         pos = 0;
586         len = header->length * 4;
587         data = (uint8_t*)&header[1];
588         ret = MALLOC(sizeof(*ret));
589         if (!ret)
590                 return NULL;
591
592         ret->header.__message = header;
593         ret->header.opcode = header->opcode;
594
595         READ(8, rbug_context_t, context); /* context */
596         READ(4, rbug_block_t, unblock); /* unblock */
597
598         return ret;
599 }
600
601 struct rbug_proto_context_draw_rule * rbug_demarshal_context_draw_rule(struct rbug_proto_header *header)
602 {
603         uint32_t len = 0;
604         uint32_t pos = 0;
605         uint8_t *data =  NULL;
606         struct rbug_proto_context_draw_rule *ret;
607
608         if (!header)
609                 return NULL;
610         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_RULE)
611                 return NULL;
612
613         pos = 0;
614         len = header->length * 4;
615         data = (uint8_t*)&header[1];
616         ret = MALLOC(sizeof(*ret));
617         if (!ret)
618                 return NULL;
619
620         ret->header.__message = header;
621         ret->header.opcode = header->opcode;
622
623         READ(8, rbug_context_t, context); /* context */
624         READ(8, rbug_shader_t, vertex); /* vertex */
625         READ(8, rbug_shader_t, fragment); /* fragment */
626         READ(8, rbug_texture_t, texture); /* texture */
627         READ(8, rbug_texture_t, surface); /* surface */
628         READ(4, rbug_block_t, block); /* block */
629
630         return ret;
631 }
632
633 struct rbug_proto_context_flush * rbug_demarshal_context_flush(struct rbug_proto_header *header)
634 {
635         uint32_t len = 0;
636         uint32_t pos = 0;
637         uint8_t *data =  NULL;
638         struct rbug_proto_context_flush *ret;
639
640         if (!header)
641                 return NULL;
642         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_FLUSH)
643                 return NULL;
644
645         pos = 0;
646         len = header->length * 4;
647         data = (uint8_t*)&header[1];
648         ret = MALLOC(sizeof(*ret));
649         if (!ret)
650                 return NULL;
651
652         ret->header.__message = header;
653         ret->header.opcode = header->opcode;
654
655         READ(8, rbug_context_t, context); /* context */
656
657         return ret;
658 }
659
660 struct rbug_proto_context_list_reply * rbug_demarshal_context_list_reply(struct rbug_proto_header *header)
661 {
662         uint32_t len = 0;
663         uint32_t pos = 0;
664         uint8_t *data =  NULL;
665         struct rbug_proto_context_list_reply *ret;
666
667         if (!header)
668                 return NULL;
669         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST_REPLY)
670                 return NULL;
671
672         pos = 0;
673         len = header->length * 4;
674         data = (uint8_t*)&header[1];
675         ret = MALLOC(sizeof(*ret));
676         if (!ret)
677                 return NULL;
678
679         ret->header.__message = header;
680         ret->header.opcode = header->opcode;
681
682         READ(4, uint32_t, serial); /* serial */
683         READ_ARRAY(8, rbug_context_t, contexts); /* contexts */
684
685         return ret;
686 }
687
688 struct rbug_proto_context_info_reply * rbug_demarshal_context_info_reply(struct rbug_proto_header *header)
689 {
690         uint32_t len = 0;
691         uint32_t pos = 0;
692         uint8_t *data =  NULL;
693         struct rbug_proto_context_info_reply *ret;
694
695         if (!header)
696                 return NULL;
697         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO_REPLY)
698                 return NULL;
699
700         pos = 0;
701         len = header->length * 4;
702         data = (uint8_t*)&header[1];
703         ret = MALLOC(sizeof(*ret));
704         if (!ret)
705                 return NULL;
706
707         ret->header.__message = header;
708         ret->header.opcode = header->opcode;
709
710         READ(4, uint32_t, serial); /* serial */
711         READ(8, rbug_shader_t, vertex); /* vertex */
712         READ(8, rbug_shader_t, fragment); /* fragment */
713         READ_ARRAY(8, rbug_texture_t, texs); /* texs */
714         READ_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
715         READ(8, rbug_texture_t, zsbuf); /* zsbuf */
716         READ(4, rbug_block_t, blocker); /* blocker */
717         READ(4, rbug_block_t, blocked); /* blocked */
718
719         return ret;
720 }
721
722 struct rbug_proto_context_draw_blocked * rbug_demarshal_context_draw_blocked(struct rbug_proto_header *header)
723 {
724         uint32_t len = 0;
725         uint32_t pos = 0;
726         uint8_t *data =  NULL;
727         struct rbug_proto_context_draw_blocked *ret;
728
729         if (!header)
730                 return NULL;
731         if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED)
732                 return NULL;
733
734         pos = 0;
735         len = header->length * 4;
736         data = (uint8_t*)&header[1];
737         ret = MALLOC(sizeof(*ret));
738         if (!ret)
739                 return NULL;
740
741         ret->header.__message = header;
742         ret->header.opcode = header->opcode;
743
744         READ(8, rbug_context_t, context); /* context */
745         READ(4, rbug_block_t, block); /* block */
746
747         return ret;
748 }