Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/rbug/rbug_context.c
4561 views
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
750