moved more into fx_renderer
This commit is contained in:
parent
51fde22616
commit
5ffa10eede
3 changed files with 27 additions and 29 deletions
|
@ -189,5 +189,6 @@ void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *bo
|
||||||
const float color[static 4], const float matrix[static 9], int radius,
|
const float color[static 4], const float matrix[static 9], int radius,
|
||||||
float blur_sigma);
|
float blur_sigma);
|
||||||
|
|
||||||
void fx_render_main_buffer_blur(struct fx_renderer *renderer, const float gl_matrix[static 9], pixman_region32_t *damage, const struct wlr_box *dst_box, struct fx_framebuffer **current_buffer, int blur_radius, int blur_passes);
|
struct fx_framebuffer *fx_render_main_buffer_blur(struct fx_renderer *renderer, const float matrix[static 9],
|
||||||
|
pixman_region32_t *damage, const struct wlr_box *dst_box, int blur_radius, int blur_passes);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -809,11 +809,8 @@ void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *bo
|
||||||
glDisable(GL_STENCIL_TEST);
|
glDisable(GL_STENCIL_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static 9],
|
void fx_render_blur_pass(struct fx_renderer *renderer, const float gl_matrix[static 9],
|
||||||
struct blur_shader *shader, const struct wlr_box *box, int blur_radius, struct fx_framebuffer **buffer) {
|
struct blur_shader *shader, const struct wlr_box *box, int blur_radius, struct fx_framebuffer **buffer) {
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_STENCIL_TEST);
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
|
||||||
glBindTexture((*buffer)->texture.target, (*buffer)->texture.id);
|
glBindTexture((*buffer)->texture.target, (*buffer)->texture.id);
|
||||||
|
@ -824,8 +821,6 @@ void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static
|
||||||
|
|
||||||
// OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
|
// OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
|
||||||
// to GL_FALSE
|
// to GL_FALSE
|
||||||
float gl_matrix[9];
|
|
||||||
wlr_matrix_transpose(gl_matrix, matrix);
|
|
||||||
glUniformMatrix3fv(shader->proj, 1, GL_FALSE, gl_matrix);
|
glUniformMatrix3fv(shader->proj, 1, GL_FALSE, gl_matrix);
|
||||||
|
|
||||||
glUniform1i(shader->tex, 0);
|
glUniform1i(shader->tex, 0);
|
||||||
|
@ -849,7 +844,7 @@ void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static
|
||||||
glDisableVertexAttribArray(shader->tex_attrib);
|
glDisableVertexAttribArray(shader->tex_attrib);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[static 9],
|
void fx_render_blur_segments(struct fx_renderer *renderer, const float gl_matrix[static 9],
|
||||||
pixman_region32_t *damage, struct fx_framebuffer **buffer, struct blur_shader* shader,
|
pixman_region32_t *damage, struct fx_framebuffer **buffer, struct blur_shader* shader,
|
||||||
const struct wlr_box *box, int blur_radius) {
|
const struct wlr_box *box, int blur_radius) {
|
||||||
if (*buffer == &renderer->effects_buffer) {
|
if (*buffer == &renderer->effects_buffer) {
|
||||||
|
@ -865,7 +860,7 @@ void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[st
|
||||||
const pixman_box32_t box = rects[i];
|
const pixman_box32_t box = rects[i];
|
||||||
struct wlr_box new_box = { box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1 };
|
struct wlr_box new_box = { box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1 };
|
||||||
fx_renderer_scissor(&new_box);
|
fx_renderer_scissor(&new_box);
|
||||||
fx_render_blur_pass(renderer, matrix, shader, &new_box, blur_radius, buffer);
|
fx_render_blur_pass(renderer, gl_matrix, shader, &new_box, blur_radius, buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -876,34 +871,44 @@ void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fx_render_main_buffer_blur(struct fx_renderer *renderer, const float gl_matrix[static 9],
|
struct fx_framebuffer *fx_render_main_buffer_blur(struct fx_renderer *renderer, const float matrix[static 9],
|
||||||
pixman_region32_t *damage, const struct wlr_box *dst_box,
|
pixman_region32_t *damage, const struct wlr_box *dst_box, int blur_radius, int blur_passes) {
|
||||||
struct fx_framebuffer **current_buffer, int blur_radius, int blur_passes) {
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
|
||||||
|
struct fx_framebuffer *current_buffer = &renderer->main_buffer;
|
||||||
|
|
||||||
// Bind to blur framebuffer
|
// Bind to blur framebuffer
|
||||||
fx_framebuffer_bind(&renderer->effects_buffer);
|
fx_framebuffer_bind(&renderer->effects_buffer);
|
||||||
glBindTexture(renderer->main_buffer.texture.target, renderer->main_buffer.texture.id);
|
glBindTexture(renderer->main_buffer.texture.target, renderer->main_buffer.texture.id);
|
||||||
|
|
||||||
|
float gl_matrix[9];
|
||||||
|
wlr_matrix_multiply(gl_matrix, renderer->projection, matrix);
|
||||||
|
wlr_matrix_transpose(gl_matrix, gl_matrix);
|
||||||
|
|
||||||
// damage region will be scaled, make a temp
|
// damage region will be scaled, make a temp
|
||||||
pixman_region32_t tempDamage;
|
pixman_region32_t temp_damage;
|
||||||
pixman_region32_init(&tempDamage);
|
pixman_region32_init(&temp_damage);
|
||||||
|
|
||||||
// Downscale
|
// Downscale
|
||||||
for (int i = 0; i < blur_passes; ++i) {
|
for (int i = 0; i < blur_passes; ++i) {
|
||||||
wlr_region_scale(&tempDamage, damage, 1.0f / (1 << (i + 1)));
|
wlr_region_scale(&temp_damage, damage, 1.0f / (1 << (i + 1)));
|
||||||
fx_render_blur_segments(renderer, gl_matrix, &tempDamage, current_buffer,
|
fx_render_blur_segments(renderer, gl_matrix, &temp_damage, ¤t_buffer,
|
||||||
&renderer->shaders.blur1, dst_box, blur_radius);
|
&renderer->shaders.blur1, dst_box, blur_radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upscale
|
// Upscale
|
||||||
for (int i = blur_passes - 1; i >= 0; --i) {
|
for (int i = blur_passes - 1; i >= 0; --i) {
|
||||||
// when upsampling we make the region twice as big
|
// when upsampling we make the region twice as big
|
||||||
wlr_region_scale(&tempDamage, damage, 1.0f / (1 << i));
|
wlr_region_scale(&temp_damage, damage, 1.0f / (1 << i));
|
||||||
fx_render_blur_segments(renderer, gl_matrix, &tempDamage, current_buffer,
|
fx_render_blur_segments(renderer, gl_matrix, &temp_damage, ¤t_buffer,
|
||||||
&renderer->shaders.blur2, dst_box, blur_radius);
|
&renderer->shaders.blur2, dst_box, blur_radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
pixman_region32_fini(&tempDamage);
|
pixman_region32_fini(&temp_damage);
|
||||||
|
|
||||||
// Bind back to the default buffer
|
// Bind back to the default buffer
|
||||||
fx_framebuffer_bind(&renderer->main_buffer);
|
fx_framebuffer_bind(&renderer->main_buffer);
|
||||||
|
|
||||||
|
return current_buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,22 +189,14 @@ struct fx_framebuffer *render_main_buffer_blur(struct sway_output *output,
|
||||||
float matrix[9];
|
float matrix[9];
|
||||||
wlr_matrix_project_box(matrix, &monitor_box, transform, 0, wlr_output->transform_matrix);
|
wlr_matrix_project_box(matrix, &monitor_box, transform, 0, wlr_output->transform_matrix);
|
||||||
|
|
||||||
float gl_matrix[9];
|
|
||||||
wlr_matrix_multiply(gl_matrix, renderer->projection, matrix);
|
|
||||||
|
|
||||||
pixman_region32_t damage;
|
pixman_region32_t damage;
|
||||||
pixman_region32_init(&damage);
|
pixman_region32_init(&damage);
|
||||||
pixman_region32_copy(&damage, original_damage);
|
pixman_region32_copy(&damage, original_damage);
|
||||||
wlr_region_transform(&damage, &damage, transform, monitor_box.width, monitor_box.height);
|
wlr_region_transform(&damage, &damage, transform, monitor_box.width, monitor_box.height);
|
||||||
|
|
||||||
wlr_region_expand(&damage, &damage, config_get_blur_size());
|
wlr_region_expand(&damage, &damage, config_get_blur_size());
|
||||||
|
|
||||||
// Initially blur main_buffer content into the effects_buffers
|
struct fx_framebuffer *current_buffer = fx_render_main_buffer_blur(renderer, matrix, &damage,
|
||||||
struct fx_framebuffer *current_buffer = &renderer->main_buffer;
|
dst_box, config->blur_params.radius, config->blur_params.num_passes);
|
||||||
|
|
||||||
int blur_radius = config->blur_params.radius;
|
|
||||||
int blur_passes = config->blur_params.num_passes;
|
|
||||||
fx_render_main_buffer_blur(renderer, gl_matrix, &damage, dst_box, ¤t_buffer, blur_radius, blur_passes);
|
|
||||||
|
|
||||||
pixman_region32_fini(&damage);
|
pixman_region32_fini(&damage);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue