mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-25 22:25:58 +01:00
renderer: Introduce wlr_scale_filter_mode
This commit is contained in:
parent
64c0272f81
commit
6bd44c4fcd
6 changed files with 50 additions and 3 deletions
|
@ -125,6 +125,7 @@ void vulkan_format_props_finish(struct wlr_vk_format_props *props);
|
||||||
|
|
||||||
struct wlr_vk_pipeline_layout_key {
|
struct wlr_vk_pipeline_layout_key {
|
||||||
const struct wlr_vk_format *ycbcr_format;
|
const struct wlr_vk_format *ycbcr_format;
|
||||||
|
enum wlr_scale_filter_mode filter_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wlr_vk_pipeline_layout {
|
struct wlr_vk_pipeline_layout {
|
||||||
|
|
|
@ -196,6 +196,16 @@ enum wlr_render_blend_mode {
|
||||||
WLR_RENDER_BLEND_MODE_NONE,
|
WLR_RENDER_BLEND_MODE_NONE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter modes.
|
||||||
|
*/
|
||||||
|
enum wlr_scale_filter_mode {
|
||||||
|
/* bilinear texture filtering (default) */
|
||||||
|
WLR_SCALE_FILTER_BILINEAR,
|
||||||
|
/* nearest texture filtering */
|
||||||
|
WLR_SCALE_FILTER_NEAREST,
|
||||||
|
};
|
||||||
|
|
||||||
struct wlr_render_texture_options {
|
struct wlr_render_texture_options {
|
||||||
/* Source texture */
|
/* Source texture */
|
||||||
struct wlr_texture *texture;
|
struct wlr_texture *texture;
|
||||||
|
@ -209,6 +219,8 @@ struct wlr_render_texture_options {
|
||||||
const pixman_region32_t *clip;
|
const pixman_region32_t *clip;
|
||||||
/* Transform applied to the source texture */
|
/* Transform applied to the source texture */
|
||||||
enum wl_output_transform transform;
|
enum wl_output_transform transform;
|
||||||
|
/* Filtering */
|
||||||
|
enum wlr_scale_filter_mode filter_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -170,7 +170,18 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(texture->target, texture->tex);
|
glBindTexture(texture->target, texture->tex);
|
||||||
glTexParameteri(texture->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
|
switch (options->filter_mode) {
|
||||||
|
case WLR_SCALE_FILTER_BILINEAR:
|
||||||
|
glTexParameteri(texture->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(texture->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
break;
|
||||||
|
case WLR_SCALE_FILTER_NEAREST:
|
||||||
|
glTexParameteri(texture->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(texture->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
glUniform1i(shader->tex, 0);
|
glUniform1i(shader->tex, 0);
|
||||||
glUniform1f(shader->alpha, alpha);
|
glUniform1f(shader->alpha, alpha);
|
||||||
set_proj_matrix(shader->proj, pass->projection_matrix, &dst_box);
|
set_proj_matrix(shader->proj, pass->projection_matrix, &dst_box);
|
||||||
|
|
|
@ -120,6 +120,15 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
height = src_box.height;
|
height = src_box.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (options->filter_mode) {
|
||||||
|
case WLR_SCALE_FILTER_BILINEAR:
|
||||||
|
pixman_image_set_filter(texture->image, PIXMAN_FILTER_BILINEAR, NULL, 0);
|
||||||
|
break;
|
||||||
|
case WLR_SCALE_FILTER_NEAREST:
|
||||||
|
pixman_image_set_filter(texture->image, PIXMAN_FILTER_NEAREST, NULL, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pixman_image_set_clip_region32(buffer->image, (pixman_region32_t *)options->clip);
|
pixman_image_set_clip_region32(buffer->image, (pixman_region32_t *)options->clip);
|
||||||
pixman_image_composite32(PIXMAN_OP_OVER, texture->image, mask,
|
pixman_image_composite32(PIXMAN_OP_OVER, texture->image, mask,
|
||||||
buffer->image, src_box.x, src_box.y, 0, 0, dest_x, dest_y,
|
buffer->image, src_box.x, src_box.y, 0, 0, dest_x, dest_y,
|
||||||
|
|
|
@ -547,6 +547,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||||
.source = WLR_VK_SHADER_SOURCE_TEXTURE,
|
.source = WLR_VK_SHADER_SOURCE_TEXTURE,
|
||||||
.layout = {
|
.layout = {
|
||||||
.ycbcr_format = texture->format->is_ycbcr ? texture->format : NULL,
|
.ycbcr_format = texture->format->is_ycbcr ? texture->format : NULL,
|
||||||
|
.filter_mode = options->filter_mode,
|
||||||
},
|
},
|
||||||
.texture_transform = texture->transform,
|
.texture_transform = texture->transform,
|
||||||
});
|
});
|
||||||
|
|
|
@ -2073,6 +2073,10 @@ static bool pipeline_layout_key_equals(
|
||||||
assert(!a->ycbcr_format || a->ycbcr_format->is_ycbcr);
|
assert(!a->ycbcr_format || a->ycbcr_format->is_ycbcr);
|
||||||
assert(!b->ycbcr_format || b->ycbcr_format->is_ycbcr);
|
assert(!b->ycbcr_format || b->ycbcr_format->is_ycbcr);
|
||||||
|
|
||||||
|
if (a->filter_mode != b->filter_mode) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (a->ycbcr_format != b->ycbcr_format) {
|
if (a->ycbcr_format != b->ycbcr_format) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2384,12 +2388,21 @@ struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
|
||||||
pipeline_layout->key = *key;
|
pipeline_layout->key = *key;
|
||||||
|
|
||||||
VkResult res;
|
VkResult res;
|
||||||
|
VkFilter filter;
|
||||||
|
switch (key->filter_mode) {
|
||||||
|
case WLR_SCALE_FILTER_BILINEAR:
|
||||||
|
filter = VK_FILTER_LINEAR;
|
||||||
|
break;
|
||||||
|
case WLR_SCALE_FILTER_NEAREST:
|
||||||
|
filter = VK_FILTER_NEAREST;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
VkSamplerYcbcrConversionInfo conversion_info;
|
VkSamplerYcbcrConversionInfo conversion_info;
|
||||||
VkSamplerCreateInfo sampler_create_info = {
|
VkSamplerCreateInfo sampler_create_info = {
|
||||||
.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
|
||||||
.magFilter = VK_FILTER_LINEAR,
|
.magFilter = filter,
|
||||||
.minFilter = VK_FILTER_LINEAR,
|
.minFilter = filter,
|
||||||
.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST,
|
.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST,
|
||||||
.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||||
.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||||
|
|
Loading…
Reference in a new issue