comp: Support Vk and GL depth and depth stencil formats

For now add only the depth formats mandated by OpenGL to maximize the
chances of the Vulkan driver supporting a reasonable set of usage flags
for the formats.
This commit is contained in:
Christoph Haag 2020-08-21 17:45:58 +02:00
parent 5a854fc806
commit 092dddc2da
4 changed files with 39 additions and 13 deletions

View file

@ -260,6 +260,10 @@ gl_format_to_vk(int64_t format)
case GL_SRGB8_ALPHA8: return 43 /*VK_FORMAT_R8G8B8A8_SRGB*/; case GL_SRGB8_ALPHA8: return 43 /*VK_FORMAT_R8G8B8A8_SRGB*/;
case GL_RGB10_A2: return 64 /*VK_FORMAT_A2B10G10R10_UNORM_PACK32*/; case GL_RGB10_A2: return 64 /*VK_FORMAT_A2B10G10R10_UNORM_PACK32*/;
case GL_RGBA16F: return 97 /*VK_FORMAT_R16G16B16A16_SFLOAT*/; case GL_RGBA16F: return 97 /*VK_FORMAT_R16G16B16A16_SFLOAT*/;
case GL_DEPTH_COMPONENT16: return 124 /*VK_FORMAT_D16_UNORM*/;
case GL_DEPTH_COMPONENT32F: return 126 /*VK_FORMAT_D32_SFLOAT*/;
case GL_DEPTH24_STENCIL8: return 129 /*VK_FORMAT_D24_UNORM_S8_UINT*/;
case GL_DEPTH32F_STENCIL8: return 130 /*VK_FORMAT_D32_SFLOAT_S8_UINT*/;
default: return 0; default: return 0;
} }
} }
@ -274,6 +278,10 @@ vk_format_to_gl(int64_t format)
case 50 /*VK_FORMAT_B8G8R8A8_SRGB*/: return 0; case 50 /*VK_FORMAT_B8G8R8A8_SRGB*/: return 0;
case 64 /*VK_FORMAT_A2B10G10R10_UNORM_PACK32*/: return GL_RGB10_A2; case 64 /*VK_FORMAT_A2B10G10R10_UNORM_PACK32*/: return GL_RGB10_A2;
case 97 /*VK_FORMAT_R16G16B16A16_SFLOAT*/: return GL_RGBA16F; case 97 /*VK_FORMAT_R16G16B16A16_SFLOAT*/: return GL_RGBA16F;
case 124 /*VK_FORMAT_D16_UNORM*/: return GL_DEPTH_COMPONENT16;
case 126 /*VK_FORMAT_D32_SFLOAT*/: return GL_DEPTH_COMPONENT32F;
case 129 /*VK_FORMAT_D24_UNORM_S8_UINT*/: return GL_DEPTH24_STENCIL8;
case 130 /*VK_FORMAT_D32_SFLOAT_S8_UINT*/: return GL_DEPTH32F_STENCIL8;
default: default:
printf("Cannot convert VK format 0x%016" PRIx64 printf("Cannot convert VK format 0x%016" PRIx64
" to GL format!\n", " to GL format!\n",

View file

@ -1150,13 +1150,26 @@ xrt_gfx_provider_create_native(struct xrt_device *xdev)
* two formats should not be used as they are linear but doesn't have * two formats should not be used as they are linear but doesn't have
* enough bits to express it without resulting in banding. * enough bits to express it without resulting in banding.
*/ */
info->formats[0] = VK_FORMAT_R8G8B8A8_SRGB; // OGL VK uint32_t formats = 0;
info->formats[1] = VK_FORMAT_A2B10G10R10_UNORM_PACK32; // OGL VK
info->formats[2] = VK_FORMAT_R16G16B16A16_SFLOAT; // OGL VK // color formats
info->formats[3] = VK_FORMAT_B8G8R8A8_SRGB; // VK info->formats[formats++] = VK_FORMAT_R8G8B8A8_SRGB; // OGL VK
info->formats[4] = VK_FORMAT_R8G8B8A8_UNORM; // OGL VK info->formats[formats++] = VK_FORMAT_A2B10G10R10_UNORM_PACK32; // OGL VK
info->formats[5] = VK_FORMAT_B8G8R8A8_UNORM; // VK info->formats[formats++] = VK_FORMAT_R16G16B16A16_SFLOAT; // OGL VK
info->num_formats = 6; info->formats[formats++] = VK_FORMAT_B8G8R8A8_SRGB; // VK
info->formats[formats++] = VK_FORMAT_R8G8B8A8_UNORM; // OGL VK
info->formats[formats++] = VK_FORMAT_B8G8R8A8_UNORM; // VK
// depth formats
info->formats[formats++] = VK_FORMAT_D16_UNORM; // OGL VK
info->formats[formats++] = VK_FORMAT_D32_SFLOAT; // OGL VK
// depth stencil formats
info->formats[formats++] = VK_FORMAT_D24_UNORM_S8_UINT; // OGL VK
info->formats[formats++] = VK_FORMAT_D32_SFLOAT_S8_UINT; // OGL VK
assert(formats <= XRT_MAX_SWAPCHAIN_FORMATS);
info->num_formats = formats;
float scale = c->settings.viewport_scale; float scale = c->settings.viewport_scale;

View file

@ -105,9 +105,9 @@ alloc_and_set_funcs(struct comp_compositor *c, uint32_t num_images)
static void static void
do_post_create_vulkan_setup(struct comp_compositor *c, do_post_create_vulkan_setup(struct comp_compositor *c,
const struct xrt_swapchain_create_info *info,
struct comp_swapchain *sc) struct comp_swapchain *sc)
{ {
struct xrt_swapchain_create_info *info = &sc->vkic.info;
uint32_t num_images = sc->vkic.num_images; uint32_t num_images = sc->vkic.num_images;
VkCommandBuffer cmd_buffer; VkCommandBuffer cmd_buffer;
@ -118,6 +118,10 @@ do_post_create_vulkan_setup(struct comp_compositor *c,
.a = VK_COMPONENT_SWIZZLE_ONE, .a = VK_COMPONENT_SWIZZLE_ONE,
}; };
bool depth = (info->bits & XRT_SWAPCHAIN_USAGE_DEPTH_STENCIL) != 0;
VkImageAspectFlagBits aspect =
depth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
for (uint32_t i = 0; i < num_images; i++) { for (uint32_t i = 0; i < num_images; i++) {
sc->images[i].views.alpha = sc->images[i].views.alpha =
U_TYPED_ARRAY_CALLOC(VkImageView, info->array_size); U_TYPED_ARRAY_CALLOC(VkImageView, info->array_size);
@ -128,9 +132,10 @@ do_post_create_vulkan_setup(struct comp_compositor *c,
vk_create_sampler(&c->vk, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, vk_create_sampler(&c->vk, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
&sc->images[i].sampler); &sc->images[i].sampler);
for (uint32_t layer = 0; layer < info->array_size; ++layer) { for (uint32_t layer = 0; layer < info->array_size; ++layer) {
VkImageSubresourceRange subresource_range = { VkImageSubresourceRange subresource_range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .aspectMask = aspect,
.baseMipLevel = 0, .baseMipLevel = 0,
.levelCount = 1, .levelCount = 1,
.baseArrayLayer = layer, .baseArrayLayer = layer,
@ -163,7 +168,7 @@ do_post_create_vulkan_setup(struct comp_compositor *c,
vk_init_cmd_buffer(&c->vk, &cmd_buffer); vk_init_cmd_buffer(&c->vk, &cmd_buffer);
VkImageSubresourceRange subresource_range = { VkImageSubresourceRange subresource_range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .aspectMask = aspect,
.baseMipLevel = 0, .baseMipLevel = 0,
.levelCount = 1, .levelCount = 1,
.baseArrayLayer = 0, .baseArrayLayer = 0,
@ -274,7 +279,7 @@ comp_swapchain_create(struct xrt_compositor *xc,
sc->base.images[i].size = sc->vkic.images[i].size; sc->base.images[i].size = sc->vkic.images[i].size;
} }
do_post_create_vulkan_setup(c, sc); do_post_create_vulkan_setup(c, info, sc);
*out_xsc = &sc->base.base; *out_xsc = &sc->base.base;
@ -303,7 +308,7 @@ comp_swapchain_import(struct xrt_compositor *xc,
return XRT_ERROR_VULKAN; return XRT_ERROR_VULKAN;
} }
do_post_create_vulkan_setup(c, sc); do_post_create_vulkan_setup(c, info, sc);
*out_xsc = &sc->base.base; *out_xsc = &sc->base.base;

View file

@ -49,7 +49,7 @@ typedef uint64_t VkDeviceMemory;
/*! /*!
* Max formats supported by a compositor, artificial limit. * Max formats supported by a compositor, artificial limit.
*/ */
#define XRT_MAX_SWAPCHAIN_FORMATS 8 #define XRT_MAX_SWAPCHAIN_FORMATS 16
/*! /*!
* Special flags for creating swapchain images. * Special flags for creating swapchain images.