render/vulkan: fix single-pass linear path

Fixes d1c88e9 "render/vulkan: add linear single-subpass"

`find_or_create_render_setup` still assumed a single-buffer setup
always implied use of an srgb format
This commit is contained in:
Félix Poisot 2025-11-22 15:45:00 +00:00
parent 106f0f9506
commit b98904705d
2 changed files with 13 additions and 7 deletions

View file

@ -203,6 +203,7 @@ struct wlr_vk_render_format_setup {
struct wl_list link; // wlr_vk_renderer.render_format_setups struct wl_list link; // wlr_vk_renderer.render_format_setups
const struct wlr_vk_format *render_format; // used in renderpass const struct wlr_vk_format *render_format; // used in renderpass
bool use_blending_buffer; bool use_blending_buffer;
bool use_srgb;
VkRenderPass render_pass; VkRenderPass render_pass;
VkPipeline output_pipe_identity; VkPipeline output_pipe_identity;

View file

@ -58,7 +58,7 @@ struct wlr_vk_renderer *vulkan_get_renderer(struct wlr_renderer *wlr_renderer) {
static struct wlr_vk_render_format_setup *find_or_create_render_setup( static struct wlr_vk_render_format_setup *find_or_create_render_setup(
struct wlr_vk_renderer *renderer, const struct wlr_vk_format *format, struct wlr_vk_renderer *renderer, const struct wlr_vk_format *format,
bool has_blending_buffer); bool has_blending_buffer, bool srgb);
static struct wlr_vk_descriptor_pool *alloc_ds( static struct wlr_vk_descriptor_pool *alloc_ds(
struct wlr_vk_renderer *renderer, VkDescriptorSet *ds, struct wlr_vk_renderer *renderer, VkDescriptorSet *ds,
@ -690,7 +690,7 @@ bool vulkan_setup_two_pass_framebuffer(struct wlr_vk_render_buffer *buffer,
} }
buffer->two_pass.render_setup = find_or_create_render_setup( buffer->two_pass.render_setup = find_or_create_render_setup(
renderer, &fmt->format, true); renderer, &fmt->format, true, false);
if (!buffer->two_pass.render_setup) { if (!buffer->two_pass.render_setup) {
goto error; goto error;
} }
@ -862,7 +862,7 @@ bool vulkan_setup_one_pass_framebuffer(struct wlr_vk_render_buffer *buffer,
} }
struct wlr_vk_render_format_setup *render_setup = struct wlr_vk_render_format_setup *render_setup =
find_or_create_render_setup(renderer, &fmt->format, false); find_or_create_render_setup(renderer, &fmt->format, false, srgb);
if (!render_setup) { if (!render_setup) {
goto error; goto error;
} }
@ -2225,11 +2225,12 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) {
static struct wlr_vk_render_format_setup *find_or_create_render_setup( static struct wlr_vk_render_format_setup *find_or_create_render_setup(
struct wlr_vk_renderer *renderer, const struct wlr_vk_format *format, struct wlr_vk_renderer *renderer, const struct wlr_vk_format *format,
bool use_blending_buffer) { bool use_blending_buffer, bool srgb) {
struct wlr_vk_render_format_setup *setup; struct wlr_vk_render_format_setup *setup;
wl_list_for_each(setup, &renderer->render_format_setups, link) { wl_list_for_each(setup, &renderer->render_format_setups, link) {
if (setup->render_format == format && if (setup->render_format == format &&
setup->use_blending_buffer == use_blending_buffer) { setup->use_blending_buffer == use_blending_buffer &&
setup->use_srgb == srgb) {
return setup; return setup;
} }
} }
@ -2242,6 +2243,7 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup(
setup->render_format = format; setup->render_format = format;
setup->use_blending_buffer = use_blending_buffer; setup->use_blending_buffer = use_blending_buffer;
setup->use_srgb = srgb;
setup->renderer = renderer; setup->renderer = renderer;
wl_list_init(&setup->pipelines); wl_list_init(&setup->pipelines);
@ -2390,9 +2392,8 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup(
goto error; goto error;
} }
} else { } else {
assert(format->vk_srgb);
VkAttachmentDescription attachment = { VkAttachmentDescription attachment = {
.format = format->vk_srgb, .format = format->vk,
.samples = VK_SAMPLE_COUNT_1_BIT, .samples = VK_SAMPLE_COUNT_1_BIT,
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE, .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
@ -2401,6 +2402,10 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup(
.initialLayout = VK_IMAGE_LAYOUT_GENERAL, .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
.finalLayout = VK_IMAGE_LAYOUT_GENERAL, .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
}; };
if (srgb) {
assert(format->vk_srgb);
attachment.format = format->vk_srgb;
}
VkAttachmentReference color_ref = { VkAttachmentReference color_ref = {
.attachment = 0u, .attachment = 0u,