Support cubemap swapchains;

This commit is contained in:
bjorn 2022-07-01 12:23:53 -07:00
parent e552ef6bf3
commit a4e5a2d027
11 changed files with 80 additions and 8 deletions

View file

@ -936,6 +936,7 @@ vk_create_sampler(struct vk_bundle *vk, VkSamplerAddressMode clamp_mode, VkSampl
VkResult
vk_create_view(struct vk_bundle *vk,
VkImage image,
VkImageViewType type,
VkFormat format,
VkImageSubresourceRange subresource_range,
VkImageView *out_view)
@ -947,12 +948,13 @@ vk_create_view(struct vk_bundle *vk,
.a = VK_COMPONENT_SWIZZLE_A,
};
return vk_create_view_swizzle(vk, image, format, subresource_range, components, out_view);
return vk_create_view_swizzle(vk, image, type, format, subresource_range, components, out_view);
}
VkResult
vk_create_view_swizzle(struct vk_bundle *vk,
VkImage image,
VkImageViewType type,
VkFormat format,
VkImageSubresourceRange subresource_range,
VkComponentMapping components,
@ -964,7 +966,7 @@ vk_create_view_swizzle(struct vk_bundle *vk,
VkImageViewCreateInfo imageView = {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = image,
.viewType = VK_IMAGE_VIEW_TYPE_2D,
.viewType = type,
.format = format,
.components = components,
.subresourceRange = subresource_range,

View file

@ -782,6 +782,7 @@ vk_create_sampler(struct vk_bundle *vk, VkSamplerAddressMode clamp_mode, VkSampl
VkResult
vk_create_view(struct vk_bundle *vk,
VkImage image,
VkImageViewType type,
VkFormat format,
VkImageSubresourceRange subresource_range,
VkImageView *out_view);
@ -792,6 +793,7 @@ vk_create_view(struct vk_bundle *vk,
VkResult
vk_create_view_swizzle(struct vk_bundle *vk,
VkImage image,
VkImageViewType type,
VkFormat format,
VkImageSubresourceRange subresource_range,
VkComponentMapping components,

View file

@ -164,6 +164,10 @@ create_image(struct vk_bundle *vk, const struct xrt_swapchain_create_info *info,
}
#endif
if (info->face_count == 6) {
image_create_flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
}
VkImageCreateInfo create_info = {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
.pNext = next_chain,
@ -172,7 +176,7 @@ create_image(struct vk_bundle *vk, const struct xrt_swapchain_create_info *info,
.format = image_format,
.extent = {.width = info->width, .height = info->height, .depth = 1},
.mipLevels = info->mip_count,
.arrayLayers = info->array_size,
.arrayLayers = info->array_size * info->face_count,
.samples = VK_SAMPLE_COUNT_1_BIT,
.tiling = VK_IMAGE_TILING_OPTIMAL,
.usage = image_usage,

View file

@ -421,8 +421,8 @@ _init_frame_buffer(struct comp_layer_renderer *self, VkFormat format, VkRenderPa
.layerCount = 1,
};
res =
vk_create_view(vk, self->framebuffers[eye].image, format, subresource_range, &self->framebuffers[eye].view);
res = vk_create_view(vk, self->framebuffers[eye].image, VK_IMAGE_VIEW_TYPE_2D, format, subresource_range,
&self->framebuffers[eye].view);
vk_check_error("vk_create_view", res, false);

View file

@ -125,6 +125,7 @@ create_image_views(struct comp_target_swapchain *cts)
vk_create_view( //
vk, // vk_bundle
cts->base.images[i].handle, // image
VK_IMAGE_VIEW_TYPE_2D, // type
cts->surface.format.format, // format
subresource_range, // subresource_range
&cts->base.images[i].view); // out_view

View file

@ -293,6 +293,7 @@ create_distortion_image_and_view(struct vk_bundle *vk,
VkImage image = VK_NULL_HANDLE;
VkDeviceMemory device_memory = VK_NULL_HANDLE;
VkImageView image_view = VK_NULL_HANDLE;
VkImageViewType view_type = VK_IMAGE_VIEW_TYPE_2D;
C(vk_create_image_simple( //
vk, // vk_bundle
@ -313,6 +314,7 @@ create_distortion_image_and_view(struct vk_bundle *vk,
C(vk_create_view( //
vk, // vk_bundle
image, // image
view_type, // type
format, // format
subresource_range, // subresource_range
&image_view)); // out_image_view
@ -595,6 +597,7 @@ render_resources_init(struct render_resources *r,
C(vk_create_view( //
vk, // vk_bundle
r->scratch.color.image, // image
VK_IMAGE_VIEW_TYPE_2D, // type
format, // format
subresource_range, // subresource_range
&r->scratch.color.image_view)); // out_view

View file

@ -127,6 +127,7 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
VkFormat image_view_format = (VkFormat)info->format;
VkImageAspectFlagBits image_view_aspect = vk_csci_get_image_view_aspect(image_view_format, info->bits);
VkImageViewType image_view_type = info->face_count == 6 ? VK_IMAGE_VIEW_TYPE_CUBE : VK_IMAGE_VIEW_TYPE_2D;
for (uint32_t i = 0; i < image_count; i++) {
sc->images[i].views.alpha = U_TYPED_ARRAY_CALLOC(VkImageView, info->array_size);
@ -143,13 +144,14 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
.aspectMask = image_view_aspect,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = layer,
.layerCount = 1,
.baseArrayLayer = layer * info->face_count,
.layerCount = info->face_count,
};
vk_create_view( //
vk, // vk
sc->vkic.images[i].handle, // image
image_view_type, // type
image_view_format, // format
subresource_range, // subresource_range
&sc->images[i].views.alpha[layer]); // out_view
@ -157,6 +159,7 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
vk_create_view_swizzle( //
vk, // vk
sc->vkic.images[i].handle, // image
image_view_type, // type
image_view_format, // format
subresource_range, // subresource_range
components, // components
@ -185,7 +188,7 @@ do_post_create_vulkan_setup(struct vk_bundle *vk,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = info->array_size,
.layerCount = info->array_size * info->face_count,
};
for (uint32_t i = 0; i < image_count; i++) {

View file

@ -61,6 +61,10 @@ oxr_xrCreateSwapchain(XrSession session, const XrSwapchainCreateInfo *createInfo
OXR_VERIFY_ARG_NOT_ZERO(&log, createInfo->width);
OXR_VERIFY_ARG_NOT_ZERO(&log, createInfo->height);
if (createInfo->faceCount != 1 && createInfo->faceCount != 6) {
return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, "faceCount must be 1 or 6");
}
// Short hand.
struct oxr_instance *inst = sess->sys->inst;

View file

@ -2071,6 +2071,9 @@ struct oxr_swapchain
//! For 1 is 2D texture, greater then 1 2D array texture.
uint32_t array_layer_count;
//! The number of cubemap faces. 6 for cubemaps, 1 otherwise.
uint32_t face_count;
struct
{
enum oxr_image_state state;

View file

@ -216,6 +216,13 @@ verify_quad_layer(struct xrt_compositor *xc,
layer_index, quad->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 1, got %u)",
layer_index, sc->face_count);
}
if (!sc->released.yes) {
return oxr_error(log, XR_ERROR_LAYER_INVALID,
"(frameEndInfo->layers[%u]->subImage.swapchain) swapchain has not been released!",
@ -284,6 +291,13 @@ verify_depth_layer(struct xrt_compositor *xc,
layer_index, i, depth->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 1, got %u)",
layer_index, sc->face_count);
}
if (is_rect_neg(&depth->subImage.imageRect)) {
return oxr_error(log, XR_ERROR_SWAPCHAIN_RECT_INVALID,
"(frameEndInfo->layers[%u]->views[%i]->next<XrCompositionLayerDepthInfoKHR>.subImage."
@ -408,6 +422,13 @@ verify_projection_layer(struct xrt_compositor *xc,
layer_index, i, view->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->views[%i]->subImage.swapchain) Invalid swapchain "
"face count (expected 1, got %u)",
layer_index, i, sc->face_count);
}
if (is_rect_neg(&view->subImage.imageRect)) {
return oxr_error(log, XR_ERROR_SWAPCHAIN_RECT_INVALID,
"(frameEndInfo->layers[%u]->views[%i]-"
@ -493,6 +514,13 @@ verify_cube_layer(struct xrt_compositor *xc,
layer_index, cube->imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 6) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 6, got %u)",
layer_index, sc->face_count);
}
if (!sc->released.yes) {
return oxr_error(log, XR_ERROR_LAYER_INVALID,
"(frameEndInfo->layers[%u]->swapchain) swapchain has not been released!", layer_index);
@ -555,6 +583,13 @@ verify_cylinder_layer(struct xrt_compositor *xc,
layer_index, cylinder->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 1, got %u)",
layer_index, sc->face_count);
}
if (!sc->released.yes) {
return oxr_error(log, XR_ERROR_LAYER_INVALID,
"(frameEndInfo->layers[%u]->subImage.swapchain) swapchain has not been released!",
@ -652,6 +687,13 @@ verify_equirect1_layer(struct xrt_compositor *xc,
layer_index, equirect->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 1, got %u)",
layer_index, sc->face_count);
}
if (!sc->released.yes) {
return oxr_error(log, XR_ERROR_LAYER_INVALID,
"(frameEndInfo->layers[%u]->subImage.swapchain) swapchain has not been released!",
@ -736,6 +778,13 @@ verify_equirect2_layer(struct xrt_compositor *xc,
layer_index, equirect->subImage.imageArrayIndex, sc->array_layer_count);
}
if (sc->face_count != 1) {
return oxr_error(log, XR_ERROR_VALIDATION_FAILURE,
"(frameEndInfo->layers[%u]->subImage.swapchain) Invalid swapchain face count "
"(expected 1, got %u)",
layer_index, sc->face_count);
}
if (!sc->released.yes) {
return oxr_error(log, XR_ERROR_LAYER_INVALID,
"(frameEndInfo->layers[%u]->subImage.swapchain) swapchain has not been released!",

View file

@ -230,6 +230,7 @@ oxr_create_swapchain(struct oxr_logger *log,
sc->width = createInfo->width;
sc->height = createInfo->height;
sc->array_layer_count = createInfo->arraySize;
sc->face_count = createInfo->faceCount;
sc->acquire_image = oxr_swapchain_acquire_image;
sc->wait_image = oxr_swapchain_wait_image;
sc->release_image = oxr_swapchain_release_image;