mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-31 22:25:21 -04:00
render/vulkan: add support for PQ for textures
This commit is contained in:
parent
3a51a5c623
commit
a8144088df
3 changed files with 38 additions and 7 deletions
|
|
@ -152,6 +152,7 @@ struct wlr_vk_pipeline_layout {
|
||||||
enum wlr_vk_texture_transform {
|
enum wlr_vk_texture_transform {
|
||||||
WLR_VK_TEXTURE_TRANSFORM_IDENTITY = 0,
|
WLR_VK_TEXTURE_TRANSFORM_IDENTITY = 0,
|
||||||
WLR_VK_TEXTURE_TRANSFORM_SRGB = 1,
|
WLR_VK_TEXTURE_TRANSFORM_SRGB = 1,
|
||||||
|
WLR_VK_TEXTURE_TRANSFORM_ST2084_PQ = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum wlr_vk_shader_source {
|
enum wlr_vk_shader_source {
|
||||||
|
|
|
||||||
|
|
@ -781,13 +781,29 @@ 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 ||
|
enum wlr_color_transfer_function tf = options->transfer_function;
|
||||||
options->transfer_function == WLR_COLOR_TRANSFER_FUNCTION_SRGB;
|
if (tf == 0) {
|
||||||
bool srgb_image_view = srgb && texture->using_mutable_srgb;
|
tf = WLR_COLOR_TRANSFER_FUNCTION_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 :
|
bool srgb_image_view = false;
|
||||||
WLR_VK_TEXTURE_TRANSFORM_SRGB;
|
enum wlr_vk_texture_transform tex_transform = 0;
|
||||||
|
switch (tf) {
|
||||||
|
case WLR_COLOR_TRANSFER_FUNCTION_SRGB:
|
||||||
|
if (texture->using_mutable_srgb) {
|
||||||
|
tex_transform = WLR_VK_TEXTURE_TRANSFORM_IDENTITY;
|
||||||
|
srgb_image_view = true;
|
||||||
|
} else {
|
||||||
|
tex_transform = WLR_VK_TEXTURE_TRANSFORM_SRGB;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WLR_COLOR_TRANSFER_FUNCTION_EXT_LINEAR:
|
||||||
|
tex_transform = WLR_VK_TEXTURE_TRANSFORM_IDENTITY;
|
||||||
|
break;
|
||||||
|
case WLR_COLOR_TRANSFER_FUNCTION_ST2084_PQ:
|
||||||
|
tex_transform = WLR_VK_TEXTURE_TRANSFORM_ST2084_PQ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
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 :
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ layout (constant_id = 0) const int TEXTURE_TRANSFORM = 0;
|
||||||
// Matches enum wlr_vk_texture_transform
|
// Matches enum wlr_vk_texture_transform
|
||||||
#define TEXTURE_TRANSFORM_IDENTITY 0
|
#define TEXTURE_TRANSFORM_IDENTITY 0
|
||||||
#define TEXTURE_TRANSFORM_SRGB 1
|
#define TEXTURE_TRANSFORM_SRGB 1
|
||||||
|
#define TEXTURE_TRANSFORM_ST2084_PQ 2
|
||||||
|
|
||||||
float srgb_channel_to_linear(float x) {
|
float srgb_channel_to_linear(float x) {
|
||||||
return mix(x / 12.92,
|
return mix(x / 12.92,
|
||||||
|
|
@ -31,6 +32,17 @@ vec3 srgb_color_to_linear(vec3 color) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3 pq_color_to_linear(vec3 color) {
|
||||||
|
float inv_m1 = 1 / 0.1593017578125;
|
||||||
|
float inv_m2 = 1 / 78.84375;
|
||||||
|
float c1 = 0.8359375;
|
||||||
|
float c2 = 18.8515625;
|
||||||
|
float c3 = 18.6875;
|
||||||
|
vec3 num = max(pow(color, vec3(inv_m2)) - c1, 0);
|
||||||
|
vec3 denom = c2 - c3 * pow(color, vec3(inv_m2));
|
||||||
|
return pow(num / denom, vec3(inv_m1));
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec4 in_color = textureLod(tex, uv, 0);
|
vec4 in_color = textureLod(tex, uv, 0);
|
||||||
|
|
||||||
|
|
@ -45,6 +57,8 @@ void main() {
|
||||||
|
|
||||||
if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_SRGB) {
|
if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_SRGB) {
|
||||||
rgb = srgb_color_to_linear(rgb);
|
rgb = srgb_color_to_linear(rgb);
|
||||||
|
} else if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_ST2084_PQ) {
|
||||||
|
rgb = pq_color_to_linear(rgb);
|
||||||
}
|
}
|
||||||
|
|
||||||
rgb = mat3(data.matrix) * rgb;
|
rgb = mat3(data.matrix) * rgb;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue