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