Home | History | Annotate | Download | only in rbug
      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_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 }
    749