2 * Copyright 2009 VMware, Inc.
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:
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
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.
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.
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.
34 * Functions ending with _reply are replies to requests.
37 #include "rbug_internal.h"
38 #include "rbug/rbug_context.h"
40 int rbug_send_context_list(struct rbug_connection
*__con
,
45 uint8_t *__data
= NULL
;
53 __data
= (uint8_t*)MALLOC(__len
);
57 WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST
));
58 WRITE(4, uint32_t, ((uint32_t)(__len
/ 4)));
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
);
75 int rbug_send_context_info(struct rbug_connection
*__con
,
76 rbug_context_t context
,
81 uint8_t *__data
= NULL
;
90 __data
= (uint8_t*)MALLOC(__len
);
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 */
101 if (__pos
!= __len
) {
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
);
113 int rbug_send_context_draw_block(struct rbug_connection
*__con
,
114 rbug_context_t context
,
120 uint8_t *__data
= NULL
;
124 LEN(8); /* context */
130 __data
= (uint8_t*)MALLOC(__len
);
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 */
142 if (__pos
!= __len
) {
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
);
154 int rbug_send_context_draw_step(struct rbug_connection
*__con
,
155 rbug_context_t context
,
161 uint8_t *__data
= NULL
;
165 LEN(8); /* context */
171 __data
= (uint8_t*)MALLOC(__len
);
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 */
183 if (__pos
!= __len
) {
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
);
195 int rbug_send_context_draw_unblock(struct rbug_connection
*__con
,
196 rbug_context_t context
,
197 rbug_block_t unblock
,
202 uint8_t *__data
= NULL
;
206 LEN(8); /* context */
207 LEN(4); /* unblock */
212 __data
= (uint8_t*)MALLOC(__len
);
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 */
224 if (__pos
!= __len
) {
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
);
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
,
247 uint8_t *__data
= NULL
;
251 LEN(8); /* context */
253 LEN(8); /* fragment */
254 LEN(8); /* texture */
255 LEN(8); /* surface */
261 __data
= (uint8_t*)MALLOC(__len
);
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 */
277 if (__pos
!= __len
) {
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
);
289 int rbug_send_context_flush(struct rbug_connection
*__con
,
290 rbug_context_t context
,
296 uint8_t *__data
= NULL
;
300 LEN(8); /* context */
306 __data
= (uint8_t*)MALLOC(__len
);
310 WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_FLUSH
));
311 WRITE(4, uint32_t, ((uint32_t)(__len
/ 4)));
312 WRITE(8, rbug_context_t
, context
); /* context */
313 WRITE(4, int32_t, flags
); /* flags */
318 if (__pos
!= __len
) {
321 rbug_connection_send_start(__con
, RBUG_OP_CONTEXT_FLUSH
, __len
);
322 rbug_connection_write(__con
, __data
, __len
);
323 __ret
= rbug_connection_send_finish(__con
, __serial
);
330 int rbug_send_context_list_reply(struct rbug_connection
*__con
,
332 rbug_context_t
*contexts
,
333 uint32_t contexts_len
,
338 uint8_t *__data
= NULL
;
343 LEN_ARRAY(8, contexts
); /* contexts */
348 __data
= (uint8_t*)MALLOC(__len
);
352 WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST_REPLY
));
353 WRITE(4, uint32_t, ((uint32_t)(__len
/ 4)));
354 WRITE(4, uint32_t, serial
); /* serial */
355 WRITE_ARRAY(8, rbug_context_t
, contexts
); /* contexts */
360 if (__pos
!= __len
) {
363 rbug_connection_send_start(__con
, RBUG_OP_CONTEXT_LIST_REPLY
, __len
);
364 rbug_connection_write(__con
, __data
, __len
);
365 __ret
= rbug_connection_send_finish(__con
, __serial
);
372 int rbug_send_context_info_reply(struct rbug_connection
*__con
,
374 rbug_shader_t vertex
,
375 rbug_shader_t fragment
,
376 rbug_texture_t
*texs
,
378 rbug_texture_t
*cbufs
,
380 rbug_texture_t zsbuf
,
381 rbug_block_t blocker
,
382 rbug_block_t blocked
,
387 uint8_t *__data
= NULL
;
393 LEN(8); /* fragment */
394 LEN_ARRAY(8, texs
); /* texs */
395 LEN_ARRAY(8, cbufs
); /* cbufs */
397 LEN(4); /* blocker */
398 LEN(4); /* blocked */
403 __data
= (uint8_t*)MALLOC(__len
);
407 WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO_REPLY
));
408 WRITE(4, uint32_t, ((uint32_t)(__len
/ 4)));
409 WRITE(4, uint32_t, serial
); /* serial */
410 WRITE(8, rbug_shader_t
, vertex
); /* vertex */
411 WRITE(8, rbug_shader_t
, fragment
); /* fragment */
412 WRITE_ARRAY(8, rbug_texture_t
, texs
); /* texs */
413 WRITE_ARRAY(8, rbug_texture_t
, cbufs
); /* cbufs */
414 WRITE(8, rbug_texture_t
, zsbuf
); /* zsbuf */
415 WRITE(4, rbug_block_t
, blocker
); /* blocker */
416 WRITE(4, rbug_block_t
, blocked
); /* blocked */
421 if (__pos
!= __len
) {
424 rbug_connection_send_start(__con
, RBUG_OP_CONTEXT_INFO_REPLY
, __len
);
425 rbug_connection_write(__con
, __data
, __len
);
426 __ret
= rbug_connection_send_finish(__con
, __serial
);
433 int rbug_send_context_draw_blocked(struct rbug_connection
*__con
,
434 rbug_context_t context
,
440 uint8_t *__data
= NULL
;
444 LEN(8); /* context */
450 __data
= (uint8_t*)MALLOC(__len
);
454 WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED
));
455 WRITE(4, uint32_t, ((uint32_t)(__len
/ 4)));
456 WRITE(8, rbug_context_t
, context
); /* context */
457 WRITE(4, rbug_block_t
, block
); /* block */
462 if (__pos
!= __len
) {
465 rbug_connection_send_start(__con
, RBUG_OP_CONTEXT_DRAW_BLOCKED
, __len
);
466 rbug_connection_write(__con
, __data
, __len
);
467 __ret
= rbug_connection_send_finish(__con
, __serial
);
474 struct rbug_proto_context_list
* rbug_demarshal_context_list(struct rbug_proto_header
*header
)
478 uint8_t *data
= NULL
;
479 struct rbug_proto_context_list
*ret
;
483 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_LIST
)
487 len
= header
->length
* 4;
488 data
= (uint8_t*)&header
[1];
489 ret
= MALLOC(sizeof(*ret
));
493 ret
->header
.__message
= header
;
494 ret
->header
.opcode
= header
->opcode
;
500 struct rbug_proto_context_info
* rbug_demarshal_context_info(struct rbug_proto_header
*header
)
504 uint8_t *data
= NULL
;
505 struct rbug_proto_context_info
*ret
;
509 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_INFO
)
513 len
= header
->length
* 4;
514 data
= (uint8_t*)&header
[1];
515 ret
= MALLOC(sizeof(*ret
));
519 ret
->header
.__message
= header
;
520 ret
->header
.opcode
= header
->opcode
;
522 READ(8, rbug_context_t
, context
); /* context */
527 struct rbug_proto_context_draw_block
* rbug_demarshal_context_draw_block(struct rbug_proto_header
*header
)
531 uint8_t *data
= NULL
;
532 struct rbug_proto_context_draw_block
*ret
;
536 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_DRAW_BLOCK
)
540 len
= header
->length
* 4;
541 data
= (uint8_t*)&header
[1];
542 ret
= MALLOC(sizeof(*ret
));
546 ret
->header
.__message
= header
;
547 ret
->header
.opcode
= header
->opcode
;
549 READ(8, rbug_context_t
, context
); /* context */
550 READ(4, rbug_block_t
, block
); /* block */
555 struct rbug_proto_context_draw_step
* rbug_demarshal_context_draw_step(struct rbug_proto_header
*header
)
559 uint8_t *data
= NULL
;
560 struct rbug_proto_context_draw_step
*ret
;
564 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_DRAW_STEP
)
568 len
= header
->length
* 4;
569 data
= (uint8_t*)&header
[1];
570 ret
= MALLOC(sizeof(*ret
));
574 ret
->header
.__message
= header
;
575 ret
->header
.opcode
= header
->opcode
;
577 READ(8, rbug_context_t
, context
); /* context */
578 READ(4, rbug_block_t
, step
); /* step */
583 struct rbug_proto_context_draw_unblock
* rbug_demarshal_context_draw_unblock(struct rbug_proto_header
*header
)
587 uint8_t *data
= NULL
;
588 struct rbug_proto_context_draw_unblock
*ret
;
592 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK
)
596 len
= header
->length
* 4;
597 data
= (uint8_t*)&header
[1];
598 ret
= MALLOC(sizeof(*ret
));
602 ret
->header
.__message
= header
;
603 ret
->header
.opcode
= header
->opcode
;
605 READ(8, rbug_context_t
, context
); /* context */
606 READ(4, rbug_block_t
, unblock
); /* unblock */
611 struct rbug_proto_context_draw_rule
* rbug_demarshal_context_draw_rule(struct rbug_proto_header
*header
)
615 uint8_t *data
= NULL
;
616 struct rbug_proto_context_draw_rule
*ret
;
620 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_DRAW_RULE
)
624 len
= header
->length
* 4;
625 data
= (uint8_t*)&header
[1];
626 ret
= MALLOC(sizeof(*ret
));
630 ret
->header
.__message
= header
;
631 ret
->header
.opcode
= header
->opcode
;
633 READ(8, rbug_context_t
, context
); /* context */
634 READ(8, rbug_shader_t
, vertex
); /* vertex */
635 READ(8, rbug_shader_t
, fragment
); /* fragment */
636 READ(8, rbug_texture_t
, texture
); /* texture */
637 READ(8, rbug_texture_t
, surface
); /* surface */
638 READ(4, rbug_block_t
, block
); /* block */
643 struct rbug_proto_context_flush
* rbug_demarshal_context_flush(struct rbug_proto_header
*header
)
647 uint8_t *data
= NULL
;
648 struct rbug_proto_context_flush
*ret
;
652 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_FLUSH
)
656 len
= header
->length
* 4;
657 data
= (uint8_t*)&header
[1];
658 ret
= MALLOC(sizeof(*ret
));
662 ret
->header
.__message
= header
;
663 ret
->header
.opcode
= header
->opcode
;
665 READ(8, rbug_context_t
, context
); /* context */
666 READ(4, int32_t, flags
); /* flags */
671 struct rbug_proto_context_list_reply
* rbug_demarshal_context_list_reply(struct rbug_proto_header
*header
)
675 uint8_t *data
= NULL
;
676 struct rbug_proto_context_list_reply
*ret
;
680 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_LIST_REPLY
)
684 len
= header
->length
* 4;
685 data
= (uint8_t*)&header
[1];
686 ret
= MALLOC(sizeof(*ret
));
690 ret
->header
.__message
= header
;
691 ret
->header
.opcode
= header
->opcode
;
693 READ(4, uint32_t, serial
); /* serial */
694 READ_ARRAY(8, rbug_context_t
, contexts
); /* contexts */
699 struct rbug_proto_context_info_reply
* rbug_demarshal_context_info_reply(struct rbug_proto_header
*header
)
703 uint8_t *data
= NULL
;
704 struct rbug_proto_context_info_reply
*ret
;
708 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_INFO_REPLY
)
712 len
= header
->length
* 4;
713 data
= (uint8_t*)&header
[1];
714 ret
= MALLOC(sizeof(*ret
));
718 ret
->header
.__message
= header
;
719 ret
->header
.opcode
= header
->opcode
;
721 READ(4, uint32_t, serial
); /* serial */
722 READ(8, rbug_shader_t
, vertex
); /* vertex */
723 READ(8, rbug_shader_t
, fragment
); /* fragment */
724 READ_ARRAY(8, rbug_texture_t
, texs
); /* texs */
725 READ_ARRAY(8, rbug_texture_t
, cbufs
); /* cbufs */
726 READ(8, rbug_texture_t
, zsbuf
); /* zsbuf */
727 READ(4, rbug_block_t
, blocker
); /* blocker */
728 READ(4, rbug_block_t
, blocked
); /* blocked */
733 struct rbug_proto_context_draw_blocked
* rbug_demarshal_context_draw_blocked(struct rbug_proto_header
*header
)
737 uint8_t *data
= NULL
;
738 struct rbug_proto_context_draw_blocked
*ret
;
742 if (header
->opcode
!= (int16_t)RBUG_OP_CONTEXT_DRAW_BLOCKED
)
746 len
= header
->length
* 4;
747 data
= (uint8_t*)&header
[1];
748 ret
= MALLOC(sizeof(*ret
));
752 ret
->header
.__message
= header
;
753 ret
->header
.opcode
= header
->opcode
;
755 READ(8, rbug_context_t
, context
); /* context */
756 READ(4, rbug_block_t
, block
); /* block */