render/vulkan: add some interfaces to allow compositors to integrate

Added wlr_vk_renderer_get_* functions to allow get the VkInstance,
VkPhysicalDevice, VkDevice, queue family of a wlr_vk_renderer.

Added wlr_vk_renderer_get_current_image_attribs function to allow get
the VkImage of current renderer buffer to use on compositors.

Added wlr_renderer_is_vk function, it's like the wlr_renderer_is_gles2,
returns true if the wlr_renderer is a wlr_vk_renderer.

Added wlr_vk_image_get_attribs function to get a VkImage and it's
extras information (e.g. a VkImageLayout and VkImageFormat of the
VkImage) from a wlr_texture.
This commit is contained in:
zccrs 2022-05-23 21:54:36 +08:00 committed by Simon Ser
parent 9fefeb69d6
commit 270914d379
3 changed files with 66 additions and 4 deletions

View file

@ -9,10 +9,29 @@
#ifndef WLR_RENDER_VULKAN_H #ifndef WLR_RENDER_VULKAN_H
#define WLR_RENDER_VULKAN_H #define WLR_RENDER_VULKAN_H
#include <vulkan/vulkan_core.h>
#include <wlr/render/wlr_renderer.h> #include <wlr/render/wlr_renderer.h>
struct wlr_vk_image_attribs {
VkImage image;
VkImageLayout layout;
VkFormat format;
};
struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd); struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd);
VkInstance wlr_vk_renderer_get_instance(struct wlr_renderer *renderer);
VkPhysicalDevice wlr_vk_renderer_get_physical_device(struct wlr_renderer *renderer);
VkDevice wlr_vk_renderer_get_device(struct wlr_renderer *renderer);
uint32_t wlr_vk_renderer_get_queue_family(struct wlr_renderer *renderer);
void wlr_vk_renderer_get_current_image_attribs(struct wlr_renderer *renderer,
struct wlr_vk_image_attribs *attribs);
bool wlr_renderer_is_vk(struct wlr_renderer *wlr_renderer);
bool wlr_texture_is_vk(struct wlr_texture *texture); bool wlr_texture_is_vk(struct wlr_texture *texture);
void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture,
struct wlr_vk_image_attribs *attribs);
#endif #endif

View file

@ -42,8 +42,12 @@ static bool default_debug = true;
static const struct wlr_renderer_impl renderer_impl; static const struct wlr_renderer_impl renderer_impl;
bool wlr_renderer_is_vk(struct wlr_renderer *wlr_renderer) {
return wlr_renderer->impl == &renderer_impl;
}
struct wlr_vk_renderer *vulkan_get_renderer(struct wlr_renderer *wlr_renderer) { struct wlr_vk_renderer *vulkan_get_renderer(struct wlr_renderer *wlr_renderer) {
assert(wlr_renderer->impl == &renderer_impl); assert(wlr_renderer_is_vk(wlr_renderer));
return (struct wlr_vk_renderer *)wlr_renderer; return (struct wlr_vk_renderer *)wlr_renderer;
} }
@ -1817,3 +1821,35 @@ struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd) {
return vulkan_renderer_create_for_device(dev); return vulkan_renderer_create_for_device(dev);
} }
VkInstance wlr_vk_renderer_get_instance(struct wlr_renderer *renderer)
{
struct wlr_vk_renderer *vk_renderer = vulkan_get_renderer(renderer);
return vk_renderer->dev->instance->instance;
}
VkPhysicalDevice wlr_vk_renderer_get_physical_device(struct wlr_renderer *renderer)
{
struct wlr_vk_renderer *vk_renderer = vulkan_get_renderer(renderer);
return vk_renderer->dev->phdev;
}
VkDevice wlr_vk_renderer_get_device(struct wlr_renderer *renderer)
{
struct wlr_vk_renderer *vk_renderer = vulkan_get_renderer(renderer);
return vk_renderer->dev->dev;
}
uint32_t wlr_vk_renderer_get_queue_family(struct wlr_renderer *renderer)
{
struct wlr_vk_renderer *vk_renderer = vulkan_get_renderer(renderer);
return vk_renderer->dev->queue_family;
}
void wlr_vk_renderer_get_current_image_attribs(struct wlr_renderer *renderer,
struct wlr_vk_image_attribs *attribs) {
struct wlr_vk_renderer *vk_renderer = vulkan_get_renderer(renderer);
attribs->image = vk_renderer->current_render_buffer->image;
attribs->format = vk_renderer->current_render_buffer->render_setup->render_format;
attribs->layout = VK_IMAGE_LAYOUT_UNDEFINED;
}

View file

@ -283,8 +283,6 @@ static struct wlr_texture *vulkan_texture_from_pixels(
.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, .usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
}; };
VkImageLayout layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
res = vkCreateImage(dev, &img_info, NULL, &texture->image); res = vkCreateImage(dev, &img_info, NULL, &texture->image);
if (res != VK_SUCCESS) { if (res != VK_SUCCESS) {
wlr_vk_error("vkCreateImage failed", res); wlr_vk_error("vkCreateImage failed", res);
@ -362,7 +360,7 @@ static struct wlr_texture *vulkan_texture_from_pixels(
VkDescriptorImageInfo ds_img_info = { VkDescriptorImageInfo ds_img_info = {
.imageView = texture->image_view, .imageView = texture->image_view,
.imageLayout = layout, .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
}; };
VkWriteDescriptorSet ds_write = { VkWriteDescriptorSet ds_write = {
@ -771,3 +769,12 @@ struct wlr_texture *vulkan_texture_from_buffer(struct wlr_renderer *wlr_renderer
return NULL; return NULL;
} }
} }
void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture,
struct wlr_vk_image_attribs *attribs) {
struct wlr_vk_texture *vk_texture = vulkan_get_texture(texture);
attribs->image = vk_texture->image;
attribs->format = vk_texture->format->vk_format;
attribs->layout = vk_texture->transitioned ?
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
}