1dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz/*
2dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * Copyright 2009 VMware, Inc.
3dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * All Rights Reserved.
4dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz *
5dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
6dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * copy of this software and associated documentation files (the "Software"),
7dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * to deal in the Software without restriction, including without limitation
8dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * on the rights to use, copy, modify, merge, publish, distribute, sub
9dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * license, and/or sell copies of the Software, and to permit persons to whom
10dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * the Software is furnished to do so, subject to the following conditions:
11dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz *
12dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * The above copyright notice and this permission notice (including the next
13dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * paragraph) shall be included in all copies or substantial portions of the
14dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * Software.
15dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz *
16dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * USE OR OTHER DEALINGS IN THE SOFTWARE.
23dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz */
24dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
25dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz/*
26dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * This file holds the function implementation for one of the rbug extensions.
27dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * Prototypes and declerations of functions and structs is in the same folder
28dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * in the header file matching this file's name.
29dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz *
30dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * The functions starting rbug_send_* encodes a call to the write format and
31dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * sends that to the supplied connection, while functions starting with
32dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * rbug_demarshal_* demarshal data in the wire protocol.
33dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz *
34dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz * Functions ending with _reply are replies to requests.
35dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz */
36dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
37dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz#include "rbug_internal.h"
38fc3bac8a407dc2a2804236e1e2b813a3991fa84fAaron Watry#include "rbug_context.h"
39dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
40dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzint rbug_send_context_list(struct rbug_connection *__con,
41dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                           uint32_t *__serial)
42dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
43dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
44dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
45dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
46dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
47dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
48dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
49dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
50dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
51dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
52dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
53dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
54dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
55dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
56dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
57dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST));
58dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
59dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
60dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
61dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
62dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
63dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
64dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
65dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
66dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST, __len);
67dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
68dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
69dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	}
70dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
71dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	FREE(__data);
72dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return __ret;
73dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
74dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
75dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzint rbug_send_context_info(struct rbug_connection *__con,
76dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                           rbug_context_t context,
77dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                           uint32_t *__serial)
78dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
79dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
80dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
81dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
82dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
83dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
84dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
85dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* context */
86dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
87dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
88dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
89dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
90dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
91dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
92dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
93dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
94dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO));
95dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
96dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
97dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
98dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
99dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
100dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
101dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
102dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
103dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
104dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO, __len);
105dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
106dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
107dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	}
108dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
109dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	FREE(__data);
110dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return __ret;
111dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
112dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
113384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzint rbug_send_context_draw_block(struct rbug_connection *__con,
114dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 rbug_context_t context,
115384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_block_t block,
116dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t *__serial)
117dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
118dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
119dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
120dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
121dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
122dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
123dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
124dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* context */
125384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* block */
126dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
127dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
128dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
129dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
130dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
131dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
132dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
133dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
134384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK));
135dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
136dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
137384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, block); /* block */
138dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
139dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
140dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
141dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
142dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
143dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
144dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
145384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCK, __len);
146dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
147dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
148dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	}
149dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
150dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	FREE(__data);
151dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return __ret;
152dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
153dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
154384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzint rbug_send_context_draw_step(struct rbug_connection *__con,
155384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                rbug_context_t context,
156384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                rbug_block_t step,
157384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                uint32_t *__serial)
158384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz{
159384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t __len = 0;
160384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t __pos = 0;
161384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint8_t *__data = NULL;
162384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	int __ret = 0;
163384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
164384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* header */
165384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* context */
166384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* step */
167384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
168384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	/* align */
169384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	PAD(__len, 8);
170384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
171384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
172384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!__data)
173384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return -ENOMEM;
174384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
175384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_STEP));
176384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
177384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
178384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, step); /* step */
179384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
180384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	/* final pad */
181384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	PAD(__pos, 8);
182384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
183384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (__pos != __len) {
184384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		__ret = -EINVAL;
185384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	} else {
186384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_STEP, __len);
187384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_write(__con, __data, __len);
188384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
189384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	}
190384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
191384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	FREE(__data);
192384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return __ret;
193384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
194384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
195384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzint rbug_send_context_draw_unblock(struct rbug_connection *__con,
196dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                   rbug_context_t context,
197384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                   rbug_block_t unblock,
198dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                   uint32_t *__serial)
199dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
200dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
201dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
202dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
203dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
204dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
205dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
206dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* context */
207384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* unblock */
208dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
209dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
210dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
211dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
212dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
213dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
214dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
215dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
216384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK));
217dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
218dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
219384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, unblock); /* unblock */
220dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
221dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
222dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
223dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
224dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
225dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
226dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
227384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_UNBLOCK, __len);
228384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_write(__con, __data, __len);
229384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
230384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	}
231384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
232384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	FREE(__data);
233384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return __ret;
234384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
235384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
236f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantzint rbug_send_context_draw_rule(struct rbug_connection *__con,
237f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_context_t context,
238f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_shader_t vertex,
239f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_shader_t fragment,
240f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_texture_t texture,
241f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_texture_t surface,
242f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                rbug_block_t block,
243f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                                uint32_t *__serial)
244f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz{
245f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t __len = 0;
246f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t __pos = 0;
247f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint8_t *__data = NULL;
248f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	int __ret = 0;
249f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
250f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* header */
251f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* context */
252f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* vertex */
253f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* fragment */
254f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* texture */
255f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* surface */
256f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(4); /* block */
257f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
258f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	/* align */
259f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	PAD(__len, 8);
260f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
261f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
262f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!__data)
263f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return -ENOMEM;
264f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
265f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_RULE));
266f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
267f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
268f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_shader_t, vertex); /* vertex */
269f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_shader_t, fragment); /* fragment */
270f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_texture_t, texture); /* texture */
271f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_texture_t, surface); /* surface */
272f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(4, rbug_block_t, block); /* block */
273f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
274f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	/* final pad */
275f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	PAD(__pos, 8);
276f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
277f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (__pos != __len) {
278f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		__ret = -EINVAL;
279f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	} else {
280f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_RULE, __len);
281f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
282f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
283f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	}
284f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
285f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	FREE(__data);
286f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	return __ret;
287f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz}
288f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
289f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantzint rbug_send_context_flush(struct rbug_connection *__con,
290f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                            rbug_context_t context,
291f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz                            uint32_t *__serial)
292f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz{
293f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t __len = 0;
294f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t __pos = 0;
295f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint8_t *__data = NULL;
296f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	int __ret = 0;
297f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
298f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* header */
299f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN(8); /* context */
300f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
301f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	/* align */
302f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	PAD(__len, 8);
303f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
304f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
305f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!__data)
306f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return -ENOMEM;
307f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
308f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_FLUSH));
309f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
310f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
311f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
312f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	/* final pad */
313f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	PAD(__pos, 8);
314f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
315f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (__pos != __len) {
316f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		__ret = -EINVAL;
317f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	} else {
318f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_FLUSH, __len);
319f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
320f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
321f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	}
322f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
323f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	FREE(__data);
324f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	return __ret;
325f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz}
326f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
327dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzint rbug_send_context_list_reply(struct rbug_connection *__con,
328dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t serial,
329dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 rbug_context_t *contexts,
330dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t contexts_len,
331dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t *__serial)
332dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
333dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
334dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
335dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
336dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
337dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
338dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
339dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(4); /* serial */
340dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN_ARRAY(8, contexts); /* contexts */
341dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
342dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
343dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
344dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
345dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
346dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
347dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
348dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
349dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST_REPLY));
350dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
351dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, serial); /* serial */
352dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE_ARRAY(8, rbug_context_t, contexts); /* contexts */
353dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
354dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
355dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
356dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
357dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
358dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
359dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
360dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST_REPLY, __len);
361dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
362dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
363dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	}
364dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
365dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	FREE(__data);
366dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return __ret;
367dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
368dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
369dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzint rbug_send_context_info_reply(struct rbug_connection *__con,
370dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t serial,
371384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_shader_t vertex,
372384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_shader_t fragment,
373f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz                                 rbug_texture_t *texs,
374f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz                                 uint32_t texs_len,
375dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 rbug_texture_t *cbufs,
376dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t cbufs_len,
377384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_texture_t zsbuf,
378384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_block_t blocker,
379384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                 rbug_block_t blocked,
380dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz                                 uint32_t *__serial)
381dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
382dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __len = 0;
383dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t __pos = 0;
384dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *__data = NULL;
385dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	int __ret = 0;
386dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
387dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(8); /* header */
388dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN(4); /* serial */
389384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* vertex */
390384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* fragment */
391f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	LEN_ARRAY(8, texs); /* texs */
392dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	LEN_ARRAY(8, cbufs); /* cbufs */
393384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* zsbuf */
394384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* blocker */
395384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* blocked */
396dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
397dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* align */
398dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__len, 8);
399dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
400dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
401dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!__data)
402dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return -ENOMEM;
403dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
404dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO_REPLY));
405dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
406dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE(4, uint32_t, serial); /* serial */
407384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(8, rbug_shader_t, vertex); /* vertex */
408384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(8, rbug_shader_t, fragment); /* fragment */
409f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	WRITE_ARRAY(8, rbug_texture_t, texs); /* texs */
410dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	WRITE_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
411384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(8, rbug_texture_t, zsbuf); /* zsbuf */
412384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, blocker); /* blocker */
413384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, blocked); /* blocked */
414dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
415dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	/* final pad */
416dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	PAD(__pos, 8);
417dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
418dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (__pos != __len) {
419dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = -EINVAL;
420dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	} else {
421dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO_REPLY, __len);
422dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		rbug_connection_write(__con, __data, __len);
423dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
424dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	}
425dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
426dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	FREE(__data);
427dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return __ret;
428dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
429dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
430384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzint rbug_send_context_draw_blocked(struct rbug_connection *__con,
431384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                   rbug_context_t context,
432384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                   rbug_block_t block,
433384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz                                   uint32_t *__serial)
434384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz{
435384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t __len = 0;
436384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t __pos = 0;
437384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint8_t *__data = NULL;
438384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	int __ret = 0;
439384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
440384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* header */
441384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(8); /* context */
442384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	LEN(4); /* block */
443384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
444384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	/* align */
445384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	PAD(__len, 8);
446384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
447384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	__data = (uint8_t*)MALLOC(__len);
448384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!__data)
449384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return -ENOMEM;
450384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
451384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED));
452384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
453384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(8, rbug_context_t, context); /* context */
454384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	WRITE(4, rbug_block_t, block); /* block */
455384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
456384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	/* final pad */
457384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	PAD(__pos, 8);
458384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
459384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (__pos != __len) {
460384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		__ret = -EINVAL;
461384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	} else {
462384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCKED, __len);
463384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		rbug_connection_write(__con, __data, __len);
464384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		__ret = rbug_connection_send_finish(__con, __serial);
465384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	}
466384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
467384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	FREE(__data);
468384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return __ret;
469384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
470384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
471dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzstruct rbug_proto_context_list * rbug_demarshal_context_list(struct rbug_proto_header *header)
472dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
473dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	struct rbug_proto_context_list *ret;
474dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
475dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!header)
476dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
4777faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST)
478dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
479dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
480dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
481dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!ret)
482dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
483dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
484dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.__message = header;
485dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.opcode = header->opcode;
486dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
487dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return ret;
488dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
489dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
490dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzstruct rbug_proto_context_info * rbug_demarshal_context_info(struct rbug_proto_header *header)
491dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
492dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t len = 0;
493dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t pos = 0;
494dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *data =  NULL;
495dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	struct rbug_proto_context_info *ret;
496dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
497dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!header)
498dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
4997faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO)
500dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
501dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
502dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	pos = 0;
503dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	len = header->length * 4;
504dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	data = (uint8_t*)&header[1];
505dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
506dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!ret)
507dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
508dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
509dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.__message = header;
510dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.opcode = header->opcode;
511dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
512dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
513dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
514dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return ret;
515dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
516dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
517384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzstruct rbug_proto_context_draw_block * rbug_demarshal_context_draw_block(struct rbug_proto_header *header)
518384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz{
519384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t len = 0;
520384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t pos = 0;
521384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint8_t *data =  NULL;
522384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	struct rbug_proto_context_draw_block *ret;
523384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
524384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!header)
525384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
5267faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK)
527384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
528384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
529384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	pos = 0;
530384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	len = header->length * 4;
531384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	data = (uint8_t*)&header[1];
532384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret = MALLOC(sizeof(*ret));
533384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!ret)
534384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
535384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
536384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.__message = header;
537384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.opcode = header->opcode;
538384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
539384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
540384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, block); /* block */
541384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
542384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return ret;
543384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
544384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
545384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzstruct rbug_proto_context_draw_step * rbug_demarshal_context_draw_step(struct rbug_proto_header *header)
546384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz{
547384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t len = 0;
548384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t pos = 0;
549384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint8_t *data =  NULL;
550384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	struct rbug_proto_context_draw_step *ret;
551384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
552384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!header)
553384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
5547faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_STEP)
555384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
556384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
557384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	pos = 0;
558384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	len = header->length * 4;
559384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	data = (uint8_t*)&header[1];
560384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret = MALLOC(sizeof(*ret));
561384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!ret)
562384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
563384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
564384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.__message = header;
565384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.opcode = header->opcode;
566384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
567384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
568384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, step); /* step */
569384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
570384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return ret;
571384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
572384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
573384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzstruct rbug_proto_context_draw_unblock * rbug_demarshal_context_draw_unblock(struct rbug_proto_header *header)
574dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
575dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t len = 0;
576dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t pos = 0;
577dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *data =  NULL;
578384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	struct rbug_proto_context_draw_unblock *ret;
579dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
580dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!header)
581dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
5827faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK)
583dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
584dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
585dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	pos = 0;
586dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	len = header->length * 4;
587dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	data = (uint8_t*)&header[1];
588dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
589dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!ret)
590dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
591dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
592dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.__message = header;
593dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.opcode = header->opcode;
594dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
595dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
596384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, unblock); /* unblock */
597dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
598dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return ret;
599dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
600dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
601f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantzstruct rbug_proto_context_draw_rule * rbug_demarshal_context_draw_rule(struct rbug_proto_header *header)
602f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz{
603f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t len = 0;
604f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t pos = 0;
605f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint8_t *data =  NULL;
606f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz	struct rbug_proto_context_draw_rule *ret;
607f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
608f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!header)
609f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
6107faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_RULE)
611f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
612f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
613f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	pos = 0;
614f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	len = header->length * 4;
615f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	data = (uint8_t*)&header[1];
616f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
617f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!ret)
618f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
619f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
620f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret->header.__message = header;
621f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret->header.opcode = header->opcode;
622f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
623f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
624f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_shader_t, vertex); /* vertex */
625f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_shader_t, fragment); /* fragment */
626f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_texture_t, texture); /* texture */
627f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_texture_t, surface); /* surface */
628f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(4, rbug_block_t, block); /* block */
629f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
630f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	return ret;
631f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz}
632f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
633f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantzstruct rbug_proto_context_flush * rbug_demarshal_context_flush(struct rbug_proto_header *header)
634f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz{
635f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t len = 0;
636f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint32_t pos = 0;
637f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	uint8_t *data =  NULL;
638f3cf3d2fc2c0cb09cb1c18c08a135009904166b7Jakob Bornecrantz	struct rbug_proto_context_flush *ret;
639f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
640f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!header)
641f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
6427faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_FLUSH)
643f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
644f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
645f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	pos = 0;
646f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	len = header->length * 4;
647f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	data = (uint8_t*)&header[1];
648f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
649f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	if (!ret)
650f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz		return NULL;
651f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
652f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret->header.__message = header;
653f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	ret->header.opcode = header->opcode;
654f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
655f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
656f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
657f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	return ret;
658f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz}
659f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz
660dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzstruct rbug_proto_context_list_reply * rbug_demarshal_context_list_reply(struct rbug_proto_header *header)
661dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
662dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t len = 0;
663dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t pos = 0;
664dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *data =  NULL;
665dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	struct rbug_proto_context_list_reply *ret;
666dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
667dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!header)
668dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
6697faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST_REPLY)
670dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
671dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
672dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	pos = 0;
673dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	len = header->length * 4;
674dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	data = (uint8_t*)&header[1];
675dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
676dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!ret)
677dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
678dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
679dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.__message = header;
680dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.opcode = header->opcode;
681dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
682dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ(4, uint32_t, serial); /* serial */
683dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ_ARRAY(8, rbug_context_t, contexts); /* contexts */
684dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
685dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return ret;
686dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
687dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
688dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantzstruct rbug_proto_context_info_reply * rbug_demarshal_context_info_reply(struct rbug_proto_header *header)
689dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz{
690dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t len = 0;
691dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint32_t pos = 0;
692dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	uint8_t *data =  NULL;
693dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	struct rbug_proto_context_info_reply *ret;
694dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
695dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!header)
696dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
6977faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO_REPLY)
698dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
699dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
700dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	pos = 0;
701dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	len = header->length * 4;
702dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	data = (uint8_t*)&header[1];
703dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret = MALLOC(sizeof(*ret));
704dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	if (!ret)
705dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz		return NULL;
706dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
707dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.__message = header;
708dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	ret->header.opcode = header->opcode;
709dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
710dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ(4, uint32_t, serial); /* serial */
711384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_shader_t, vertex); /* vertex */
712384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_shader_t, fragment); /* fragment */
713f0c21c02945f8379decfa3b2f294651d6b5af8efJakob Bornecrantz	READ_ARRAY(8, rbug_texture_t, texs); /* texs */
714dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	READ_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
715384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_texture_t, zsbuf); /* zsbuf */
716384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, blocker); /* blocker */
717384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, blocked); /* blocked */
718384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
719384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	return ret;
720384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz}
721384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
722384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantzstruct rbug_proto_context_draw_blocked * rbug_demarshal_context_draw_blocked(struct rbug_proto_header *header)
723384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz{
724384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t len = 0;
725384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint32_t pos = 0;
726384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	uint8_t *data =  NULL;
727384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	struct rbug_proto_context_draw_blocked *ret;
728384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
729384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!header)
730384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
7317faa37adf84c7fdc393a0e795c924ea9b047f235Jakob Bornecrantz	if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED)
732384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
733384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
734384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	pos = 0;
735384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	len = header->length * 4;
736384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	data = (uint8_t*)&header[1];
737384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret = MALLOC(sizeof(*ret));
738384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	if (!ret)
739384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz		return NULL;
740384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
741384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.__message = header;
742384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	ret->header.opcode = header->opcode;
743384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz
744384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(8, rbug_context_t, context); /* context */
745384bbe278d7e634cf1af5f786bfbde651c14df62Jakob Bornecrantz	READ(4, rbug_block_t, block); /* block */
746dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz
747dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz	return ret;
748dfa4ebcbcc9c7e9e7562f73a4ddc367756623e5eJakob Bornecrantz}
749