mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-02-13 17:20:09 +00:00
Support cubemap swapchains;
This commit is contained in:
parent
e552ef6bf3
commit
a4e5a2d027
src/xrt
auxiliary/vk
compositor
state_trackers/oxr
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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!",
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue