mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-29 05:40:12 -04:00
render/vulkan: add support for texture transfer functions
This commit is contained in:
parent
b1a9dab03e
commit
8d1c6e42ac
4 changed files with 22 additions and 11 deletions
|
|
@ -349,6 +349,7 @@ struct wlr_vk_frag_output_pcr_data {
|
||||||
struct wlr_vk_texture_view {
|
struct wlr_vk_texture_view {
|
||||||
struct wl_list link; // struct wlr_vk_texture.views
|
struct wl_list link; // struct wlr_vk_texture.views
|
||||||
const struct wlr_vk_pipeline_layout *layout;
|
const struct wlr_vk_pipeline_layout *layout;
|
||||||
|
bool srgb;
|
||||||
|
|
||||||
VkDescriptorSet ds;
|
VkDescriptorSet ds;
|
||||||
VkImageView image_view;
|
VkImageView image_view;
|
||||||
|
|
@ -363,7 +364,7 @@ struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
|
||||||
const struct wlr_vk_pipeline_layout_key *key);
|
const struct wlr_vk_pipeline_layout_key *key);
|
||||||
struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(
|
struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(
|
||||||
struct wlr_vk_texture *texture,
|
struct wlr_vk_texture *texture,
|
||||||
const struct wlr_vk_pipeline_layout *layout);
|
const struct wlr_vk_pipeline_layout *layout, bool srgb);
|
||||||
|
|
||||||
// Creates a vulkan renderer for the given device.
|
// Creates a vulkan renderer for the given device.
|
||||||
struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev);
|
struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev);
|
||||||
|
|
@ -463,13 +464,12 @@ struct wlr_vk_texture {
|
||||||
VkDeviceMemory memories[WLR_DMABUF_MAX_PLANES];
|
VkDeviceMemory memories[WLR_DMABUF_MAX_PLANES];
|
||||||
VkImage image;
|
VkImage image;
|
||||||
const struct wlr_vk_format *format;
|
const struct wlr_vk_format *format;
|
||||||
enum wlr_vk_texture_transform transform;
|
|
||||||
struct wlr_vk_command_buffer *last_used_cb; // to track when it can be destroyed
|
struct wlr_vk_command_buffer *last_used_cb; // to track when it can be destroyed
|
||||||
bool dmabuf_imported;
|
bool dmabuf_imported;
|
||||||
bool owned; // if dmabuf_imported: whether we have ownership of the image
|
bool owned; // if dmabuf_imported: whether we have ownership of the image
|
||||||
bool transitioned; // if dma_imported: whether we transitioned it away from preinit
|
bool transitioned; // if dma_imported: whether we transitioned it away from preinit
|
||||||
bool has_alpha; // whether the image is has alpha channel
|
bool has_alpha; // whether the image is has alpha channel
|
||||||
bool using_mutable_srgb; // is this accessed through _SRGB format view
|
bool using_mutable_srgb; // can be accessed through _SRGB format view
|
||||||
struct wl_list foreign_link; // wlr_vk_renderer.foreign_textures
|
struct wl_list foreign_link; // wlr_vk_renderer.foreign_textures
|
||||||
struct wl_list destroy_link; // wlr_vk_command_buffer.destroy_textures
|
struct wl_list destroy_link; // wlr_vk_command_buffer.destroy_textures
|
||||||
struct wl_list link; // wlr_vk_renderer.textures
|
struct wl_list link; // wlr_vk_renderer.textures
|
||||||
|
|
|
||||||
|
|
@ -781,6 +781,14 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
};
|
};
|
||||||
encode_proj_matrix(matrix, vert_pcr_data.mat4);
|
encode_proj_matrix(matrix, vert_pcr_data.mat4);
|
||||||
|
|
||||||
|
bool srgb = options->transfer_function == 0 ||
|
||||||
|
options->transfer_function == WLR_COLOR_TRANSFER_FUNCTION_SRGB;
|
||||||
|
bool srgb_image_view = srgb && texture->using_mutable_srgb;
|
||||||
|
enum wlr_vk_texture_transform tex_transform =
|
||||||
|
srgb_image_view || options->transfer_function == WLR_COLOR_TRANSFER_FUNCTION_EXT_LINEAR ?
|
||||||
|
WLR_VK_TEXTURE_TRANSFORM_IDENTITY :
|
||||||
|
WLR_VK_TEXTURE_TRANSFORM_SRGB;
|
||||||
|
|
||||||
struct wlr_vk_render_format_setup *setup = pass->srgb_pathway ?
|
struct wlr_vk_render_format_setup *setup = pass->srgb_pathway ?
|
||||||
pass->render_buffer->srgb.render_setup :
|
pass->render_buffer->srgb.render_setup :
|
||||||
pass->render_buffer->plain.render_setup;
|
pass->render_buffer->plain.render_setup;
|
||||||
|
|
@ -792,7 +800,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
.ycbcr_format = texture->format->is_ycbcr ? texture->format : NULL,
|
.ycbcr_format = texture->format->is_ycbcr ? texture->format : NULL,
|
||||||
.filter_mode = options->filter_mode,
|
.filter_mode = options->filter_mode,
|
||||||
},
|
},
|
||||||
.texture_transform = texture->transform,
|
.texture_transform = tex_transform,
|
||||||
.blend_mode = !texture->has_alpha && alpha == 1.0 ?
|
.blend_mode = !texture->has_alpha && alpha == 1.0 ?
|
||||||
WLR_RENDER_BLEND_MODE_NONE : options->blend_mode,
|
WLR_RENDER_BLEND_MODE_NONE : options->blend_mode,
|
||||||
});
|
});
|
||||||
|
|
@ -802,7 +810,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_vk_texture_view *view =
|
struct wlr_vk_texture_view *view =
|
||||||
vulkan_texture_get_or_create_view(texture, pipe->layout);
|
vulkan_texture_get_or_create_view(texture, pipe->layout, srgb_image_view);
|
||||||
if (!view) {
|
if (!view) {
|
||||||
pass->failed = true;
|
pass->failed = true;
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -2442,6 +2442,7 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev
|
||||||
|
|
||||||
renderer->dev = dev;
|
renderer->dev = dev;
|
||||||
wlr_renderer_init(&renderer->wlr_renderer, &renderer_impl, WLR_BUFFER_CAP_DMABUF);
|
wlr_renderer_init(&renderer->wlr_renderer, &renderer_impl, WLR_BUFFER_CAP_DMABUF);
|
||||||
|
renderer->wlr_renderer.features.input_color_transform = true;
|
||||||
renderer->wlr_renderer.features.output_color_transform = true;
|
renderer->wlr_renderer.features.output_color_transform = true;
|
||||||
wl_list_init(&renderer->stage.buffers);
|
wl_list_init(&renderer->stage.buffers);
|
||||||
wl_list_init(&renderer->foreign_textures);
|
wl_list_init(&renderer->foreign_textures);
|
||||||
|
|
|
||||||
|
|
@ -269,10 +269,12 @@ static struct wlr_vk_texture *vulkan_texture_create(
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_texture *texture,
|
struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_texture *texture,
|
||||||
const struct wlr_vk_pipeline_layout *pipeline_layout) {
|
const struct wlr_vk_pipeline_layout *pipeline_layout, bool srgb) {
|
||||||
|
assert(texture->using_mutable_srgb || !srgb);
|
||||||
|
|
||||||
struct wlr_vk_texture_view *view;
|
struct wlr_vk_texture_view *view;
|
||||||
wl_list_for_each(view, &texture->views, link) {
|
wl_list_for_each(view, &texture->views, link) {
|
||||||
if (view->layout == pipeline_layout) {
|
if (view->layout == pipeline_layout && view->srgb == srgb) {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -283,6 +285,7 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
||||||
}
|
}
|
||||||
|
|
||||||
view->layout = pipeline_layout;
|
view->layout = pipeline_layout;
|
||||||
|
view->srgb = srgb;
|
||||||
|
|
||||||
VkResult res;
|
VkResult res;
|
||||||
VkDevice dev = texture->renderer->dev->dev;
|
VkDevice dev = texture->renderer->dev->dev;
|
||||||
|
|
@ -290,8 +293,7 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
||||||
VkImageViewCreateInfo view_info = {
|
VkImageViewCreateInfo view_info = {
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||||
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
||||||
.format = texture->using_mutable_srgb ? texture->format->vk_srgb
|
.format = srgb ? texture->format->vk_srgb : texture->format->vk,
|
||||||
: texture->format->vk,
|
|
||||||
.components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
.components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
.components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
|
|
@ -353,10 +355,10 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
||||||
|
|
||||||
static void texture_set_format(struct wlr_vk_texture *texture,
|
static void texture_set_format(struct wlr_vk_texture *texture,
|
||||||
const struct wlr_vk_format *format, bool has_mutable_srgb) {
|
const struct wlr_vk_format *format, bool has_mutable_srgb) {
|
||||||
|
assert(!(format->is_ycbcr && has_mutable_srgb));
|
||||||
|
|
||||||
texture->format = format;
|
texture->format = format;
|
||||||
texture->using_mutable_srgb = has_mutable_srgb;
|
texture->using_mutable_srgb = has_mutable_srgb;
|
||||||
texture->transform = !format->is_ycbcr && has_mutable_srgb ?
|
|
||||||
WLR_VK_TEXTURE_TRANSFORM_IDENTITY : WLR_VK_TEXTURE_TRANSFORM_SRGB;
|
|
||||||
|
|
||||||
const struct wlr_pixel_format_info *format_info =
|
const struct wlr_pixel_format_info *format_info =
|
||||||
drm_get_pixel_format_info(format->drm);
|
drm_get_pixel_format_info(format->drm);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue