diff --git a/include/render/vulkan.h b/include/render/vulkan.h index c3fb6b2bf..00cc33ea0 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -340,6 +340,7 @@ struct wlr_vk_vert_pcr_data { }; struct wlr_vk_frag_texture_pcr_data { + float matrix[4][4]; // only a 3x3 subset is used float alpha; }; diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 49435b0e8..68be473cf 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -816,9 +816,13 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass, return; } + float color_matrix[9]; + wlr_matrix_identity(color_matrix); + struct wlr_vk_frag_texture_pcr_data frag_pcr_data = { .alpha = alpha, }; + encode_color_matrix(color_matrix, frag_pcr_data.matrix); bind_pipeline(pass, pipe->vk); diff --git a/render/vulkan/shaders/texture.frag b/render/vulkan/shaders/texture.frag index 58ac59fea..dc4f60cfe 100644 --- a/render/vulkan/shaders/texture.frag +++ b/render/vulkan/shaders/texture.frag @@ -6,8 +6,9 @@ layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_color; // struct wlr_vk_frag_texture_pcr_data -layout(push_constant) uniform UBO { - layout(offset = 80) float alpha; +layout(push_constant, row_major) uniform UBO { + layout(offset = 80) mat4 matrix; + float alpha; } data; layout (constant_id = 0) const int TEXTURE_TRANSFORM = 0; @@ -33,11 +34,6 @@ vec3 srgb_color_to_linear(vec3 color) { void main() { vec4 in_color = textureLod(tex, uv, 0); - if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_IDENTITY) { - out_color = in_color * data.alpha; - return; - } - // Convert from pre-multiplied alpha to straight alpha float alpha = in_color.a; vec3 rgb; @@ -51,6 +47,8 @@ void main() { rgb = srgb_color_to_linear(rgb); } + rgb = mat3(data.matrix) * rgb; + // Back to pre-multiplied alpha out_color = vec4(rgb * alpha, alpha);