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