Lines Matching refs:instance
31 * Instance extensions add instance-level or physical-device-level
76 vn_instance_init_renderer_versions(struct vn_instance *instance)
80 vn_call_vkEnumerateInstanceVersion(instance, &instance_version);
83 vn_log(instance, "failed to enumerate renderer instance version");
89 vn_log(instance, "unsupported renderer instance version %d.%d",
97 vn_log(instance, "renderer instance version %d.%d.%d",
104 instance->renderer_api_version =
105 MAX2(instance->base.base.app_info.api_version, VN_MIN_RENDERER_VERSION);
107 /* instance version for internal use is capped */
108 instance_version = MIN3(instance_version, instance->renderer_api_version,
109 instance->renderer->info.vk_xml_version);
112 instance->renderer_version = instance_version;
118 vn_instance_init_ring(struct vn_instance *instance)
120 const size_t buf_size = instance->experimental.largeRing
128 instance->ring.shmem =
129 vn_renderer_shmem_create(instance->renderer, layout.shmem_size);
130 if (!instance->ring.shmem) {
132 vn_log(instance, "failed to allocate/map ring shmem");
136 mtx_init(&instance->ring.mutex, mtx_plain);
138 struct vn_ring *ring = &instance->ring.ring;
139 vn_ring_init(ring, instance->renderer, &layout,
140 instance->ring.shmem->mmap_ptr);
142 instance->ring.id = (uintptr_t)ring;
146 .resourceId = instance->ring.shmem->res_id,
161 vn_encode_vkCreateRingMESA(&local_enc, 0, instance->ring.id, &info);
162 vn_renderer_submit_simple(instance->renderer, create_ring_data,
165 vn_cs_encoder_init(&instance->ring.upload, instance,
168 mtx_init(&instance->ring.roundtrip_mutex, mtx_plain);
169 instance->ring.roundtrip_next = 1;
175 vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
180 vn_instance_init_experimental_features(struct vn_instance *instance)
182 if (instance->renderer->info.vk_mesa_venus_protocol_spec_version !=
185 vn_log(instance, "renderer supports no experimental features");
189 size_t struct_size = sizeof(instance->experimental);
194 &struct_size, &instance->experimental);
197 vn_instance_get_reply_shmem_locked(instance, reply_size, &reply_ptr);
207 &instance->experimental);
210 instance->renderer, local_data, vn_cs_encoder_get_len(&local_enc));
212 vn_renderer_shmem_unref(instance->renderer, reply_shmem);
219 &reply_dec, &struct_size, &instance->experimental);
220 vn_renderer_shmem_unref(instance->renderer, reply_shmem);
223 vn_log(instance,
228 instance->experimental.memoryResourceAllocationSize,
229 instance->experimental.globalFencing,
230 instance->experimental.largeRing);
237 vn_instance_init_renderer(struct vn_instance *instance)
239 const VkAllocationCallbacks *alloc = &instance->base.base.alloc;
241 VkResult result = vn_renderer_create(instance, alloc, &instance->renderer);
245 struct vn_renderer_info *renderer_info = &instance->renderer->info;
249 vn_log(instance, "wire format version %d != %d",
260 vn_log(instance, "vk xml version %d.%d.%d < %d.%d.%d",
283 vn_log(instance, "connected to renderer");
284 vn_log(instance, "wire format version %d",
286 vn_log(instance, "vk xml version %d.%d.%d",
290 vn_log(instance, "VK_EXT_command_serialization spec version %d",
292 vn_log(instance, "VK_MESA_venus_protocol spec version %d",
294 vn_log(instance, "supports blob id 0: %d",
296 vn_log(instance, "allow_vk_wait_syncs: %d",
304 vn_instance_submit_roundtrip(struct vn_instance *instance,
312 mtx_lock(&instance->ring.roundtrip_mutex);
313 const uint32_t seqno = instance->ring.roundtrip_next++;
314 vn_encode_vkWriteRingExtraMESA(&local_enc, 0, instance->ring.id, 0, seqno);
316 vn_renderer_submit_simple(instance->renderer, write_ring_extra_data,
318 mtx_unlock(&instance->ring.roundtrip_mutex);
332 vn_instance_wait_roundtrip(struct vn_instance *instance,
336 const struct vn_ring *ring = &instance->ring.ring;
469 vn_instance_submission_can_direct(const struct vn_instance *instance,
472 const size_t threshold = instance->experimental.largeRing
479 vn_instance_ring_cs_upload_locked(struct vn_instance *instance,
489 struct vn_cs_encoder *upload = &instance->ring.upload;
498 if (unlikely(!instance->renderer->info.supports_blob_id_0))
499 vn_instance_wait_roundtrip(instance, upload->current_buffer_roundtrip);
505 vn_instance_ring_submit_locked(struct vn_instance *instance,
510 struct vn_ring *ring = &instance->ring.ring;
512 const bool direct = vn_instance_submission_can_direct(instance, cs);
514 cs = vn_instance_ring_cs_upload_locked(instance, cs);
532 vn_encode_vkNotifyRingMESA(&local_enc, 0, instance->ring.id, seqno, 0);
533 vn_renderer_submit_simple(instance->renderer, notify_ring_data,
546 vn_instance_ring_submit(struct vn_instance *instance,
549 mtx_lock(&instance->ring.mutex);
550 VkResult result = vn_instance_ring_submit_locked(instance, cs, NULL, NULL);
551 mtx_unlock(&instance->ring.mutex);
557 vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
562 struct vn_renderer_shmem_pool *pool = &instance->reply_shmem_pool;
567 vn_renderer_shmem_pool_alloc(instance->renderer, pool, size, &offset);
589 if (likely(instance->ring.id)) {
590 if (unlikely(!instance->renderer->info.supports_blob_id_0))
591 vn_instance_roundtrip(instance);
593 vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
595 vn_renderer_submit_simple(instance->renderer,
611 if (likely(instance->ring.id)) {
612 vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
614 vn_renderer_submit_simple(instance->renderer,
623 vn_instance_submit_command(struct vn_instance *instance,
629 mtx_lock(&instance->ring.mutex);
637 instance, submit->reply_size, &reply_ptr);
644 instance, &submit->command, submit->reply_shmem, &ring_seqno);
646 mtx_unlock(&instance->ring.mutex);
651 vn_ring_wait(&instance->ring.ring, ring_seqno);
656 instance->ring.command_dropped++;
657 mtx_unlock(&instance->ring.mutex);
660 /* instance commands */
697 struct vn_instance *instance;
703 instance = vk_zalloc(alloc, sizeof(*instance), VN_DEFAULT_ALIGN,
705 if (!instance)
713 result = vn_instance_base_init(&instance->base,
717 vk_free(alloc, instance);
721 mtx_init(&instance->physical_device.mutex, mtx_plain);
722 mtx_init(&instance->cs_shmem.mutex, mtx_plain);
725 instance->base.base.app_info.api_version)) {
735 result = vn_instance_init_renderer(instance);
739 vn_cs_renderer_protocol_info_init(instance);
741 vn_renderer_shmem_pool_init(instance->renderer,
742 &instance->reply_shmem_pool, 1u << 20);
744 result = vn_instance_init_experimental_features(instance);
748 result = vn_instance_init_ring(instance);
752 result = vn_instance_init_renderer_versions(instance);
756 vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem.pool,
765 if (instance->base.base.app_info.api_version <
766 instance->renderer_api_version) {
769 local_app_info.apiVersion = instance->renderer_api_version;
773 .apiVersion = instance->renderer_api_version,
779 VkInstance instance_handle = vn_instance_to_handle(instance);
781 vn_call_vkCreateInstance(instance, pCreateInfo, NULL, &instance_handle);
785 driParseOptionInfo(&instance->available_dri_options, vn_dri_options,
787 driParseConfigFiles(&instance->dri_options,
788 &instance->available_dri_options, 0, "venus", NULL,
789 NULL, instance->base.base.app_info.app_name,
790 instance->base.base.app_info.app_version,
791 instance->base.base.app_info.engine_name,
792 instance->base.base.app_info.engine_version);
794 instance->renderer->info.has_implicit_fencing =
795 driQueryOptionb(&instance->dri_options, "venus_implicit_fencing");
802 if (instance->ring.shmem) {
806 vn_encode_vkDestroyRingMESA(&local_enc, 0, instance->ring.id);
807 vn_renderer_submit_simple(instance->renderer, destroy_ring_data,
810 mtx_destroy(&instance->ring.roundtrip_mutex);
811 vn_cs_encoder_fini(&instance->ring.upload);
812 vn_renderer_shmem_unref(instance->renderer, instance->ring.shmem);
813 vn_ring_fini(&instance->ring.ring);
814 mtx_destroy(&instance->ring.mutex);
817 vn_renderer_shmem_pool_fini(instance->renderer,
818 &instance->reply_shmem_pool);
820 if (instance->renderer)
821 vn_renderer_destroy(instance->renderer, alloc);
823 mtx_destroy(&instance->physical_device.mutex);
824 mtx_destroy(&instance->cs_shmem.mutex);
826 vn_instance_base_fini(&instance->base);
827 vk_free(alloc, instance);
837 struct vn_instance *instance = vn_instance_from_handle(_instance);
839 pAllocator ? pAllocator : &instance->base.base.alloc;
841 if (!instance)
844 if (instance->physical_device.initialized) {
845 for (uint32_t i = 0; i < instance->physical_device.device_count; i++)
846 vn_physical_device_fini(&instance->physical_device.devices[i]);
847 vk_free(alloc, instance->physical_device.devices);
848 vk_free(alloc, instance->physical_device.groups);
850 mtx_destroy(&instance->physical_device.mutex);
852 vn_call_vkDestroyInstance(instance, _instance, NULL);
854 vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem.pool);
855 mtx_destroy(&instance->cs_shmem.mutex);
860 vn_encode_vkDestroyRingMESA(&local_enc, 0, instance->ring.id);
861 vn_renderer_submit_simple(instance->renderer, destroy_ring_data,
864 mtx_destroy(&instance->ring.roundtrip_mutex);
865 vn_cs_encoder_fini(&instance->ring.upload);
866 vn_ring_fini(&instance->ring.ring);
867 mtx_destroy(&instance->ring.mutex);
868 vn_renderer_shmem_unref(instance->renderer, instance->ring.shmem);
870 vn_renderer_shmem_pool_fini(instance->renderer,
871 &instance->reply_shmem_pool);
873 vn_renderer_destroy(instance->renderer, alloc);
875 driDestroyOptionCache(&instance->dri_options);
876 driDestroyOptionInfo(&instance->available_dri_options);
878 vn_instance_base_fini(&instance->base);
879 vk_free(alloc, instance);
885 struct vn_instance *instance = vn_instance_from_handle(_instance);
886 return vk_instance_get_proc_addr(&instance->base.base,