aboutsummaryrefslogtreecommitdiff
path: root/render/vulkan/renderer.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/vulkan/renderer.c')
-rw-r--r--render/vulkan/renderer.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c
index ef3184c3..0ef256c2 100644
--- a/render/vulkan/renderer.c
+++ b/render/vulkan/renderer.c
@@ -164,7 +164,8 @@ static void destroy_render_format_setup(struct wlr_vk_renderer *renderer,
VkDevice dev = renderer->dev->dev;
vkDestroyRenderPass(dev, setup->render_pass, NULL);
- vkDestroyPipeline(dev, setup->tex_pipe, NULL);
+ vkDestroyPipeline(dev, setup->tex_identity_pipe, NULL);
+ vkDestroyPipeline(dev, setup->tex_srgb_pipe, NULL);
vkDestroyPipeline(dev, setup->quad_pipe, NULL);
}
@@ -970,7 +971,13 @@ static bool vulkan_render_subtexture_with_matrix(struct wlr_renderer *wlr_render
wl_list_insert(&renderer->foreign_textures, &texture->foreign_link);
}
- VkPipeline pipe = renderer->current_render_buffer->render_setup->tex_pipe;
+ VkPipeline pipe;
+ // SRGB formats already have the transfer function applied
+ if (texture->format->is_srgb) {
+ pipe = renderer->current_render_buffer->render_setup->tex_identity_pipe;
+ } else {
+ pipe = renderer->current_render_buffer->render_setup->tex_srgb_pipe;
+ }
if (pipe != renderer->bound_pipe) {
vkCmdBindPipeline(cb, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe);
renderer->bound_pipe = pipe;
@@ -1501,10 +1508,26 @@ static bool init_tex_layouts(struct wlr_vk_renderer *renderer,
// Initializes the pipeline for rendering textures and using the given
// VkRenderPass and VkPipelineLayout.
static bool init_tex_pipeline(struct wlr_vk_renderer *renderer,
- VkRenderPass rp, VkPipelineLayout pipe_layout, VkPipeline *pipe) {
+ VkRenderPass rp, VkPipelineLayout pipe_layout,
+ enum wlr_vk_texture_transform transform, VkPipeline *pipe) {
VkResult res;
VkDevice dev = renderer->dev->dev;
+ uint32_t color_transform_type = transform;
+
+ VkSpecializationMapEntry spec_entry = {
+ .constantID = 0,
+ .offset = 0,
+ .size = sizeof(uint32_t),
+ };
+
+ VkSpecializationInfo specialization = {
+ .mapEntryCount = 1,
+ .pMapEntries = &spec_entry,
+ .dataSize = sizeof(uint32_t),
+ .pData = &color_transform_type,
+ };
+
// shaders
VkPipelineShaderStageCreateInfo tex_stages[2] = {
{
@@ -1518,6 +1541,7 @@ static bool init_tex_pipeline(struct wlr_vk_renderer *renderer,
.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
.module = renderer->tex_frag_module,
.pName = "main",
+ .pSpecializationInfo = &specialization,
},
};
@@ -1657,7 +1681,7 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) {
return false;
}
- // tex frag
+ // tex frags
sinfo = (VkShaderModuleCreateInfo){
.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
.codeSize = sizeof(texture_frag_data),
@@ -1774,7 +1798,12 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup(
}
if (!init_tex_pipeline(renderer, setup->render_pass, renderer->pipe_layout,
- &setup->tex_pipe)) {
+ WLR_VK_TEXTURE_TRANSFORM_IDENTITY, &setup->tex_identity_pipe)) {
+ goto error;
+ }
+
+ if (!init_tex_pipeline(renderer, setup->render_pass, renderer->pipe_layout,
+ WLR_VK_TEXTURE_TRANSFORM_SRGB, &setup->tex_srgb_pipe)) {
goto error;
}