aboutsummaryrefslogtreecommitdiff
path: root/render/vulkan
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-05-24 20:36:30 +0200
committerAlexander Orzechowski <alex@ozal.ski>2023-06-07 10:06:27 +0000
commit2a2f0772a9b0ac9297fc10ede20b2385fe0777f7 (patch)
tree5ea76d3216525abc9b65779e79368163e2f24f51 /render/vulkan
parentcebe991e953bfe0dd38e4f6efdbb7d56bc1dcde0 (diff)
render/vulkan: de-duplicate texture VkImageView init
The logic is the same for both shm and DMA-BUF.
Diffstat (limited to 'render/vulkan')
-rw-r--r--render/vulkan/texture.c188
1 files changed, 75 insertions, 113 deletions
diff --git a/render/vulkan/texture.c b/render/vulkan/texture.c
index eb4601b5..71903d26 100644
--- a/render/vulkan/texture.c
+++ b/render/vulkan/texture.c
@@ -265,6 +265,79 @@ static struct wlr_vk_texture *vulkan_texture_create(
return texture;
}
+static bool vulkan_texture_init_view(struct wlr_vk_texture *texture) {
+ VkResult res;
+ VkDevice dev = texture->renderer->dev->dev;
+
+ const struct wlr_pixel_format_info *format_info =
+ drm_get_pixel_format_info(texture->format->drm);
+ if (format_info != NULL) {
+ texture->has_alpha = format_info->has_alpha;
+ } else {
+ // We don't have format info for multi-planar formats
+ assert(texture->format->is_ycbcr);
+ }
+
+ VkImageViewCreateInfo view_info = {
+ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+ .viewType = VK_IMAGE_VIEW_TYPE_2D,
+ .format = texture->format->vk,
+ .components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .components.a = texture->has_alpha || texture->format->is_ycbcr
+ ? VK_COMPONENT_SWIZZLE_IDENTITY
+ : VK_COMPONENT_SWIZZLE_ONE,
+ .subresourceRange = (VkImageSubresourceRange){
+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+ .baseMipLevel = 0,
+ .levelCount = 1,
+ .baseArrayLayer = 0,
+ .layerCount = 1,
+ },
+ .image = texture->image,
+ };
+
+ VkSamplerYcbcrConversionInfo ycbcr_conversion_info;
+ if (texture->format->is_ycbcr) {
+ assert(texture->pipeline_layout->ycbcr.conversion != VK_NULL_HANDLE);
+ ycbcr_conversion_info = (VkSamplerYcbcrConversionInfo){
+ .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
+ .conversion = texture->pipeline_layout->ycbcr.conversion,
+ };
+ view_info.pNext = &ycbcr_conversion_info;
+ }
+
+ res = vkCreateImageView(dev, &view_info, NULL, &texture->image_view);
+ if (res != VK_SUCCESS) {
+ wlr_vk_error("vkCreateImageView failed", res);
+ return false;
+ }
+
+ texture->ds_pool = vulkan_alloc_texture_ds(texture->renderer, texture->pipeline_layout->ds, &texture->ds);
+ if (!texture->ds_pool) {
+ wlr_log(WLR_ERROR, "failed to allocate descriptor");
+ return false;
+ }
+
+ VkDescriptorImageInfo ds_img_info = {
+ .imageView = texture->image_view,
+ .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ };
+
+ VkWriteDescriptorSet ds_write = {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .descriptorCount = 1,
+ .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .dstSet = texture->ds,
+ .pImageInfo = &ds_img_info,
+ };
+
+ vkUpdateDescriptorSets(dev, 1, &ds_write, 0, NULL);
+
+ return true;
+}
+
static struct wlr_texture *vulkan_texture_from_pixels(
struct wlr_vk_renderer *renderer, uint32_t drm_fmt, uint32_t stride,
uint32_t width, uint32_t height, const void *data) {
@@ -338,59 +411,10 @@ static struct wlr_texture *vulkan_texture_from_pixels(
goto error;
}
- const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(drm_fmt);
- assert(format_info);
- texture->has_alpha = format_info->has_alpha;
-
- VkImageViewCreateInfo view_info = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = texture->format->vk,
- .components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.a = texture->has_alpha
- ? VK_COMPONENT_SWIZZLE_IDENTITY
- : VK_COMPONENT_SWIZZLE_ONE,
-
- .subresourceRange = (VkImageSubresourceRange) {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1,
- },
- .image = texture->image,
- };
-
- res = vkCreateImageView(dev, &view_info, NULL,
- &texture->image_view);
- if (res != VK_SUCCESS) {
- wlr_vk_error("vkCreateImageView failed", res);
- goto error;
- }
-
- texture->ds_pool = vulkan_alloc_texture_ds(renderer, renderer->default_pipeline_layout.ds, &texture->ds);
- if (!texture->ds_pool) {
- wlr_log(WLR_ERROR, "failed to allocate descriptor");
+ if (!vulkan_texture_init_view(texture)) {
goto error;
}
- VkDescriptorImageInfo ds_img_info = {
- .imageView = texture->image_view,
- .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- };
-
- VkWriteDescriptorSet ds_write = {
- .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
- .descriptorCount = 1,
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .dstSet = texture->ds,
- .pImageInfo = &ds_img_info,
- };
-
- vkUpdateDescriptorSets(dev, 1, &ds_write, 0, NULL);
-
pixman_region32_t region;
pixman_region32_init_rect(&region, 0, 0, width, height);
if (!write_pixels(texture, stride, &region, data, VK_IMAGE_LAYOUT_UNDEFINED,
@@ -648,9 +672,6 @@ error_image:
static struct wlr_vk_texture *vulkan_texture_from_dmabuf(
struct wlr_vk_renderer *renderer,
struct wlr_dmabuf_attributes *attribs) {
- VkResult res;
- VkDevice dev = renderer->dev->dev;
-
const struct wlr_vk_format_props *fmt = vulkan_format_props_from_drm(
renderer->dev, attribs->format);
if (fmt == NULL) {
@@ -680,69 +701,10 @@ static struct wlr_vk_texture *vulkan_texture_from_dmabuf(
goto error;
}
- if (!fmt->format.is_ycbcr) {
- const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(attribs->format);
- assert(format_info);
- texture->has_alpha = format_info->has_alpha;
- }
-
- VkImageViewCreateInfo view_info = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = texture->format->vk,
- .components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
- .components.a = texture->has_alpha || fmt->format.is_ycbcr
- ? VK_COMPONENT_SWIZZLE_IDENTITY
- : VK_COMPONENT_SWIZZLE_ONE,
-
- .subresourceRange = (VkImageSubresourceRange) {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1,
- },
- .image = texture->image,
- };
-
- VkSamplerYcbcrConversionInfo ycbcr_conversion_info;
- if (fmt->format.is_ycbcr) {
- assert(texture->pipeline_layout->ycbcr.conversion != VK_NULL_HANDLE);
- ycbcr_conversion_info = (VkSamplerYcbcrConversionInfo){
- .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
- .conversion = texture->pipeline_layout->ycbcr.conversion,
- };
- view_info.pNext = &ycbcr_conversion_info;
- }
-
- res = vkCreateImageView(dev, &view_info, NULL, &texture->image_view);
- if (res != VK_SUCCESS) {
- wlr_vk_error("vkCreateImageView failed", res);
- goto error;
- }
-
- texture->ds_pool = vulkan_alloc_texture_ds(renderer, texture->pipeline_layout->ds, &texture->ds);
- if (!texture->ds_pool) {
- wlr_log(WLR_ERROR, "failed to allocate descriptor");
+ if (!vulkan_texture_init_view(texture)) {
goto error;
}
- VkDescriptorImageInfo ds_img_info = {
- .imageView = texture->image_view,
- .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- };
-
- VkWriteDescriptorSet ds_write = {
- .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
- .descriptorCount = 1,
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .dstSet = texture->ds,
- .pImageInfo = &ds_img_info,
- };
-
- vkUpdateDescriptorSets(dev, 1, &ds_write, 0, NULL);
texture->dmabuf_imported = true;
return texture;