xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_instance.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2020 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_instance.h"
7*bbecb9d1SAndroid Build Coastguard Worker 
8*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_instance.h"
9*bbecb9d1SAndroid Build Coastguard Worker 
10*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_context.h"
11*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_physical_device.h"
12*bbecb9d1SAndroid Build Coastguard Worker 
13*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkEnumerateInstanceVersion(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkEnumerateInstanceVersion * args)14*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkEnumerateInstanceVersion(UNUSED struct vn_dispatch_context *dispatch,
15*bbecb9d1SAndroid Build Coastguard Worker                                         struct vn_command_vkEnumerateInstanceVersion *args)
16*bbecb9d1SAndroid Build Coastguard Worker {
17*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkEnumerateInstanceVersion_args_handle(args);
18*bbecb9d1SAndroid Build Coastguard Worker 
19*bbecb9d1SAndroid Build Coastguard Worker    uint32_t version = 0;
20*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vkEnumerateInstanceVersion(&version);
21*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret == VK_SUCCESS)
22*bbecb9d1SAndroid Build Coastguard Worker       version = vkr_api_version_cap_minor(version, VKR_MAX_API_VERSION);
23*bbecb9d1SAndroid Build Coastguard Worker 
24*bbecb9d1SAndroid Build Coastguard Worker    *args->pApiVersion = version;
25*bbecb9d1SAndroid Build Coastguard Worker }
26*bbecb9d1SAndroid Build Coastguard Worker 
27*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkEnumerateInstanceExtensionProperties(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkEnumerateInstanceExtensionProperties * args)28*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkEnumerateInstanceExtensionProperties(
29*bbecb9d1SAndroid Build Coastguard Worker    UNUSED struct vn_dispatch_context *dispatch,
30*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkEnumerateInstanceExtensionProperties *args)
31*bbecb9d1SAndroid Build Coastguard Worker {
32*bbecb9d1SAndroid Build Coastguard Worker    VkExtensionProperties private_extensions[] = {
33*bbecb9d1SAndroid Build Coastguard Worker       {
34*bbecb9d1SAndroid Build Coastguard Worker          .extensionName = "VK_EXT_command_serialization",
35*bbecb9d1SAndroid Build Coastguard Worker       },
36*bbecb9d1SAndroid Build Coastguard Worker       {
37*bbecb9d1SAndroid Build Coastguard Worker          .extensionName = "VK_MESA_venus_protocol",
38*bbecb9d1SAndroid Build Coastguard Worker       },
39*bbecb9d1SAndroid Build Coastguard Worker    };
40*bbecb9d1SAndroid Build Coastguard Worker 
41*bbecb9d1SAndroid Build Coastguard Worker    if (!args->pProperties) {
42*bbecb9d1SAndroid Build Coastguard Worker       *args->pPropertyCount = ARRAY_SIZE(private_extensions);
43*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_SUCCESS;
44*bbecb9d1SAndroid Build Coastguard Worker       return;
45*bbecb9d1SAndroid Build Coastguard Worker    }
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < ARRAY_SIZE(private_extensions); i++) {
48*bbecb9d1SAndroid Build Coastguard Worker       VkExtensionProperties *props = &private_extensions[i];
49*bbecb9d1SAndroid Build Coastguard Worker       props->specVersion = vkr_extension_get_spec_version(props->extensionName);
50*bbecb9d1SAndroid Build Coastguard Worker    }
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker    const uint32_t count = MIN2(*args->pPropertyCount, ARRAY_SIZE(private_extensions));
53*bbecb9d1SAndroid Build Coastguard Worker    memcpy(args->pProperties, private_extensions, sizeof(*args->pProperties) * count);
54*bbecb9d1SAndroid Build Coastguard Worker    *args->pPropertyCount = count;
55*bbecb9d1SAndroid Build Coastguard Worker    args->ret = count == ARRAY_SIZE(private_extensions) ? VK_SUCCESS : VK_INCOMPLETE;
56*bbecb9d1SAndroid Build Coastguard Worker }
57*bbecb9d1SAndroid Build Coastguard Worker 
58*bbecb9d1SAndroid Build Coastguard Worker static VkBool32
vkr_validation_callback(UNUSED VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,UNUSED VkDebugUtilsMessageTypeFlagsEXT messageTypes,const VkDebugUtilsMessengerCallbackDataEXT * pCallbackData,void * pUserData)59*bbecb9d1SAndroid Build Coastguard Worker vkr_validation_callback(UNUSED VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
60*bbecb9d1SAndroid Build Coastguard Worker                         UNUSED VkDebugUtilsMessageTypeFlagsEXT messageTypes,
61*bbecb9d1SAndroid Build Coastguard Worker                         const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,
62*bbecb9d1SAndroid Build Coastguard Worker                         void *pUserData)
63*bbecb9d1SAndroid Build Coastguard Worker {
64*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = pUserData;
65*bbecb9d1SAndroid Build Coastguard Worker 
66*bbecb9d1SAndroid Build Coastguard Worker    vkr_log(pCallbackData->pMessage);
67*bbecb9d1SAndroid Build Coastguard Worker 
68*bbecb9d1SAndroid Build Coastguard Worker    if (!ctx->validate_fatal)
69*bbecb9d1SAndroid Build Coastguard Worker       return false;
70*bbecb9d1SAndroid Build Coastguard Worker 
71*bbecb9d1SAndroid Build Coastguard Worker    vkr_cs_decoder_set_fatal(&ctx->decoder);
72*bbecb9d1SAndroid Build Coastguard Worker 
73*bbecb9d1SAndroid Build Coastguard Worker    /* The spec says we "should" return false, because the meaning of true is
74*bbecb9d1SAndroid Build Coastguard Worker     * layer-defined and is reserved for layer development.  And we know that,
75*bbecb9d1SAndroid Build Coastguard Worker     * for VK_LAYER_KHRONOS_validation, the return value indicates whether the
76*bbecb9d1SAndroid Build Coastguard Worker     * call should be skipped.  Let's do it for now and seek advices.
77*bbecb9d1SAndroid Build Coastguard Worker     */
78*bbecb9d1SAndroid Build Coastguard Worker    return true;
79*bbecb9d1SAndroid Build Coastguard Worker }
80*bbecb9d1SAndroid Build Coastguard Worker 
81*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateInstance(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateInstance * args)82*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateInstance(struct vn_dispatch_context *dispatch,
83*bbecb9d1SAndroid Build Coastguard Worker                               struct vn_command_vkCreateInstance *args)
84*bbecb9d1SAndroid Build Coastguard Worker {
85*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
86*bbecb9d1SAndroid Build Coastguard Worker 
87*bbecb9d1SAndroid Build Coastguard Worker    if (ctx->instance) {
88*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
89*bbecb9d1SAndroid Build Coastguard Worker       return;
90*bbecb9d1SAndroid Build Coastguard Worker    }
91*bbecb9d1SAndroid Build Coastguard Worker 
92*bbecb9d1SAndroid Build Coastguard Worker    if (args->pCreateInfo->enabledLayerCount) {
93*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_ERROR_LAYER_NOT_PRESENT;
94*bbecb9d1SAndroid Build Coastguard Worker       return;
95*bbecb9d1SAndroid Build Coastguard Worker    }
96*bbecb9d1SAndroid Build Coastguard Worker 
97*bbecb9d1SAndroid Build Coastguard Worker    if (args->pCreateInfo->enabledExtensionCount) {
98*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_ERROR_EXTENSION_NOT_PRESENT;
99*bbecb9d1SAndroid Build Coastguard Worker       return;
100*bbecb9d1SAndroid Build Coastguard Worker    }
101*bbecb9d1SAndroid Build Coastguard Worker 
102*bbecb9d1SAndroid Build Coastguard Worker    uint32_t instance_version;
103*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vkEnumerateInstanceVersion(&instance_version);
104*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret != VK_SUCCESS)
105*bbecb9d1SAndroid Build Coastguard Worker       return;
106*bbecb9d1SAndroid Build Coastguard Worker 
107*bbecb9d1SAndroid Build Coastguard Worker    /* require Vulkan 1.1 */
108*bbecb9d1SAndroid Build Coastguard Worker    if (instance_version < VK_API_VERSION_1_1) {
109*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_ERROR_INITIALIZATION_FAILED;
110*bbecb9d1SAndroid Build Coastguard Worker       return;
111*bbecb9d1SAndroid Build Coastguard Worker    }
112*bbecb9d1SAndroid Build Coastguard Worker 
113*bbecb9d1SAndroid Build Coastguard Worker    VkInstanceCreateInfo *create_info = (VkInstanceCreateInfo *)args->pCreateInfo;
114*bbecb9d1SAndroid Build Coastguard Worker    const char *layer_names[8];
115*bbecb9d1SAndroid Build Coastguard Worker    const char *ext_names[8];
116*bbecb9d1SAndroid Build Coastguard Worker    uint32_t layer_count = 0;
117*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ext_count = 0;
118*bbecb9d1SAndroid Build Coastguard Worker 
119*bbecb9d1SAndroid Build Coastguard Worker    /* TODO enable more validation features */
120*bbecb9d1SAndroid Build Coastguard Worker    const VkValidationFeatureDisableEXT validation_feature_disables_on[] = {
121*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT,
122*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT,
123*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT,
124*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT,
125*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT,
126*bbecb9d1SAndroid Build Coastguard Worker    };
127*bbecb9d1SAndroid Build Coastguard Worker    /* we are single-threaded */
128*bbecb9d1SAndroid Build Coastguard Worker    const VkValidationFeatureDisableEXT validation_feature_disables_full[] = {
129*bbecb9d1SAndroid Build Coastguard Worker       VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT,
130*bbecb9d1SAndroid Build Coastguard Worker    };
131*bbecb9d1SAndroid Build Coastguard Worker    VkValidationFeaturesEXT validation_features;
132*bbecb9d1SAndroid Build Coastguard Worker    VkDebugUtilsMessengerCreateInfoEXT messenger_create_info;
133*bbecb9d1SAndroid Build Coastguard Worker    if (ctx->validate_level != VKR_CONTEXT_VALIDATE_NONE) {
134*bbecb9d1SAndroid Build Coastguard Worker       /* let vkCreateInstance return VK_ERROR_LAYER_NOT_PRESENT or
135*bbecb9d1SAndroid Build Coastguard Worker        * VK_ERROR_EXTENSION_NOT_PRESENT when the layer or extensions are
136*bbecb9d1SAndroid Build Coastguard Worker        * missing
137*bbecb9d1SAndroid Build Coastguard Worker        */
138*bbecb9d1SAndroid Build Coastguard Worker       layer_names[layer_count++] = "VK_LAYER_KHRONOS_validation";
139*bbecb9d1SAndroid Build Coastguard Worker       ext_names[ext_count++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
140*bbecb9d1SAndroid Build Coastguard Worker       ext_names[ext_count++] = VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME;
141*bbecb9d1SAndroid Build Coastguard Worker 
142*bbecb9d1SAndroid Build Coastguard Worker       validation_features = (const VkValidationFeaturesEXT){
143*bbecb9d1SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT,
144*bbecb9d1SAndroid Build Coastguard Worker          .pNext = create_info->pNext,
145*bbecb9d1SAndroid Build Coastguard Worker       };
146*bbecb9d1SAndroid Build Coastguard Worker       if (ctx->validate_level == VKR_CONTEXT_VALIDATE_ON) {
147*bbecb9d1SAndroid Build Coastguard Worker          validation_features.disabledValidationFeatureCount =
148*bbecb9d1SAndroid Build Coastguard Worker             ARRAY_SIZE(validation_feature_disables_on);
149*bbecb9d1SAndroid Build Coastguard Worker          validation_features.pDisabledValidationFeatures = validation_feature_disables_on;
150*bbecb9d1SAndroid Build Coastguard Worker       } else {
151*bbecb9d1SAndroid Build Coastguard Worker          validation_features.disabledValidationFeatureCount =
152*bbecb9d1SAndroid Build Coastguard Worker             ARRAY_SIZE(validation_feature_disables_full);
153*bbecb9d1SAndroid Build Coastguard Worker          validation_features.pDisabledValidationFeatures =
154*bbecb9d1SAndroid Build Coastguard Worker             validation_feature_disables_full;
155*bbecb9d1SAndroid Build Coastguard Worker       }
156*bbecb9d1SAndroid Build Coastguard Worker       messenger_create_info = (VkDebugUtilsMessengerCreateInfoEXT){
157*bbecb9d1SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
158*bbecb9d1SAndroid Build Coastguard Worker          .pNext = &validation_features,
159*bbecb9d1SAndroid Build Coastguard Worker          .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
160*bbecb9d1SAndroid Build Coastguard Worker          .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
161*bbecb9d1SAndroid Build Coastguard Worker          .pfnUserCallback = vkr_validation_callback,
162*bbecb9d1SAndroid Build Coastguard Worker          .pUserData = ctx,
163*bbecb9d1SAndroid Build Coastguard Worker       };
164*bbecb9d1SAndroid Build Coastguard Worker 
165*bbecb9d1SAndroid Build Coastguard Worker       create_info->pNext = &messenger_create_info;
166*bbecb9d1SAndroid Build Coastguard Worker    }
167*bbecb9d1SAndroid Build Coastguard Worker 
168*bbecb9d1SAndroid Build Coastguard Worker    assert(layer_count <= ARRAY_SIZE(layer_names));
169*bbecb9d1SAndroid Build Coastguard Worker    create_info->enabledLayerCount = layer_count;
170*bbecb9d1SAndroid Build Coastguard Worker    create_info->ppEnabledLayerNames = layer_names;
171*bbecb9d1SAndroid Build Coastguard Worker 
172*bbecb9d1SAndroid Build Coastguard Worker    assert(ext_count <= ARRAY_SIZE(ext_names));
173*bbecb9d1SAndroid Build Coastguard Worker    create_info->enabledExtensionCount = ext_count;
174*bbecb9d1SAndroid Build Coastguard Worker    create_info->ppEnabledExtensionNames = ext_names;
175*bbecb9d1SAndroid Build Coastguard Worker 
176*bbecb9d1SAndroid Build Coastguard Worker    /* patch apiVersion */
177*bbecb9d1SAndroid Build Coastguard Worker    VkApplicationInfo app_info = {
178*bbecb9d1SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
179*bbecb9d1SAndroid Build Coastguard Worker       .apiVersion = VK_API_VERSION_1_1,
180*bbecb9d1SAndroid Build Coastguard Worker    };
181*bbecb9d1SAndroid Build Coastguard Worker    if (create_info->pApplicationInfo) {
182*bbecb9d1SAndroid Build Coastguard Worker       app_info = *create_info->pApplicationInfo;
183*bbecb9d1SAndroid Build Coastguard Worker       if (app_info.apiVersion < VK_API_VERSION_1_1)
184*bbecb9d1SAndroid Build Coastguard Worker          app_info.apiVersion = VK_API_VERSION_1_1;
185*bbecb9d1SAndroid Build Coastguard Worker    }
186*bbecb9d1SAndroid Build Coastguard Worker    create_info->pApplicationInfo = &app_info;
187*bbecb9d1SAndroid Build Coastguard Worker 
188*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_instance *instance = vkr_context_alloc_object(
189*bbecb9d1SAndroid Build Coastguard Worker       ctx, sizeof(*instance), VK_OBJECT_TYPE_INSTANCE, args->pInstance);
190*bbecb9d1SAndroid Build Coastguard Worker    if (!instance) {
191*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_ERROR_OUT_OF_HOST_MEMORY;
192*bbecb9d1SAndroid Build Coastguard Worker       return;
193*bbecb9d1SAndroid Build Coastguard Worker    }
194*bbecb9d1SAndroid Build Coastguard Worker 
195*bbecb9d1SAndroid Build Coastguard Worker    instance->api_version = app_info.apiVersion;
196*bbecb9d1SAndroid Build Coastguard Worker 
197*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkCreateInstance_args_handle(args);
198*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vkCreateInstance(create_info, NULL, &instance->base.handle.instance);
199*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret != VK_SUCCESS) {
200*bbecb9d1SAndroid Build Coastguard Worker       free(instance);
201*bbecb9d1SAndroid Build Coastguard Worker       return;
202*bbecb9d1SAndroid Build Coastguard Worker    }
203*bbecb9d1SAndroid Build Coastguard Worker 
204*bbecb9d1SAndroid Build Coastguard Worker    if (ctx->validate_level != VKR_CONTEXT_VALIDATE_NONE) {
205*bbecb9d1SAndroid Build Coastguard Worker       instance->create_debug_utils_messenger =
206*bbecb9d1SAndroid Build Coastguard Worker          (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
207*bbecb9d1SAndroid Build Coastguard Worker             instance->base.handle.instance, "vkCreateDebugUtilsMessengerEXT");
208*bbecb9d1SAndroid Build Coastguard Worker       instance->destroy_debug_utils_messenger =
209*bbecb9d1SAndroid Build Coastguard Worker          (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
210*bbecb9d1SAndroid Build Coastguard Worker             instance->base.handle.instance, "vkDestroyDebugUtilsMessengerEXT");
211*bbecb9d1SAndroid Build Coastguard Worker 
212*bbecb9d1SAndroid Build Coastguard Worker       messenger_create_info.pNext = NULL;
213*bbecb9d1SAndroid Build Coastguard Worker       args->ret = instance->create_debug_utils_messenger(instance->base.handle.instance,
214*bbecb9d1SAndroid Build Coastguard Worker                                                          &messenger_create_info, NULL,
215*bbecb9d1SAndroid Build Coastguard Worker                                                          &instance->validation_messenger);
216*bbecb9d1SAndroid Build Coastguard Worker       if (args->ret != VK_SUCCESS) {
217*bbecb9d1SAndroid Build Coastguard Worker          vkDestroyInstance(instance->base.handle.instance, NULL);
218*bbecb9d1SAndroid Build Coastguard Worker          free(instance);
219*bbecb9d1SAndroid Build Coastguard Worker          return;
220*bbecb9d1SAndroid Build Coastguard Worker       }
221*bbecb9d1SAndroid Build Coastguard Worker    }
222*bbecb9d1SAndroid Build Coastguard Worker 
223*bbecb9d1SAndroid Build Coastguard Worker    vkr_context_add_instance(ctx, instance, app_info.pApplicationName);
224*bbecb9d1SAndroid Build Coastguard Worker }
225*bbecb9d1SAndroid Build Coastguard Worker 
226*bbecb9d1SAndroid Build Coastguard Worker void
vkr_instance_destroy(struct vkr_context * ctx,struct vkr_instance * instance)227*bbecb9d1SAndroid Build Coastguard Worker vkr_instance_destroy(struct vkr_context *ctx, struct vkr_instance *instance)
228*bbecb9d1SAndroid Build Coastguard Worker {
229*bbecb9d1SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < instance->physical_device_count; i++) {
230*bbecb9d1SAndroid Build Coastguard Worker       struct vkr_physical_device *physical_dev = instance->physical_devices[i];
231*bbecb9d1SAndroid Build Coastguard Worker       if (!physical_dev)
232*bbecb9d1SAndroid Build Coastguard Worker          break;
233*bbecb9d1SAndroid Build Coastguard Worker 
234*bbecb9d1SAndroid Build Coastguard Worker       vkr_physical_device_destroy(ctx, physical_dev);
235*bbecb9d1SAndroid Build Coastguard Worker    }
236*bbecb9d1SAndroid Build Coastguard Worker 
237*bbecb9d1SAndroid Build Coastguard Worker    if (ctx->validate_level != VKR_CONTEXT_VALIDATE_NONE) {
238*bbecb9d1SAndroid Build Coastguard Worker       instance->destroy_debug_utils_messenger(instance->base.handle.instance,
239*bbecb9d1SAndroid Build Coastguard Worker                                               instance->validation_messenger, NULL);
240*bbecb9d1SAndroid Build Coastguard Worker    }
241*bbecb9d1SAndroid Build Coastguard Worker 
242*bbecb9d1SAndroid Build Coastguard Worker    vkDestroyInstance(instance->base.handle.instance, NULL);
243*bbecb9d1SAndroid Build Coastguard Worker 
244*bbecb9d1SAndroid Build Coastguard Worker    free(instance->physical_device_handles);
245*bbecb9d1SAndroid Build Coastguard Worker    free(instance->physical_devices);
246*bbecb9d1SAndroid Build Coastguard Worker 
247*bbecb9d1SAndroid Build Coastguard Worker    vkr_context_remove_instance(ctx, instance);
248*bbecb9d1SAndroid Build Coastguard Worker }
249*bbecb9d1SAndroid Build Coastguard Worker 
250*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyInstance(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyInstance * args)251*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyInstance(struct vn_dispatch_context *dispatch,
252*bbecb9d1SAndroid Build Coastguard Worker                                struct vn_command_vkDestroyInstance *args)
253*bbecb9d1SAndroid Build Coastguard Worker {
254*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
255*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_instance *instance = vkr_instance_from_handle(args->instance);
256*bbecb9d1SAndroid Build Coastguard Worker 
257*bbecb9d1SAndroid Build Coastguard Worker    if (ctx->instance != instance) {
258*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
259*bbecb9d1SAndroid Build Coastguard Worker       return;
260*bbecb9d1SAndroid Build Coastguard Worker    }
261*bbecb9d1SAndroid Build Coastguard Worker 
262*bbecb9d1SAndroid Build Coastguard Worker    vkr_instance_destroy(ctx, instance);
263*bbecb9d1SAndroid Build Coastguard Worker }
264*bbecb9d1SAndroid Build Coastguard Worker 
265*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_instance_dispatch(struct vkr_context * ctx)266*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_instance_dispatch(struct vkr_context *ctx)
267*bbecb9d1SAndroid Build Coastguard Worker {
268*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
269*bbecb9d1SAndroid Build Coastguard Worker 
270*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkEnumerateInstanceVersion =
271*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkEnumerateInstanceVersion;
272*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkEnumerateInstanceExtensionProperties =
273*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkEnumerateInstanceExtensionProperties;
274*bbecb9d1SAndroid Build Coastguard Worker    /* we don't advertise layers (and should never) */
275*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkEnumerateInstanceLayerProperties = NULL;
276*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkCreateInstance = vkr_dispatch_vkCreateInstance;
277*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDestroyInstance = vkr_dispatch_vkDestroyInstance;
278*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetInstanceProcAddr = NULL;
279*bbecb9d1SAndroid Build Coastguard Worker }
280