mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-01 12:46:12 +00:00
c/util: Use cmd pool helpers in swapchain code
This commit is contained in:
parent
197461b4cd
commit
d1906d1cf8
|
@ -155,7 +155,7 @@ compositor_end_session(struct xrt_compositor *xc)
|
||||||
|
|
||||||
if (c->deferred_surface) {
|
if (c->deferred_surface) {
|
||||||
// Make sure we don't have anything to destroy.
|
// Make sure we don't have anything to destroy.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
comp_renderer_destroy(&c->r);
|
comp_renderer_destroy(&c->r);
|
||||||
#ifdef XRT_FEATURE_WINDOW_PEEK
|
#ifdef XRT_FEATURE_WINDOW_PEEK
|
||||||
comp_window_peek_destroy(&c->peek);
|
comp_window_peek_destroy(&c->peek);
|
||||||
|
@ -404,7 +404,7 @@ compositor_layer_commit(struct xrt_compositor *xc, xrt_graphics_sync_handle_t sy
|
||||||
COMP_SPEW(c, "LAYER_COMMIT finished drawing at %8.3fms", ns_to_ms(c->last_frame_time_ns));
|
COMP_SPEW(c, "LAYER_COMMIT finished drawing at %8.3fms", ns_to_ms(c->last_frame_time_ns));
|
||||||
|
|
||||||
// Now is a good point to garbage collect.
|
// Now is a good point to garbage collect.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
return XRT_SUCCESS;
|
return XRT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -454,7 +454,10 @@ compositor_destroy(struct xrt_compositor *xc)
|
||||||
COMP_DEBUG(c, "COMP_DESTROY");
|
COMP_DEBUG(c, "COMP_DESTROY");
|
||||||
|
|
||||||
// Make sure we don't have anything to destroy.
|
// Make sure we don't have anything to destroy.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
|
// Must be destroyed before Vulkan.
|
||||||
|
comp_swapchain_shared_destroy(&c->base.cscs, vk);
|
||||||
|
|
||||||
comp_renderer_destroy(&c->r);
|
comp_renderer_destroy(&c->r);
|
||||||
|
|
||||||
|
@ -750,6 +753,12 @@ compositor_init_vulkan(struct comp_compositor *c)
|
||||||
c->settings.client_gpu_deviceLUID = vk_res.client_gpu_deviceLUID;
|
c->settings.client_gpu_deviceLUID = vk_res.client_gpu_deviceLUID;
|
||||||
c->settings.client_gpu_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
c->settings.client_gpu_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
||||||
|
|
||||||
|
// Tie the lifetimes of swapchains to Vulkan.
|
||||||
|
xrt_result_t xret = comp_swapchain_shared_init(&c->base.cscs, vk);
|
||||||
|
if (xret != XRT_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2022, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -209,6 +209,12 @@ compositor_init_vulkan(struct null_compositor *c)
|
||||||
c->sys_info.client_d3d_deviceLUID = vk_res.client_gpu_deviceLUID;
|
c->sys_info.client_d3d_deviceLUID = vk_res.client_gpu_deviceLUID;
|
||||||
c->sys_info.client_d3d_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
c->sys_info.client_d3d_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
||||||
|
|
||||||
|
// Tie the lifetimes of swapchains to Vulkan.
|
||||||
|
xrt_result_t xret = comp_swapchain_shared_init(&c->base.cscs, vk);
|
||||||
|
if (xret != XRT_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +447,7 @@ null_compositor_layer_commit(struct xrt_compositor *xc, xrt_graphics_sync_handle
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now is a good point to garbage collect.
|
// Now is a good point to garbage collect.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
return XRT_SUCCESS;
|
return XRT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -498,7 +504,10 @@ null_compositor_destroy(struct xrt_compositor *xc)
|
||||||
NULL_DEBUG(c, "NULL_COMP_DESTROY");
|
NULL_DEBUG(c, "NULL_COMP_DESTROY");
|
||||||
|
|
||||||
// Make sure we don't have anything to destroy.
|
// Make sure we don't have anything to destroy.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
|
// Must be destroyed before Vulkan.
|
||||||
|
comp_swapchain_shared_destroy(&c->base.cscs, vk);
|
||||||
|
|
||||||
|
|
||||||
if (vk->cmd_pool != VK_NULL_HANDLE) {
|
if (vk->cmd_pool != VK_NULL_HANDLE) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2022, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -70,7 +70,7 @@ base_create_swapchain(struct xrt_compositor *xc,
|
||||||
struct xrt_swapchain_create_properties xsccp = {0};
|
struct xrt_swapchain_create_properties xsccp = {0};
|
||||||
xrt_comp_get_swapchain_create_properties(xc, info, &xsccp);
|
xrt_comp_get_swapchain_create_properties(xc, info, &xsccp);
|
||||||
|
|
||||||
return comp_swapchain_create(&cb->vk, &cb->cscgc, info, &xsccp, out_xsc);
|
return comp_swapchain_create(&cb->vk, &cb->cscs, info, &xsccp, out_xsc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xrt_result_t
|
static xrt_result_t
|
||||||
|
@ -82,7 +82,7 @@ base_import_swapchain(struct xrt_compositor *xc,
|
||||||
{
|
{
|
||||||
struct comp_base *cb = comp_base(xc);
|
struct comp_base *cb = comp_base(xc);
|
||||||
|
|
||||||
return comp_swapchain_import(&cb->vk, &cb->cscgc, info, native_images, image_count, out_xsc);
|
return comp_swapchain_import(&cb->vk, &cb->cscs, info, native_images, image_count, out_xsc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xrt_result_t
|
static xrt_result_t
|
||||||
|
@ -265,7 +265,7 @@ comp_base_init(struct comp_base *cb)
|
||||||
cb->base.base.layer_equirect2 = base_layer_equirect2;
|
cb->base.base.layer_equirect2 = base_layer_equirect2;
|
||||||
cb->base.base.wait_frame = base_wait_frame;
|
cb->base.base.wait_frame = base_wait_frame;
|
||||||
|
|
||||||
u_threading_stack_init(&cb->cscgc.destroy_swapchains);
|
u_threading_stack_init(&cb->cscs.destroy_swapchains);
|
||||||
|
|
||||||
os_precise_sleeper_init(&cb->sleeper);
|
os_precise_sleeper_init(&cb->sleeper);
|
||||||
}
|
}
|
||||||
|
@ -275,5 +275,5 @@ comp_base_fini(struct comp_base *cb)
|
||||||
{
|
{
|
||||||
os_precise_sleeper_deinit(&cb->sleeper);
|
os_precise_sleeper_deinit(&cb->sleeper);
|
||||||
|
|
||||||
u_threading_stack_fini(&cb->cscgc.destroy_swapchains);
|
u_threading_stack_fini(&cb->cscs.destroy_swapchains);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2021, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -103,7 +103,7 @@ struct comp_base
|
||||||
struct os_precise_sleeper sleeper;
|
struct os_precise_sleeper sleeper;
|
||||||
|
|
||||||
//! Swapchain garbage collector, used by swapchain, child class needs to call.
|
//! Swapchain garbage collector, used by swapchain, child class needs to call.
|
||||||
struct comp_swapchain_gc cscgc;
|
struct comp_swapchain_shared cscs;
|
||||||
|
|
||||||
//! We only need to track a single slot.
|
//! We only need to track a single slot.
|
||||||
struct comp_layer_slot slot;
|
struct comp_layer_slot slot;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2022, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -14,6 +14,7 @@
|
||||||
#include "util/u_handles.h"
|
#include "util/u_handles.h"
|
||||||
|
|
||||||
#include "util/comp_swapchain.h"
|
#include "util/comp_swapchain.h"
|
||||||
|
#include "vk/vk_cmd_pool.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -33,7 +34,7 @@ swapchain_destroy(struct xrt_swapchain *xsc)
|
||||||
|
|
||||||
VK_TRACE(sc->vk, "DESTROY");
|
VK_TRACE(sc->vk, "DESTROY");
|
||||||
|
|
||||||
u_threading_stack_push(&sc->gc->destroy_swapchains, sc);
|
u_threading_stack_push(&sc->cscs->destroy_swapchains, sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xrt_result_t
|
static xrt_result_t
|
||||||
|
@ -93,7 +94,7 @@ static struct comp_swapchain *
|
||||||
set_common_fields(struct comp_swapchain *sc,
|
set_common_fields(struct comp_swapchain *sc,
|
||||||
comp_swapchain_destroy_func_t destroy_func,
|
comp_swapchain_destroy_func_t destroy_func,
|
||||||
struct vk_bundle *vk,
|
struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
uint32_t image_count)
|
uint32_t image_count)
|
||||||
{
|
{
|
||||||
sc->base.base.destroy = swapchain_destroy;
|
sc->base.base.destroy = swapchain_destroy;
|
||||||
|
@ -103,7 +104,7 @@ set_common_fields(struct comp_swapchain *sc,
|
||||||
sc->base.base.image_count = image_count;
|
sc->base.base.image_count = image_count;
|
||||||
sc->real_destroy = destroy_func;
|
sc->real_destroy = destroy_func;
|
||||||
sc->vk = vk;
|
sc->vk = vk;
|
||||||
sc->gc = cscgc;
|
sc->cscs = cscs;
|
||||||
|
|
||||||
// Make sure the handles are invalid.
|
// Make sure the handles are invalid.
|
||||||
for (uint32_t i = 0; i < ARRAY_SIZE(sc->base.images); i++) {
|
for (uint32_t i = 0; i < ARRAY_SIZE(sc->base.images); i++) {
|
||||||
|
@ -185,7 +186,19 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
vk_cmd_buffer_create_and_begin(vk, &cmd_buffer);
|
// To reduce the pointer chasing.
|
||||||
|
struct vk_cmd_pool *pool = &sc->cscs->pool;
|
||||||
|
|
||||||
|
// First lock.
|
||||||
|
vk_cmd_pool_lock(pool);
|
||||||
|
|
||||||
|
// Now lets create the command buffer.
|
||||||
|
ret = vk_cmd_pool_create_and_begin_cmd_buffer_locked(vk, pool, 0, &cmd_buffer);
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
vk_cmd_pool_unlock(pool);
|
||||||
|
VK_ERROR(vk, "Failed to barrier images");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
VkImageAspectFlagBits image_barrier_aspect = vk_csci_get_barrier_aspect_mask(image_view_format);
|
VkImageAspectFlagBits image_barrier_aspect = vk_csci_get_barrier_aspect_mask(image_view_format);
|
||||||
|
|
||||||
|
@ -198,7 +211,7 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (uint32_t i = 0; i < image_count; i++) {
|
for (uint32_t i = 0; i < image_count; i++) {
|
||||||
vk_cmd_image_barrier_gpu( //
|
vk_cmd_image_barrier_gpu_locked( //
|
||||||
vk, //
|
vk, //
|
||||||
cmd_buffer, //
|
cmd_buffer, //
|
||||||
sc->vkic.images[i].handle, //
|
sc->vkic.images[i].handle, //
|
||||||
|
@ -209,7 +222,13 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
|
||||||
subresource_range); //
|
subresource_range); //
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = vk_cmd_buffer_submit(vk, cmd_buffer);
|
// Done writing commands, submit to queue, waits for command to finish.
|
||||||
|
ret = vk_cmd_pool_end_submit_wait_and_free_cmd_buffer_locked(vk, pool, cmd_buffer);
|
||||||
|
|
||||||
|
// Done submitting commands.
|
||||||
|
vk_cmd_pool_unlock(pool);
|
||||||
|
|
||||||
|
// Check results from submit.
|
||||||
if (ret != VK_SUCCESS) {
|
if (ret != VK_SUCCESS) {
|
||||||
//! @todo Propegate error
|
//! @todo Propegate error
|
||||||
VK_ERROR(vk, "Failed to barrier images");
|
VK_ERROR(vk, "Failed to barrier images");
|
||||||
|
@ -289,7 +308,7 @@ xrt_result_t
|
||||||
comp_swapchain_create_init(struct comp_swapchain *sc,
|
comp_swapchain_create_init(struct comp_swapchain *sc,
|
||||||
comp_swapchain_destroy_func_t destroy_func,
|
comp_swapchain_destroy_func_t destroy_func,
|
||||||
struct vk_bundle *vk,
|
struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
const struct xrt_swapchain_create_properties *xsccp)
|
const struct xrt_swapchain_create_properties *xsccp)
|
||||||
{
|
{
|
||||||
|
@ -307,7 +326,7 @@ comp_swapchain_create_init(struct comp_swapchain *sc,
|
||||||
return XRT_ERROR_SWAPCHAIN_FLAG_VALID_BUT_UNSUPPORTED;
|
return XRT_ERROR_SWAPCHAIN_FLAG_VALID_BUT_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_common_fields(sc, destroy_func, vk, cscgc, xsccp->image_count);
|
set_common_fields(sc, destroy_func, vk, cscs, xsccp->image_count);
|
||||||
|
|
||||||
// Use the image helper to allocate the images.
|
// Use the image helper to allocate the images.
|
||||||
ret = vk_ic_allocate(vk, info, xsccp->image_count, &sc->vkic);
|
ret = vk_ic_allocate(vk, info, xsccp->image_count, &sc->vkic);
|
||||||
|
@ -337,7 +356,7 @@ xrt_result_t
|
||||||
comp_swapchain_import_init(struct comp_swapchain *sc,
|
comp_swapchain_import_init(struct comp_swapchain *sc,
|
||||||
comp_swapchain_destroy_func_t destroy_func,
|
comp_swapchain_destroy_func_t destroy_func,
|
||||||
struct vk_bundle *vk,
|
struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
struct xrt_image_native *native_images,
|
struct xrt_image_native *native_images,
|
||||||
uint32_t native_image_count)
|
uint32_t native_image_count)
|
||||||
|
@ -349,7 +368,7 @@ comp_swapchain_import_init(struct comp_swapchain *sc,
|
||||||
info->width, info->height, //
|
info->width, info->height, //
|
||||||
vk_format_string(info->format), info->format);
|
vk_format_string(info->format), info->format);
|
||||||
|
|
||||||
set_common_fields(sc, destroy_func, vk, cscgc, native_image_count);
|
set_common_fields(sc, destroy_func, vk, cscs, native_image_count);
|
||||||
|
|
||||||
// Use the image helper to get the images.
|
// Use the image helper to get the images.
|
||||||
ret = vk_ic_from_natives(vk, info, native_images, native_image_count, &sc->vkic);
|
ret = vk_ic_from_natives(vk, info, native_images, native_image_count, &sc->vkic);
|
||||||
|
@ -383,16 +402,34 @@ comp_swapchain_teardown(struct comp_swapchain *sc)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* 'Exported' garbage collection functions.
|
* 'Exported' shared functions.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
XRT_CHECK_RESULT xrt_result_t
|
||||||
|
comp_swapchain_shared_init(struct comp_swapchain_shared *cscs, struct vk_bundle *vk)
|
||||||
|
{
|
||||||
|
VkResult ret = vk_cmd_pool_init(vk, &cscs->pool, 0);
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
VK_ERROR(vk, "vk_cmd_pool_init: %s", vk_result_string(ret));
|
||||||
|
return XRT_ERROR_VULKAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return XRT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
comp_swapchain_garbage_collect(struct comp_swapchain_gc *cscgc)
|
comp_swapchain_shared_destroy(struct comp_swapchain_shared *cscs, struct vk_bundle *vk)
|
||||||
|
{
|
||||||
|
vk_cmd_pool_destroy(vk, &cscs->pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
comp_swapchain_shared_garbage_collect(struct comp_swapchain_shared *cscs)
|
||||||
{
|
{
|
||||||
struct comp_swapchain *sc;
|
struct comp_swapchain *sc;
|
||||||
|
|
||||||
while ((sc = u_threading_stack_pop(&cscgc->destroy_swapchains))) {
|
while ((sc = u_threading_stack_pop(&cscs->destroy_swapchains))) {
|
||||||
sc->real_destroy(sc);
|
sc->real_destroy(sc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,7 +460,7 @@ comp_swapchain_get_create_properties(const struct xrt_swapchain_create_info *inf
|
||||||
|
|
||||||
xrt_result_t
|
xrt_result_t
|
||||||
comp_swapchain_create(struct vk_bundle *vk,
|
comp_swapchain_create(struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
const struct xrt_swapchain_create_properties *xsccp,
|
const struct xrt_swapchain_create_properties *xsccp,
|
||||||
struct xrt_swapchain **out_xsc)
|
struct xrt_swapchain **out_xsc)
|
||||||
|
@ -435,7 +472,7 @@ comp_swapchain_create(struct vk_bundle *vk,
|
||||||
sc, //
|
sc, //
|
||||||
really_destroy, //
|
really_destroy, //
|
||||||
vk, //
|
vk, //
|
||||||
cscgc, //
|
cscs, //
|
||||||
info, //
|
info, //
|
||||||
xsccp); //
|
xsccp); //
|
||||||
if (xret != XRT_SUCCESS) {
|
if (xret != XRT_SUCCESS) {
|
||||||
|
@ -451,7 +488,7 @@ comp_swapchain_create(struct vk_bundle *vk,
|
||||||
|
|
||||||
xrt_result_t
|
xrt_result_t
|
||||||
comp_swapchain_import(struct vk_bundle *vk,
|
comp_swapchain_import(struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
struct xrt_image_native *native_images,
|
struct xrt_image_native *native_images,
|
||||||
uint32_t native_image_count,
|
uint32_t native_image_count,
|
||||||
|
@ -464,7 +501,7 @@ comp_swapchain_import(struct vk_bundle *vk,
|
||||||
sc, //
|
sc, //
|
||||||
really_destroy, //
|
really_destroy, //
|
||||||
vk, //
|
vk, //
|
||||||
cscgc, //
|
cscs, //
|
||||||
info, //
|
info, //
|
||||||
native_images, //
|
native_images, //
|
||||||
native_image_count); //
|
native_image_count); //
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2021, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "vk/vk_image_allocator.h"
|
#include "vk/vk_image_allocator.h"
|
||||||
|
#include "vk/vk_cmd_pool.h"
|
||||||
|
|
||||||
#include "util/u_threading.h"
|
#include "util/u_threading.h"
|
||||||
#include "util/u_index_fifo.h"
|
#include "util/u_index_fifo.h"
|
||||||
|
@ -32,14 +33,19 @@ struct comp_swapchain;
|
||||||
typedef void (*comp_swapchain_destroy_func_t)(struct comp_swapchain *sc);
|
typedef void (*comp_swapchain_destroy_func_t)(struct comp_swapchain *sc);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* A garbage collector that collects swapchains to be safely destroyed.
|
* Shared resource(s) and garbage collector for swapchains. The garbage
|
||||||
|
* collector allows to delay the destruction until it's safe to destroy them.
|
||||||
|
* The lifetime of @p pool is handled by the compositor that implements this
|
||||||
|
* struct.
|
||||||
*
|
*
|
||||||
* @ingroup comp_util
|
* @ingroup comp_util
|
||||||
*/
|
*/
|
||||||
struct comp_swapchain_gc
|
struct comp_swapchain_shared
|
||||||
{
|
{
|
||||||
//! Thread object for safely destroying swapchain.
|
//! Thread object for safely destroying swapchain.
|
||||||
struct u_threading_stack destroy_swapchains;
|
struct u_threading_stack destroy_swapchains;
|
||||||
|
|
||||||
|
struct vk_cmd_pool pool;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -81,7 +87,7 @@ struct comp_swapchain
|
||||||
struct xrt_swapchain_native base;
|
struct xrt_swapchain_native base;
|
||||||
|
|
||||||
struct vk_bundle *vk;
|
struct vk_bundle *vk;
|
||||||
struct comp_swapchain_gc *gc;
|
struct comp_swapchain_shared *cscs;
|
||||||
|
|
||||||
struct vk_image_collection vkic;
|
struct vk_image_collection vkic;
|
||||||
struct comp_swapchain_image images[XRT_MAX_SWAPCHAIN_IMAGES];
|
struct comp_swapchain_image images[XRT_MAX_SWAPCHAIN_IMAGES];
|
||||||
|
@ -133,7 +139,7 @@ xrt_result_t
|
||||||
comp_swapchain_create_init(struct comp_swapchain *sc,
|
comp_swapchain_create_init(struct comp_swapchain *sc,
|
||||||
comp_swapchain_destroy_func_t destroy_func,
|
comp_swapchain_destroy_func_t destroy_func,
|
||||||
struct vk_bundle *vk,
|
struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
const struct xrt_swapchain_create_properties *xsccp);
|
const struct xrt_swapchain_create_properties *xsccp);
|
||||||
|
|
||||||
|
@ -148,7 +154,7 @@ xrt_result_t
|
||||||
comp_swapchain_import_init(struct comp_swapchain *sc,
|
comp_swapchain_import_init(struct comp_swapchain *sc,
|
||||||
comp_swapchain_destroy_func_t destroy_func,
|
comp_swapchain_destroy_func_t destroy_func,
|
||||||
struct vk_bundle *vk,
|
struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
struct xrt_image_native *native_images,
|
struct xrt_image_native *native_images,
|
||||||
uint32_t native_image_count);
|
uint32_t native_image_count);
|
||||||
|
@ -164,10 +170,26 @@ comp_swapchain_teardown(struct comp_swapchain *sc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* 'Exported' garbage collection functions.
|
* 'Exported' shared struct functions.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Create the shared struct.
|
||||||
|
*
|
||||||
|
* @ingroup comp_util
|
||||||
|
*/
|
||||||
|
XRT_CHECK_RESULT xrt_result_t
|
||||||
|
comp_swapchain_shared_init(struct comp_swapchain_shared *cscs, struct vk_bundle *vk);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Destroy the shared struct.
|
||||||
|
*
|
||||||
|
* @ingroup comp_util
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
comp_swapchain_shared_destroy(struct comp_swapchain_shared *cscs, struct vk_bundle *vk);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Do garbage collection, destroying any resources that has been scheduled for
|
* Do garbage collection, destroying any resources that has been scheduled for
|
||||||
* destruction from other threads.
|
* destruction from other threads.
|
||||||
|
@ -175,7 +197,7 @@ comp_swapchain_teardown(struct comp_swapchain *sc);
|
||||||
* @ingroup comp_util
|
* @ingroup comp_util
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
comp_swapchain_garbage_collect(struct comp_swapchain_gc *cscgc);
|
comp_swapchain_shared_garbage_collect(struct comp_swapchain_shared *cscs);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -200,7 +222,7 @@ comp_swapchain_get_create_properties(const struct xrt_swapchain_create_info *inf
|
||||||
*/
|
*/
|
||||||
xrt_result_t
|
xrt_result_t
|
||||||
comp_swapchain_create(struct vk_bundle *vk,
|
comp_swapchain_create(struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
const struct xrt_swapchain_create_properties *xsccp,
|
const struct xrt_swapchain_create_properties *xsccp,
|
||||||
struct xrt_swapchain **out_xsc);
|
struct xrt_swapchain **out_xsc);
|
||||||
|
@ -212,7 +234,7 @@ comp_swapchain_create(struct vk_bundle *vk,
|
||||||
*/
|
*/
|
||||||
xrt_result_t
|
xrt_result_t
|
||||||
comp_swapchain_import(struct vk_bundle *vk,
|
comp_swapchain_import(struct vk_bundle *vk,
|
||||||
struct comp_swapchain_gc *cscgc,
|
struct comp_swapchain_shared *cscs,
|
||||||
const struct xrt_swapchain_create_info *info,
|
const struct xrt_swapchain_create_info *info,
|
||||||
struct xrt_image_native *native_images,
|
struct xrt_image_native *native_images,
|
||||||
uint32_t image_count,
|
uint32_t image_count,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2019-2022, Collabora, Ltd.
|
// Copyright 2019-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -205,6 +205,12 @@ compositor_init_vulkan(struct sdl_compositor *c, enum u_logging_level log_level)
|
||||||
c->sys_info.client_d3d_deviceLUID = vk_res.client_gpu_deviceLUID;
|
c->sys_info.client_d3d_deviceLUID = vk_res.client_gpu_deviceLUID;
|
||||||
c->sys_info.client_d3d_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
c->sys_info.client_d3d_deviceLUID_valid = vk_res.client_gpu_deviceLUID_valid;
|
||||||
|
|
||||||
|
// Tie the lifetimes of swapchains to Vulkan.
|
||||||
|
xrt_result_t xret = comp_swapchain_shared_init(&c->base.cscs, vk);
|
||||||
|
if (xret != XRT_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,7 +462,7 @@ sdl_compositor_layer_commit(struct xrt_compositor *xc, xrt_graphics_sync_handle_
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now is a good point to garbage collect.
|
// Now is a good point to garbage collect.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
return XRT_SUCCESS;
|
return XRT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -514,8 +520,10 @@ sdl_compositor_destroy(struct xrt_compositor *xc)
|
||||||
SC_DEBUG(c, "DESTROY");
|
SC_DEBUG(c, "DESTROY");
|
||||||
|
|
||||||
// Make sure we don't have anything to destroy.
|
// Make sure we don't have anything to destroy.
|
||||||
comp_swapchain_garbage_collect(&c->base.cscgc);
|
comp_swapchain_shared_garbage_collect(&c->base.cscs);
|
||||||
|
|
||||||
|
// Must be destroyed before Vulkan.
|
||||||
|
comp_swapchain_shared_destroy(&c->base.cscs, vk);
|
||||||
|
|
||||||
if (vk->cmd_pool != VK_NULL_HANDLE) {
|
if (vk->cmd_pool != VK_NULL_HANDLE) {
|
||||||
vk->vkDestroyCommandPool(vk->device, vk->cmd_pool, NULL);
|
vk->vkDestroyCommandPool(vk->device, vk->cmd_pool, NULL);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2022, Collabora, Ltd.
|
// Copyright 2022-2023, Collabora, Ltd.
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
|
@ -164,7 +164,7 @@ sdl_swapchain_create(struct xrt_compositor *xc,
|
||||||
&ssc->base, //
|
&ssc->base, //
|
||||||
really_destroy, //
|
really_destroy, //
|
||||||
&sp->c.base.vk, //
|
&sp->c.base.vk, //
|
||||||
&sp->c.base.cscgc, //
|
&sp->c.base.cscs, //
|
||||||
info, //
|
info, //
|
||||||
&xsccp); //
|
&xsccp); //
|
||||||
if (xret != XRT_SUCCESS) {
|
if (xret != XRT_SUCCESS) {
|
||||||
|
@ -197,7 +197,7 @@ sdl_swapchain_import(struct xrt_compositor *xc,
|
||||||
&ssc->base, //
|
&ssc->base, //
|
||||||
really_destroy, //
|
really_destroy, //
|
||||||
&sp->c.base.vk, //
|
&sp->c.base.vk, //
|
||||||
&sp->c.base.cscgc, //
|
&sp->c.base.cscs, //
|
||||||
info, //
|
info, //
|
||||||
native_images, //
|
native_images, //
|
||||||
native_image_count); //
|
native_image_count); //
|
||||||
|
|
Loading…
Reference in a new issue