Commit 13cef1b8 authored by Benjamin Saunders's avatar Benjamin Saunders

comp: Support rendering individual array layers

parent b6f2013b
Pipeline #34541 passed with stages
in 1 minute and 33 seconds
......@@ -128,6 +128,7 @@ client_gl_compositor_end_frame(struct xrt_compositor *xc,
enum xrt_blend_mode blend_mode,
struct xrt_swapchain **xscs,
uint32_t *image_index,
uint32_t *layers,
uint32_t num_swapchains)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
......@@ -145,7 +146,7 @@ client_gl_compositor_end_frame(struct xrt_compositor *xc,
// Pipe down call into fd compositor.
c->xcfd->base.end_frame(&c->xcfd->base, blend_mode, internal,
image_index, num_swapchains);
image_index, layers, num_swapchains);
}
static int64_t
......
......@@ -148,6 +148,7 @@ client_vk_compositor_end_frame(struct xrt_compositor *xc,
enum xrt_blend_mode blend_mode,
struct xrt_swapchain **xscs,
uint32_t *image_index,
uint32_t *layers,
uint32_t num_swapchains)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
......@@ -165,7 +166,7 @@ client_vk_compositor_end_frame(struct xrt_compositor *xc,
// Pipe down call into fd compositor.
c->xcfd->base.end_frame(&c->xcfd->base, blend_mode, internal,
image_index, num_swapchains);
image_index, layers, num_swapchains);
}
static struct xrt_swapchain *
......
......@@ -110,6 +110,7 @@ compositor_end_frame(struct xrt_compositor *xc,
enum xrt_blend_mode blend_mode,
struct xrt_swapchain **xscs,
uint32_t *image_index,
uint32_t *layers,
uint32_t num_swapchains)
{
struct comp_compositor *c = comp_compositor(xc);
......@@ -122,7 +123,7 @@ compositor_end_frame(struct xrt_compositor *xc,
if (num_swapchains == 2) {
left = &comp_swapchain(xscs[0])->images[image_index[0]];
right = &comp_swapchain(xscs[1])->images[image_index[1]];
comp_renderer_frame(c->r, left, right);
comp_renderer_frame(c->r, left, layers[0], right, layers[1]);
} else {
COMP_ERROR(c, "non-stereo rendering not supported");
}
......
......@@ -40,8 +40,8 @@ struct comp_swapchain_image
VkDeviceMemory memory;
//! Sampler used by the renderer and distortion code.
VkSampler sampler;
//! View used by the renderer and distortion code.
VkImageView view;
//! Views used by the renderer and distortion code, for each array layer.
VkImageView *views;
};
/*!
......@@ -159,6 +159,7 @@ comp_swapchain_create(struct xrt_compositor *xc,
*/
void
comp_swapchain_image_cleanup(struct vk_bundle *vk,
uint32_t array_size,
struct comp_swapchain_image *image);
/*!
......
......@@ -75,7 +75,8 @@ renderer_init(struct comp_renderer *r);
static void
renderer_set_swapchain_image(struct comp_renderer *r,
uint32_t eye,
struct comp_swapchain_image *image);
struct comp_swapchain_image *image,
uint32_t layer);
static void
renderer_render(struct comp_renderer *r);
......@@ -157,10 +158,12 @@ comp_renderer_create(struct comp_compositor *c)
void
comp_renderer_frame(struct comp_renderer *r,
struct comp_swapchain_image *left,
struct comp_swapchain_image *right)
uint32_t left_layer,
struct comp_swapchain_image *right,
uint32_t right_layer)
{
renderer_set_swapchain_image(r, 0, left);
renderer_set_swapchain_image(r, 1, right);
renderer_set_swapchain_image(r, 0, left, left_layer);
renderer_set_swapchain_image(r, 1, right, right_layer);
renderer_render(r);
r->c->vk.vkDeviceWaitIdle(r->c->vk.device);
}
......@@ -197,6 +200,8 @@ renderer_create(struct comp_renderer *r, struct comp_compositor *c)
memset(&r->dummy_images[0], 0, sizeof(struct comp_swapchain_image));
memset(&r->dummy_images[1], 0, sizeof(struct comp_swapchain_image));
r->dummy_images[0].views = U_TYPED_CALLOC(VkImageView);
r->dummy_images[1].views = U_TYPED_CALLOC(VkImageView);
r->distortion = NULL;
r->cmd_buffers = NULL;
......@@ -569,7 +574,7 @@ renderer_init_dummy_images(struct comp_renderer *r)
vk_create_sampler(vk, &r->dummy_images[i].sampler);
vk_create_view(vk, r->dummy_images[i].image,
VK_FORMAT_B8G8R8A8_SRGB, subresource_range,
&r->dummy_images[i].view);
&r->dummy_images[i].views[0]);
}
_submit_cmd_buffer(r->c, vk->cmd_pool, cmd_buffer);
......@@ -605,7 +610,7 @@ renderer_init(struct comp_renderer *r)
for (uint32_t i = 0; i < 2; i++)
comp_distortion_update_descriptor_set(
r->distortion, r->dummy_images[i].sampler,
r->dummy_images[i].view, i);
r->dummy_images[i].views[0], i);
renderer_build_command_buffers(r);
}
......@@ -613,7 +618,8 @@ renderer_init(struct comp_renderer *r)
static void
renderer_set_swapchain_image(struct comp_renderer *r,
uint32_t eye,
struct comp_swapchain_image *image)
struct comp_swapchain_image *image,
uint32_t layer)
{
if (eye > 1) {
COMP_ERROR(r->c, "Swapchain image %p %u not found",
......@@ -627,7 +633,8 @@ renderer_set_swapchain_image(struct comp_renderer *r,
" swapchain image %p and eye %u",
(void *)image, eye);
comp_distortion_update_descriptor_set(
r->distortion, image->sampler, image->view, (uint32_t)eye);
r->distortion, image->sampler, image->views[layer],
(uint32_t)eye);
renderer_rebuild_command_buffers(r);
r->one_buffer_imported[eye] = true;
}
......@@ -944,7 +951,7 @@ renderer_destroy(struct comp_renderer *r)
// Dummy images
for (uint32_t i = 0; i < 2; i++) {
comp_swapchain_image_cleanup(vk, &r->dummy_images[i]);
comp_swapchain_image_cleanup(vk, 1, &r->dummy_images[i]);
}
// Discriptor pool
......
......@@ -37,7 +37,9 @@ comp_renderer_create(struct comp_compositor *c);
void
comp_renderer_frame(struct comp_renderer *r,
struct comp_swapchain_image *left,
struct comp_swapchain_image *right);
uint32_t left_layer,
struct comp_swapchain_image *right,
uint32_t right_layer);
/*!
* Clean up and free the renderer.
......
......@@ -24,7 +24,8 @@ swapchain_destroy(struct xrt_swapchain *xsc)
COMP_SPEW(sc->c, "DESTROY");
for (uint32_t i = 0; i < sc->base.base.num_images; i++) {
comp_swapchain_image_cleanup(vk, &sc->images[i]);
comp_swapchain_image_cleanup(vk, sc->base.base.array_size,
&sc->images[i]);
}
free(sc);
......@@ -236,14 +237,6 @@ comp_swapchain_create(struct xrt_compositor *xc,
COMP_DEBUG(c, "CREATE %p %dx%d", (void *)sc, width, height);
VkImageSubresourceRange subresource_range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = array_size,
};
for (uint32_t i = 0; i < num_images; i++) {
ret =
create_image_fd(c, format, width, height, array_size,
......@@ -254,8 +247,25 @@ comp_swapchain_create(struct xrt_compositor *xc,
}
vk_create_sampler(&c->vk, &sc->images[i].sampler);
vk_create_view(&c->vk, sc->images[i].image, (VkFormat)format,
subresource_range, &sc->images[i].view);
}
for (uint32_t i = 0; i < num_images; i++) {
sc->images[i].views =
U_TYPED_ARRAY_CALLOC(VkImageView, array_size);
for (uint32_t layer = 0; layer < array_size; ++layer) {
VkImageSubresourceRange subresource_range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = layer,
.layerCount = 1,
};
vk_create_view(&c->vk, sc->images[i].image,
(VkFormat)format, subresource_range,
&sc->images[i].views[layer]);
}
}
......@@ -267,6 +277,14 @@ comp_swapchain_create(struct xrt_compositor *xc,
vk_init_cmd_buffer(&c->vk, &cmd_buffer);
VkImageSubresourceRange subresource_range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = array_size,
};
for (uint32_t i = 0; i < num_images; i++) {
vk_set_image_layout(&c->vk, cmd_buffer, sc->images[i].image, 0,
VK_ACCESS_SHADER_READ_BIT,
......@@ -282,11 +300,18 @@ comp_swapchain_create(struct xrt_compositor *xc,
void
comp_swapchain_image_cleanup(struct vk_bundle *vk,
uint32_t array_size,
struct comp_swapchain_image *image)
{
if (image->view != NULL) {
vk->vkDestroyImageView(vk->device, image->view, NULL);
image->view = NULL;
if (image->views != NULL) {
for (uint32_t i = 0; i < array_size; ++i) {
if (image->views[i] != NULL) {
vk->vkDestroyImageView(vk->device,
image->views[i], NULL);
}
}
free(image->views);
image->views = NULL;
}
if (image->sampler != NULL) {
......
......@@ -73,6 +73,11 @@ struct xrt_swapchain
*/
uint32_t num_images;
/*!
* Number of array layers per image.
*/
uint32_t array_size;
/*!
* Must have called release_image before calling this function.
*/
......@@ -186,6 +191,7 @@ struct xrt_compositor
enum xrt_blend_mode blend_mode,
struct xrt_swapchain **xscs,
uint32_t *image_index,
uint32_t *layers,
uint32_t num_swapchains);
/*!
......
......@@ -464,6 +464,7 @@ oxr_session_frame_end(struct oxr_logger *log,
struct xrt_swapchain *chains[2];
uint32_t image_index[2];
uint32_t layers[2];
uint32_t num_chains = ARRAY_SIZE(chains);
for (uint32_t i = 0; i < num_chains; i++) {
......@@ -471,10 +472,11 @@ oxr_session_frame_end(struct oxr_logger *log,
struct oxr_swapchain *sc =
(struct oxr_swapchain *)proj->views[i].subImage.swapchain;
chains[i] = sc->swapchain;
layers[i] = proj->views[i].subImage.imageArrayIndex;
image_index[i] = sc->released_index;
}
xc->end_frame(xc, blend_mode, chains, image_index, num_chains);
xc->end_frame(xc, blend_mode, chains, image_index, layers, num_chains);
sess->frame_started = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment