xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_device_object.py (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker#Copyright 2021 Google LLC
2*bbecb9d1SAndroid Build Coastguard Worker#SPDX - License - Identifier : MIT
3*bbecb9d1SAndroid Build Coastguard Worker
4*bbecb9d1SAndroid Build Coastguard Workerimport argparse
5*bbecb9d1SAndroid Build Coastguard Workerimport json
6*bbecb9d1SAndroid Build Coastguard Workerimport os
7*bbecb9d1SAndroid Build Coastguard Worker
8*bbecb9d1SAndroid Build Coastguard WorkerSIMPLE_OBJECT_CREATE_DRIVER_HANDLE_TEMPL = '''
9*bbecb9d1SAndroid Build Coastguard Worker/* create a driver {vk_type} and update the vkr_{vkr_type} */
10*bbecb9d1SAndroid Build Coastguard Workerstatic inline VkResult
11*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_create_driver_handle(
12*bbecb9d1SAndroid Build Coastguard Worker   UNUSED struct vkr_context *ctx,
13*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args,
14*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_{vkr_type} *obj)
15*bbecb9d1SAndroid Build Coastguard Worker{{
16*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
17*bbecb9d1SAndroid Build Coastguard Worker   struct vn_device_proc_table *vk = &dev->proc_table;
18*bbecb9d1SAndroid Build Coastguard Worker
19*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
20*bbecb9d1SAndroid Build Coastguard Worker   vn_replace_{create_cmd}_args_handle(args);
21*bbecb9d1SAndroid Build Coastguard Worker   args->ret = vk->{proc_create}(args->device, args->{create_info}, NULL,
22*bbecb9d1SAndroid Build Coastguard Worker      &obj->base.handle.{vkr_type});
23*bbecb9d1SAndroid Build Coastguard Worker   return args->ret;
24*bbecb9d1SAndroid Build Coastguard Worker}}
25*bbecb9d1SAndroid Build Coastguard Worker'''
26*bbecb9d1SAndroid Build Coastguard Worker
27*bbecb9d1SAndroid Build Coastguard WorkerPOOL_OBJECT_CREATE_DRIVER_HANDLES_TEMPL = '''
28*bbecb9d1SAndroid Build Coastguard Worker/* create an array of driver {vk_type}s from a pool and update the
29*bbecb9d1SAndroid Build Coastguard Worker * object_array
30*bbecb9d1SAndroid Build Coastguard Worker */
31*bbecb9d1SAndroid Build Coastguard Workerstatic inline
32*bbecb9d1SAndroid Build Coastguard WorkerVkResult vkr_{create_func_name}_create_driver_handles(
33*bbecb9d1SAndroid Build Coastguard Worker   UNUSED struct vkr_context *ctx,
34*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args,
35*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr)
36*bbecb9d1SAndroid Build Coastguard Worker{{
37*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
38*bbecb9d1SAndroid Build Coastguard Worker   struct vn_device_proc_table *vk = &dev->proc_table;
39*bbecb9d1SAndroid Build Coastguard Worker
40*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
41*bbecb9d1SAndroid Build Coastguard Worker   vn_replace_{create_cmd}_args_handle(args);
42*bbecb9d1SAndroid Build Coastguard Worker   args->ret = vk->{proc_create}(args->device, args->{create_info},
43*bbecb9d1SAndroid Build Coastguard Worker      arr->handle_storage);
44*bbecb9d1SAndroid Build Coastguard Worker   return args->ret;
45*bbecb9d1SAndroid Build Coastguard Worker}}
46*bbecb9d1SAndroid Build Coastguard Worker'''
47*bbecb9d1SAndroid Build Coastguard Worker
48*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_CREATE_DRIVER_HANDLES_TEMPL = '''
49*bbecb9d1SAndroid Build Coastguard Worker/* create an array of driver {vk_type}s and update the object_array */
50*bbecb9d1SAndroid Build Coastguard Workerstatic inline VkResult
51*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_create_driver_handles(
52*bbecb9d1SAndroid Build Coastguard Worker   UNUSED struct vkr_context *ctx,
53*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args,
54*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr)
55*bbecb9d1SAndroid Build Coastguard Worker{{
56*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
57*bbecb9d1SAndroid Build Coastguard Worker   struct vn_device_proc_table *vk = &dev->proc_table;
58*bbecb9d1SAndroid Build Coastguard Worker
59*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
60*bbecb9d1SAndroid Build Coastguard Worker   vn_replace_{create_cmd}_args_handle(args);
61*bbecb9d1SAndroid Build Coastguard Worker   args->ret = vk->{proc_create}(args->device, args->{create_cache},
62*bbecb9d1SAndroid Build Coastguard Worker      args->{create_count}, args->{create_info}, NULL,
63*bbecb9d1SAndroid Build Coastguard Worker      arr->handle_storage);
64*bbecb9d1SAndroid Build Coastguard Worker   return args->ret;
65*bbecb9d1SAndroid Build Coastguard Worker}}
66*bbecb9d1SAndroid Build Coastguard Worker'''
67*bbecb9d1SAndroid Build Coastguard Worker
68*bbecb9d1SAndroid Build Coastguard WorkerSIMPLE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL = '''
69*bbecb9d1SAndroid Build Coastguard Worker/* destroy a driver {vk_type} */
70*bbecb9d1SAndroid Build Coastguard Workerstatic inline void
71*bbecb9d1SAndroid Build Coastguard Workervkr_{destroy_func_name}_destroy_driver_handle(
72*bbecb9d1SAndroid Build Coastguard Worker   UNUSED struct vkr_context *ctx,
73*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{destroy_cmd} *args)
74*bbecb9d1SAndroid Build Coastguard Worker{{
75*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
76*bbecb9d1SAndroid Build Coastguard Worker   struct vn_device_proc_table *vk = &dev->proc_table;
77*bbecb9d1SAndroid Build Coastguard Worker
78*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
79*bbecb9d1SAndroid Build Coastguard Worker   vn_replace_{destroy_cmd}_args_handle(args);
80*bbecb9d1SAndroid Build Coastguard Worker   vk->{proc_destroy}(args->device, args->{destroy_obj}, NULL);
81*bbecb9d1SAndroid Build Coastguard Worker}}
82*bbecb9d1SAndroid Build Coastguard Worker'''
83*bbecb9d1SAndroid Build Coastguard Worker
84*bbecb9d1SAndroid Build Coastguard WorkerPOOL_OBJECT_DESTROY_DRIVER_HANDLES_TEMPL = '''
85*bbecb9d1SAndroid Build Coastguard Worker/* destroy an array of driver {vk_type}s from a pool, remove them from the
86*bbecb9d1SAndroid Build Coastguard Worker * vkr_{pool_type}, and return the list of affected vkr_{vkr_type}s
87*bbecb9d1SAndroid Build Coastguard Worker */
88*bbecb9d1SAndroid Build Coastguard Workerstatic inline void
89*bbecb9d1SAndroid Build Coastguard Workervkr_{destroy_func_name}_destroy_driver_handles(
90*bbecb9d1SAndroid Build Coastguard Worker   UNUSED struct vkr_context *ctx,
91*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{destroy_cmd} *args,
92*bbecb9d1SAndroid Build Coastguard Worker   struct list_head *free_list)
93*bbecb9d1SAndroid Build Coastguard Worker{{
94*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
95*bbecb9d1SAndroid Build Coastguard Worker   struct vn_device_proc_table *vk = &dev->proc_table;
96*bbecb9d1SAndroid Build Coastguard Worker
97*bbecb9d1SAndroid Build Coastguard Worker   list_inithead(free_list);
98*bbecb9d1SAndroid Build Coastguard Worker   for (uint32_t i = 0; i < args->{destroy_count}; i++) {{
99*bbecb9d1SAndroid Build Coastguard Worker      struct vkr_{vkr_type} *obj =
100*bbecb9d1SAndroid Build Coastguard Worker         vkr_{vkr_type}_from_handle(args->{destroy_objs}[i]);
101*bbecb9d1SAndroid Build Coastguard Worker      if (!obj)
102*bbecb9d1SAndroid Build Coastguard Worker         continue;
103*bbecb9d1SAndroid Build Coastguard Worker
104*bbecb9d1SAndroid Build Coastguard Worker      list_del(&obj->base.track_head);
105*bbecb9d1SAndroid Build Coastguard Worker      list_addtail(&obj->base.track_head, free_list);
106*bbecb9d1SAndroid Build Coastguard Worker   }}
107*bbecb9d1SAndroid Build Coastguard Worker
108*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
109*bbecb9d1SAndroid Build Coastguard Worker   vn_replace_{destroy_cmd}_args_handle(args);
110*bbecb9d1SAndroid Build Coastguard Worker   vk->{proc_destroy}(args->device, args->{destroy_pool},
111*bbecb9d1SAndroid Build Coastguard Worker      args->{destroy_count}, args->{destroy_objs});
112*bbecb9d1SAndroid Build Coastguard Worker}}
113*bbecb9d1SAndroid Build Coastguard Worker'''
114*bbecb9d1SAndroid Build Coastguard Worker
115*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL = SIMPLE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL
116*bbecb9d1SAndroid Build Coastguard Worker
117*bbecb9d1SAndroid Build Coastguard WorkerCOMMON_OBJECT_INIT_ARRAY_TEMPL = '''
118*bbecb9d1SAndroid Build Coastguard Worker/* initialize an object_array for vkr_{vkr_type}s */
119*bbecb9d1SAndroid Build Coastguard Workerstatic inline VkResult
120*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_init_array(
121*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
122*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args,
123*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr)
124*bbecb9d1SAndroid Build Coastguard Worker{{
125*bbecb9d1SAndroid Build Coastguard Worker   args->ret = object_array_init(ctx, arr, args->{create_count},
126*bbecb9d1SAndroid Build Coastguard Worker                                 {vk_enum}, sizeof(struct vkr_{vkr_type}),
127*bbecb9d1SAndroid Build Coastguard Worker                                 sizeof(*args->{create_objs}),
128*bbecb9d1SAndroid Build Coastguard Worker                                 args->{create_objs})
129*bbecb9d1SAndroid Build Coastguard Worker                  ? VK_SUCCESS
130*bbecb9d1SAndroid Build Coastguard Worker                  : VK_ERROR_OUT_OF_HOST_MEMORY;
131*bbecb9d1SAndroid Build Coastguard Worker   return args->ret;
132*bbecb9d1SAndroid Build Coastguard Worker}}
133*bbecb9d1SAndroid Build Coastguard Worker'''
134*bbecb9d1SAndroid Build Coastguard Worker
135*bbecb9d1SAndroid Build Coastguard WorkerPOOL_OBJECT_INIT_ARRAY_TEMPL = COMMON_OBJECT_INIT_ARRAY_TEMPL
136*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_INIT_ARRAY_TEMPL = COMMON_OBJECT_INIT_ARRAY_TEMPL
137*bbecb9d1SAndroid Build Coastguard Worker
138*bbecb9d1SAndroid Build Coastguard WorkerSIMPLE_OBJECT_CREATE_TEMPL = '''
139*bbecb9d1SAndroid Build Coastguard Worker/* create a vkr_{vkr_type} */
140*bbecb9d1SAndroid Build Coastguard Workerstatic inline struct vkr_{vkr_type} *
141*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_create(
142*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
143*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args)
144*bbecb9d1SAndroid Build Coastguard Worker{{
145*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_{vkr_type} *obj = vkr_context_alloc_object(ctx, sizeof(*obj),
146*bbecb9d1SAndroid Build Coastguard Worker      {vk_enum}, args->{create_obj});
147*bbecb9d1SAndroid Build Coastguard Worker   if (!obj) {{
148*bbecb9d1SAndroid Build Coastguard Worker      args->ret = VK_ERROR_OUT_OF_HOST_MEMORY;
149*bbecb9d1SAndroid Build Coastguard Worker      return NULL;
150*bbecb9d1SAndroid Build Coastguard Worker   }}
151*bbecb9d1SAndroid Build Coastguard Worker
152*bbecb9d1SAndroid Build Coastguard Worker   /* handles in args are replaced */
153*bbecb9d1SAndroid Build Coastguard Worker   if (vkr_{create_func_name}_create_driver_handle(ctx, args, obj) != VK_SUCCESS) {{
154*bbecb9d1SAndroid Build Coastguard Worker      free(obj);
155*bbecb9d1SAndroid Build Coastguard Worker      return NULL;
156*bbecb9d1SAndroid Build Coastguard Worker   }}
157*bbecb9d1SAndroid Build Coastguard Worker
158*bbecb9d1SAndroid Build Coastguard Worker   return obj;
159*bbecb9d1SAndroid Build Coastguard Worker}}
160*bbecb9d1SAndroid Build Coastguard Worker'''
161*bbecb9d1SAndroid Build Coastguard Worker
162*bbecb9d1SAndroid Build Coastguard WorkerCOMMON_OBJECT_CREATE_ARRAY_TEMPL = '''
163*bbecb9d1SAndroid Build Coastguard Worker/* create an array of vkr_{vkr_type}s */
164*bbecb9d1SAndroid Build Coastguard Workerstatic inline VkResult
165*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_create_array(
166*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
167*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args,
168*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr)
169*bbecb9d1SAndroid Build Coastguard Worker{{
170*bbecb9d1SAndroid Build Coastguard Worker   if (vkr_{create_func_name}_init_array(ctx, args, arr) != VK_SUCCESS)
171*bbecb9d1SAndroid Build Coastguard Worker      return args->ret;
172*bbecb9d1SAndroid Build Coastguard Worker
173*bbecb9d1SAndroid Build Coastguard Worker   if (vkr_{create_func_name}_create_driver_handles(ctx, args, arr) < VK_SUCCESS) {{
174*bbecb9d1SAndroid Build Coastguard Worker      /* In case the client expects a reply, clear all returned handles to
175*bbecb9d1SAndroid Build Coastguard Worker       * VK_NULL_HANDLE.
176*bbecb9d1SAndroid Build Coastguard Worker       */
177*bbecb9d1SAndroid Build Coastguard Worker      memset(args->{create_objs}, 0,
178*bbecb9d1SAndroid Build Coastguard Worker             args->{create_count} * sizeof(args->{create_objs}[0]));
179*bbecb9d1SAndroid Build Coastguard Worker      object_array_fini(arr);
180*bbecb9d1SAndroid Build Coastguard Worker      return args->ret;
181*bbecb9d1SAndroid Build Coastguard Worker   }}
182*bbecb9d1SAndroid Build Coastguard Worker
183*bbecb9d1SAndroid Build Coastguard Worker   return args->ret;
184*bbecb9d1SAndroid Build Coastguard Worker}}
185*bbecb9d1SAndroid Build Coastguard Worker'''
186*bbecb9d1SAndroid Build Coastguard Worker
187*bbecb9d1SAndroid Build Coastguard WorkerPOOL_OBJECT_CREATE_ARRAY_TEMPL = COMMON_OBJECT_CREATE_ARRAY_TEMPL
188*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_CREATE_ARRAY_TEMPL = COMMON_OBJECT_CREATE_ARRAY_TEMPL
189*bbecb9d1SAndroid Build Coastguard Worker
190*bbecb9d1SAndroid Build Coastguard WorkerSIMPLE_OBJECT_CREATE_AND_ADD_TEMPL = '''
191*bbecb9d1SAndroid Build Coastguard Worker/* create a vkr_{vkr_type} and add it to the vkr_device */
192*bbecb9d1SAndroid Build Coastguard Workerstatic inline struct vkr_{vkr_type} *
193*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_create_and_add(
194*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
195*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{create_cmd} *args)
196*bbecb9d1SAndroid Build Coastguard Worker{{
197*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
198*bbecb9d1SAndroid Build Coastguard Worker
199*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_{vkr_type} *obj = vkr_{create_func_name}_create(ctx, args);
200*bbecb9d1SAndroid Build Coastguard Worker   if (!obj)
201*bbecb9d1SAndroid Build Coastguard Worker      return NULL;
202*bbecb9d1SAndroid Build Coastguard Worker
203*bbecb9d1SAndroid Build Coastguard Worker   vkr_device_add_object(ctx, dev, &obj->base);
204*bbecb9d1SAndroid Build Coastguard Worker   return obj;
205*bbecb9d1SAndroid Build Coastguard Worker}}
206*bbecb9d1SAndroid Build Coastguard Worker'''
207*bbecb9d1SAndroid Build Coastguard Worker
208*bbecb9d1SAndroid Build Coastguard WorkerPOOL_OBJECT_ADD_ARRAY_TEMPL = '''
209*bbecb9d1SAndroid Build Coastguard Worker/* steal vkr_{vkr_type}s from an object_array and add them to the
210*bbecb9d1SAndroid Build Coastguard Worker * vkr_{pool_type} and the context
211*bbecb9d1SAndroid Build Coastguard Worker */
212*bbecb9d1SAndroid Build Coastguard Workerstatic inline
213*bbecb9d1SAndroid Build Coastguard Workervoid vkr_{create_func_name}_add_array(
214*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
215*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev,
216*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_{pool_type} *pool,
217*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr)
218*bbecb9d1SAndroid Build Coastguard Worker{{
219*bbecb9d1SAndroid Build Coastguard Worker   for (uint32_t i = 0; i < arr->count; i++) {{
220*bbecb9d1SAndroid Build Coastguard Worker      struct vkr_{vkr_type} *obj = arr->objects[i];
221*bbecb9d1SAndroid Build Coastguard Worker
222*bbecb9d1SAndroid Build Coastguard Worker      obj->base.handle.{vkr_type} = (({vk_type} *)arr->handle_storage)[i];
223*bbecb9d1SAndroid Build Coastguard Worker      obj->device = dev;
224*bbecb9d1SAndroid Build Coastguard Worker
225*bbecb9d1SAndroid Build Coastguard Worker      /* pool objects are tracked by the pool other than the device */
226*bbecb9d1SAndroid Build Coastguard Worker      list_add(&obj->base.track_head, &pool->{vkr_type}s);
227*bbecb9d1SAndroid Build Coastguard Worker
228*bbecb9d1SAndroid Build Coastguard Worker      vkr_context_add_object(ctx, &obj->base);
229*bbecb9d1SAndroid Build Coastguard Worker   }}
230*bbecb9d1SAndroid Build Coastguard Worker
231*bbecb9d1SAndroid Build Coastguard Worker   arr->objects_stolen = true;
232*bbecb9d1SAndroid Build Coastguard Worker   object_array_fini(arr);
233*bbecb9d1SAndroid Build Coastguard Worker}}
234*bbecb9d1SAndroid Build Coastguard Worker'''
235*bbecb9d1SAndroid Build Coastguard Worker
236*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_ADD_ARRAY_TEMPL = '''
237*bbecb9d1SAndroid Build Coastguard Worker/* steal vkr_{vkr_type}s from an object_array and add them to the device */
238*bbecb9d1SAndroid Build Coastguard Workerstatic inline void
239*bbecb9d1SAndroid Build Coastguard Workervkr_{create_func_name}_add_array(
240*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
241*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev,
242*bbecb9d1SAndroid Build Coastguard Worker   struct object_array *arr,
243*bbecb9d1SAndroid Build Coastguard Worker   {vk_type} *args_{create_objs})
244*bbecb9d1SAndroid Build Coastguard Worker{{
245*bbecb9d1SAndroid Build Coastguard Worker   for (uint32_t i = 0; i < arr->count; i++) {{
246*bbecb9d1SAndroid Build Coastguard Worker      struct vkr_{vkr_type} *obj = arr->objects[i];
247*bbecb9d1SAndroid Build Coastguard Worker
248*bbecb9d1SAndroid Build Coastguard Worker      obj->base.handle.{vkr_type} = (({vk_type} *)arr->handle_storage)[i];
249*bbecb9d1SAndroid Build Coastguard Worker
250*bbecb9d1SAndroid Build Coastguard Worker      /* Individual pipelines may fail creation. */
251*bbecb9d1SAndroid Build Coastguard Worker      if (obj->base.handle.{vkr_type} == VK_NULL_HANDLE) {{
252*bbecb9d1SAndroid Build Coastguard Worker         free(obj);
253*bbecb9d1SAndroid Build Coastguard Worker         arr->objects[i] = NULL;
254*bbecb9d1SAndroid Build Coastguard Worker         args_{create_objs}[i] = VK_NULL_HANDLE;
255*bbecb9d1SAndroid Build Coastguard Worker      }} else {{
256*bbecb9d1SAndroid Build Coastguard Worker         vkr_device_add_object(ctx, dev, &obj->base);
257*bbecb9d1SAndroid Build Coastguard Worker      }}
258*bbecb9d1SAndroid Build Coastguard Worker   }}
259*bbecb9d1SAndroid Build Coastguard Worker
260*bbecb9d1SAndroid Build Coastguard Worker   arr->objects_stolen = true;
261*bbecb9d1SAndroid Build Coastguard Worker   object_array_fini(arr);
262*bbecb9d1SAndroid Build Coastguard Worker}}
263*bbecb9d1SAndroid Build Coastguard Worker'''
264*bbecb9d1SAndroid Build Coastguard Worker
265*bbecb9d1SAndroid Build Coastguard WorkerSIMPLE_OBJECT_DESTROY_AND_REMOVE_TEMPL = '''
266*bbecb9d1SAndroid Build Coastguard Worker/* remove a vkr_{vkr_type} from the device and destroy it */
267*bbecb9d1SAndroid Build Coastguard Workerstatic inline void
268*bbecb9d1SAndroid Build Coastguard Workervkr_{destroy_func_name}_destroy_and_remove(
269*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_context *ctx,
270*bbecb9d1SAndroid Build Coastguard Worker   struct vn_command_{destroy_cmd} *args)
271*bbecb9d1SAndroid Build Coastguard Worker{{
272*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_device *dev = vkr_device_from_handle(args->device);
273*bbecb9d1SAndroid Build Coastguard Worker   struct vkr_{vkr_type} *obj = vkr_{vkr_type}_from_handle(args->{destroy_obj});
274*bbecb9d1SAndroid Build Coastguard Worker   if (!obj)
275*bbecb9d1SAndroid Build Coastguard Worker      return;
276*bbecb9d1SAndroid Build Coastguard Worker
277*bbecb9d1SAndroid Build Coastguard Worker   vkr_{destroy_func_name}_destroy_driver_handle(ctx, args);
278*bbecb9d1SAndroid Build Coastguard Worker
279*bbecb9d1SAndroid Build Coastguard Worker   vkr_device_remove_object(ctx, dev, &obj->base);
280*bbecb9d1SAndroid Build Coastguard Worker}}
281*bbecb9d1SAndroid Build Coastguard Worker'''
282*bbecb9d1SAndroid Build Coastguard Worker
283*bbecb9d1SAndroid Build Coastguard WorkerPIPELINE_OBJECT_DESTROY_AND_REMOVE_TEMPL = SIMPLE_OBJECT_DESTROY_AND_REMOVE_TEMPL
284*bbecb9d1SAndroid Build Coastguard Worker
285*bbecb9d1SAndroid Build Coastguard Workerdef apply_variant(json_obj, json_variant):
286*bbecb9d1SAndroid Build Coastguard Worker    tmp_obj = json_obj.copy()
287*bbecb9d1SAndroid Build Coastguard Worker    for key, val in json_variant.items():
288*bbecb9d1SAndroid Build Coastguard Worker        tmp_obj[key] = val
289*bbecb9d1SAndroid Build Coastguard Worker    return tmp_obj
290*bbecb9d1SAndroid Build Coastguard Worker
291*bbecb9d1SAndroid Build Coastguard Workerdef simple_object_generator(json_obj):
292*bbecb9d1SAndroid Build Coastguard Worker    '''Generate functions for a simple object.
293*bbecb9d1SAndroid Build Coastguard Worker
294*bbecb9d1SAndroid Build Coastguard Worker    For most device objects, object creation can be broken down into 3 steps
295*bbecb9d1SAndroid Build Coastguard Worker
296*bbecb9d1SAndroid Build Coastguard Worker     (1) allocate and initialize the object
297*bbecb9d1SAndroid Build Coastguard Worker     (2) create the driver handle
298*bbecb9d1SAndroid Build Coastguard Worker     (3) add the object to the device and the object table
299*bbecb9d1SAndroid Build Coastguard Worker
300*bbecb9d1SAndroid Build Coastguard Worker    SIMPLE_OBJECT_CREATE_DRIVER_HANDLE_TEMPL defines a function for (2).
301*bbecb9d1SAndroid Build Coastguard Worker    SIMPLE_OBJECT_CREATE_TEMPL defines a function for (1) and (2).
302*bbecb9d1SAndroid Build Coastguard Worker    SIMPLE_OBJECT_CREATE_AND_ADD_TEMPL defines a function for all steps.
303*bbecb9d1SAndroid Build Coastguard Worker
304*bbecb9d1SAndroid Build Coastguard Worker    Object destruction can be broken down into 2 steps
305*bbecb9d1SAndroid Build Coastguard Worker
306*bbecb9d1SAndroid Build Coastguard Worker     (1) destroy the driver handle
307*bbecb9d1SAndroid Build Coastguard Worker     (2) remove the object from the device and the object table
308*bbecb9d1SAndroid Build Coastguard Worker
309*bbecb9d1SAndroid Build Coastguard Worker    SIMPLE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL defines a function for (1).
310*bbecb9d1SAndroid Build Coastguard Worker    SIMPLE_OBJECT_DESTROY_AND_REMOVE_TEMPL defines a function for both steps.
311*bbecb9d1SAndroid Build Coastguard Worker    '''
312*bbecb9d1SAndroid Build Coastguard Worker    contents = ''
313*bbecb9d1SAndroid Build Coastguard Worker
314*bbecb9d1SAndroid Build Coastguard Worker    contents += SIMPLE_OBJECT_CREATE_DRIVER_HANDLE_TEMPL.format(**json_obj)
315*bbecb9d1SAndroid Build Coastguard Worker    contents += SIMPLE_OBJECT_CREATE_TEMPL.format(**json_obj)
316*bbecb9d1SAndroid Build Coastguard Worker    contents += SIMPLE_OBJECT_CREATE_AND_ADD_TEMPL.format(**json_obj)
317*bbecb9d1SAndroid Build Coastguard Worker
318*bbecb9d1SAndroid Build Coastguard Worker    contents += SIMPLE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL.format(**json_obj)
319*bbecb9d1SAndroid Build Coastguard Worker    contents += SIMPLE_OBJECT_DESTROY_AND_REMOVE_TEMPL.format(**json_obj)
320*bbecb9d1SAndroid Build Coastguard Worker
321*bbecb9d1SAndroid Build Coastguard Worker    for json_variant in json_obj['variants']:
322*bbecb9d1SAndroid Build Coastguard Worker        tmp_obj = apply_variant(json_obj, json_variant)
323*bbecb9d1SAndroid Build Coastguard Worker        contents += SIMPLE_OBJECT_CREATE_DRIVER_HANDLE_TEMPL.format(**tmp_obj)
324*bbecb9d1SAndroid Build Coastguard Worker        contents += SIMPLE_OBJECT_CREATE_TEMPL.format(**tmp_obj)
325*bbecb9d1SAndroid Build Coastguard Worker        contents += SIMPLE_OBJECT_CREATE_AND_ADD_TEMPL.format(**tmp_obj)
326*bbecb9d1SAndroid Build Coastguard Worker
327*bbecb9d1SAndroid Build Coastguard Worker    return contents
328*bbecb9d1SAndroid Build Coastguard Worker
329*bbecb9d1SAndroid Build Coastguard Workerdef pool_object_generator(json_obj):
330*bbecb9d1SAndroid Build Coastguard Worker    '''Generate functions for a pool object.
331*bbecb9d1SAndroid Build Coastguard Worker
332*bbecb9d1SAndroid Build Coastguard Worker    For VkCommandBuffer and VkDescriptorSet, object creation can be broken down
333*bbecb9d1SAndroid Build Coastguard Worker    into 3 steps
334*bbecb9d1SAndroid Build Coastguard Worker
335*bbecb9d1SAndroid Build Coastguard Worker     (1) allocate and initialize the object array
336*bbecb9d1SAndroid Build Coastguard Worker     (2) create the driver handles
337*bbecb9d1SAndroid Build Coastguard Worker     (3) add the object array to the device and the object table
338*bbecb9d1SAndroid Build Coastguard Worker
339*bbecb9d1SAndroid Build Coastguard Worker    POOL_OBJECT_INIT_ARRAY_TEMPL defines a function for (1).
340*bbecb9d1SAndroid Build Coastguard Worker    POOL_OBJECT_CREATE_DRIVER_HANDLES_TEMPL defines a function for (2).
341*bbecb9d1SAndroid Build Coastguard Worker    POOL_OBJECT_CREATE_ARRAY_TEMPL defines a function for (1) and (2).
342*bbecb9d1SAndroid Build Coastguard Worker    POOL_OBJECT_ADD_ARRAY_TEMPL defines a function for step (3).
343*bbecb9d1SAndroid Build Coastguard Worker
344*bbecb9d1SAndroid Build Coastguard Worker    Object destruction can be broken down into 2 steps
345*bbecb9d1SAndroid Build Coastguard Worker
346*bbecb9d1SAndroid Build Coastguard Worker     (1) destroy the driver handles
347*bbecb9d1SAndroid Build Coastguard Worker     (2) remove the objects from the pool and the object table
348*bbecb9d1SAndroid Build Coastguard Worker
349*bbecb9d1SAndroid Build Coastguard Worker    POOL_OBJECT_DESTROY_DRIVER_HANDLES_TEMPL defines a function for (1) and
350*bbecb9d1SAndroid Build Coastguard Worker    the first half of (2).
351*bbecb9d1SAndroid Build Coastguard Worker    '''
352*bbecb9d1SAndroid Build Coastguard Worker    contents = ''
353*bbecb9d1SAndroid Build Coastguard Worker
354*bbecb9d1SAndroid Build Coastguard Worker    contents += POOL_OBJECT_INIT_ARRAY_TEMPL.format(**json_obj)
355*bbecb9d1SAndroid Build Coastguard Worker    contents += POOL_OBJECT_CREATE_DRIVER_HANDLES_TEMPL.format(**json_obj)
356*bbecb9d1SAndroid Build Coastguard Worker    contents += POOL_OBJECT_CREATE_ARRAY_TEMPL.format(**json_obj)
357*bbecb9d1SAndroid Build Coastguard Worker    contents += POOL_OBJECT_ADD_ARRAY_TEMPL.format(**json_obj)
358*bbecb9d1SAndroid Build Coastguard Worker
359*bbecb9d1SAndroid Build Coastguard Worker    contents += POOL_OBJECT_DESTROY_DRIVER_HANDLES_TEMPL.format(**json_obj)
360*bbecb9d1SAndroid Build Coastguard Worker
361*bbecb9d1SAndroid Build Coastguard Worker    assert not json_obj['variants']
362*bbecb9d1SAndroid Build Coastguard Worker
363*bbecb9d1SAndroid Build Coastguard Worker    return contents
364*bbecb9d1SAndroid Build Coastguard Worker
365*bbecb9d1SAndroid Build Coastguard Workerdef pipeline_object_generator(json_obj):
366*bbecb9d1SAndroid Build Coastguard Worker    '''Generate functions for a pipeline object.
367*bbecb9d1SAndroid Build Coastguard Worker
368*bbecb9d1SAndroid Build Coastguard Worker    For VkPipeline, object creation can be broken down into 3 steps
369*bbecb9d1SAndroid Build Coastguard Worker
370*bbecb9d1SAndroid Build Coastguard Worker     (1) allocate and initialize the object array
371*bbecb9d1SAndroid Build Coastguard Worker     (2) create the driver handles
372*bbecb9d1SAndroid Build Coastguard Worker     (3) add the object array to the device and the object table
373*bbecb9d1SAndroid Build Coastguard Worker
374*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_INIT_ARRAY_TEMPL defines a function for (1).
375*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_CREATE_DRIVER_HANDLES_TEMPL defines a function for (2).
376*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_CREATE_ARRAY_TEMPL defines a function for (1) and (2).
377*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_ADD_ARRAY_TEMPL defines a function for step (3).
378*bbecb9d1SAndroid Build Coastguard Worker
379*bbecb9d1SAndroid Build Coastguard Worker    Object destruction can be broken down into 2 steps
380*bbecb9d1SAndroid Build Coastguard Worker
381*bbecb9d1SAndroid Build Coastguard Worker     (1) destroy the driver handle
382*bbecb9d1SAndroid Build Coastguard Worker     (2) remove the object from the device and the object table
383*bbecb9d1SAndroid Build Coastguard Worker
384*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL defines a function for (1).
385*bbecb9d1SAndroid Build Coastguard Worker    PIPELINE_OBJECT_DESTROY_AND_REMOVE_TEMPL defines a function for both steps.
386*bbecb9d1SAndroid Build Coastguard Worker    '''
387*bbecb9d1SAndroid Build Coastguard Worker    contents = ''
388*bbecb9d1SAndroid Build Coastguard Worker
389*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_INIT_ARRAY_TEMPL.format(**json_obj)
390*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_CREATE_DRIVER_HANDLES_TEMPL.format(**json_obj)
391*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_CREATE_ARRAY_TEMPL.format(**json_obj)
392*bbecb9d1SAndroid Build Coastguard Worker
393*bbecb9d1SAndroid Build Coastguard Worker    # shared by both graphics and compute
394*bbecb9d1SAndroid Build Coastguard Worker    tmp_obj = json_obj.copy()
395*bbecb9d1SAndroid Build Coastguard Worker    tmp_obj['create_func_name'] = tmp_obj['vkr_type']
396*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_ADD_ARRAY_TEMPL.format(**tmp_obj)
397*bbecb9d1SAndroid Build Coastguard Worker
398*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_DESTROY_DRIVER_HANDLE_TEMPL.format(**json_obj)
399*bbecb9d1SAndroid Build Coastguard Worker    contents += PIPELINE_OBJECT_DESTROY_AND_REMOVE_TEMPL.format(**json_obj)
400*bbecb9d1SAndroid Build Coastguard Worker
401*bbecb9d1SAndroid Build Coastguard Worker    for json_variant in json_obj['variants']:
402*bbecb9d1SAndroid Build Coastguard Worker        tmp_obj = apply_variant(json_obj, json_variant)
403*bbecb9d1SAndroid Build Coastguard Worker        contents += PIPELINE_OBJECT_INIT_ARRAY_TEMPL.format(**tmp_obj)
404*bbecb9d1SAndroid Build Coastguard Worker        contents += PIPELINE_OBJECT_CREATE_DRIVER_HANDLES_TEMPL.format(**tmp_obj)
405*bbecb9d1SAndroid Build Coastguard Worker        contents += PIPELINE_OBJECT_CREATE_ARRAY_TEMPL.format(**tmp_obj)
406*bbecb9d1SAndroid Build Coastguard Worker
407*bbecb9d1SAndroid Build Coastguard Worker    return contents
408*bbecb9d1SAndroid Build Coastguard Worker
409*bbecb9d1SAndroid Build Coastguard Workerobject_generators = {
410*bbecb9d1SAndroid Build Coastguard Worker    'simple-object': simple_object_generator,
411*bbecb9d1SAndroid Build Coastguard Worker    'pool-object': pool_object_generator,
412*bbecb9d1SAndroid Build Coastguard Worker    'pipeline-object': pipeline_object_generator,
413*bbecb9d1SAndroid Build Coastguard Worker}
414*bbecb9d1SAndroid Build Coastguard Worker
415*bbecb9d1SAndroid Build Coastguard WorkerFILE_HEADER_TEMPL = '''
416*bbecb9d1SAndroid Build Coastguard Worker/* This file is generated by {script}. */
417*bbecb9d1SAndroid Build Coastguard Worker
418*bbecb9d1SAndroid Build Coastguard Worker#ifndef {guard}
419*bbecb9d1SAndroid Build Coastguard Worker#define {guard}
420*bbecb9d1SAndroid Build Coastguard Worker
421*bbecb9d1SAndroid Build Coastguard Worker#include "vkr_common.h"
422*bbecb9d1SAndroid Build Coastguard Worker
423*bbecb9d1SAndroid Build Coastguard Worker{protocol_includes}
424*bbecb9d1SAndroid Build Coastguard Worker
425*bbecb9d1SAndroid Build Coastguard Worker#include "vkr_context.h"
426*bbecb9d1SAndroid Build Coastguard Worker#include "vkr_device.h"
427*bbecb9d1SAndroid Build Coastguard Worker'''
428*bbecb9d1SAndroid Build Coastguard Worker
429*bbecb9d1SAndroid Build Coastguard WorkerFILE_FOOTER_TEMPL = '''
430*bbecb9d1SAndroid Build Coastguard Worker#endif /* {guard} */
431*bbecb9d1SAndroid Build Coastguard Worker'''
432*bbecb9d1SAndroid Build Coastguard Worker
433*bbecb9d1SAndroid Build Coastguard Workerdef get_guard(filename):
434*bbecb9d1SAndroid Build Coastguard Worker    return filename.upper().translate(str.maketrans('.', '_'))
435*bbecb9d1SAndroid Build Coastguard Worker
436*bbecb9d1SAndroid Build Coastguard Workerdef file_header_generator(json_file):
437*bbecb9d1SAndroid Build Coastguard Worker    script = os.path.basename(__file__)
438*bbecb9d1SAndroid Build Coastguard Worker    guard = get_guard(json_file['filename'])
439*bbecb9d1SAndroid Build Coastguard Worker
440*bbecb9d1SAndroid Build Coastguard Worker    include_filenames = []
441*bbecb9d1SAndroid Build Coastguard Worker    for json_obj in json_file['objects']:
442*bbecb9d1SAndroid Build Coastguard Worker        name = 'venus-protocol/vn_protocol_renderer_{}.h'.format(
443*bbecb9d1SAndroid Build Coastguard Worker            json_obj['vkr_type'])
444*bbecb9d1SAndroid Build Coastguard Worker        include_filenames.append(name)
445*bbecb9d1SAndroid Build Coastguard Worker    protocol_includes = '#include "' + '"\n#include "'.join(include_filenames) + '"'
446*bbecb9d1SAndroid Build Coastguard Worker
447*bbecb9d1SAndroid Build Coastguard Worker    return FILE_HEADER_TEMPL.format(script=script, guard=guard,
448*bbecb9d1SAndroid Build Coastguard Worker            protocol_includes=protocol_includes).lstrip()
449*bbecb9d1SAndroid Build Coastguard Worker
450*bbecb9d1SAndroid Build Coastguard Workerdef file_footer_generator(json_file):
451*bbecb9d1SAndroid Build Coastguard Worker    guard = get_guard(json_file['filename'])
452*bbecb9d1SAndroid Build Coastguard Worker    return FILE_FOOTER_TEMPL.format(guard=guard)
453*bbecb9d1SAndroid Build Coastguard Worker
454*bbecb9d1SAndroid Build Coastguard Workerdef process_objects(json_objs):
455*bbecb9d1SAndroid Build Coastguard Worker    for json_obj in json_objs:
456*bbecb9d1SAndroid Build Coastguard Worker        json_obj.setdefault('create_func_name', json_obj['vkr_type'])
457*bbecb9d1SAndroid Build Coastguard Worker        json_obj.setdefault('destroy_func_name', json_obj['vkr_type'])
458*bbecb9d1SAndroid Build Coastguard Worker        json_obj.setdefault('variants', [])
459*bbecb9d1SAndroid Build Coastguard Worker        json_obj['proc_create'] = json_obj.get('create_cmd')[2:]
460*bbecb9d1SAndroid Build Coastguard Worker        json_obj['proc_destroy'] = json_obj.get('destroy_cmd')[2:]
461*bbecb9d1SAndroid Build Coastguard Worker        for variant in json_obj.get('variants'):
462*bbecb9d1SAndroid Build Coastguard Worker            if variant.get('create_cmd') != None:
463*bbecb9d1SAndroid Build Coastguard Worker                variant['proc_create'] = variant.get('create_cmd')[2:]
464*bbecb9d1SAndroid Build Coastguard Worker            if variant.get('destroy_cmd') != None:
465*bbecb9d1SAndroid Build Coastguard Worker                variant['proc_destroy'] = variant.get('create_cmd')[2:]
466*bbecb9d1SAndroid Build Coastguard Worker
467*bbecb9d1SAndroid Build Coastguard Workerdef file_generator(json_file):
468*bbecb9d1SAndroid Build Coastguard Worker    contents = file_header_generator(json_file)
469*bbecb9d1SAndroid Build Coastguard Worker    for json_obj in json_file['objects']:
470*bbecb9d1SAndroid Build Coastguard Worker        contents += object_generators[json_obj['generator']](json_obj)
471*bbecb9d1SAndroid Build Coastguard Worker    contents += file_footer_generator(json_file)
472*bbecb9d1SAndroid Build Coastguard Worker
473*bbecb9d1SAndroid Build Coastguard Worker    return contents
474*bbecb9d1SAndroid Build Coastguard Worker
475*bbecb9d1SAndroid Build Coastguard Workerdef parse_args():
476*bbecb9d1SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser()
477*bbecb9d1SAndroid Build Coastguard Worker    parser.add_argument('json', help='specifies the input JSON file')
478*bbecb9d1SAndroid Build Coastguard Worker    parser.add_argument('-o', '--output-dir', required=True,
479*bbecb9d1SAndroid Build Coastguard Worker            help='specifies output directory')
480*bbecb9d1SAndroid Build Coastguard Worker    return parser.parse_args()
481*bbecb9d1SAndroid Build Coastguard Worker
482*bbecb9d1SAndroid Build Coastguard Workerdef main():
483*bbecb9d1SAndroid Build Coastguard Worker    args = parse_args()
484*bbecb9d1SAndroid Build Coastguard Worker    with open(args.json) as f:
485*bbecb9d1SAndroid Build Coastguard Worker        json_files = json.load(f)
486*bbecb9d1SAndroid Build Coastguard Worker
487*bbecb9d1SAndroid Build Coastguard Worker    for json_file in json_files:
488*bbecb9d1SAndroid Build Coastguard Worker        process_objects(json_file['objects'])
489*bbecb9d1SAndroid Build Coastguard Worker
490*bbecb9d1SAndroid Build Coastguard Worker        output = os.path.join(args.output_dir, json_file['filename'])
491*bbecb9d1SAndroid Build Coastguard Worker        with open(output, 'wb') as f:
492*bbecb9d1SAndroid Build Coastguard Worker            contents = file_generator(json_file)
493*bbecb9d1SAndroid Build Coastguard Worker            f.write(contents.encode())
494*bbecb9d1SAndroid Build Coastguard Worker
495*bbecb9d1SAndroid Build Coastguard Workerif __name__ == '__main__':
496*bbecb9d1SAndroid Build Coastguard Worker    main()
497