Fix segfaults (#291)

* Add NULL checks for effect_fbos

* Fix freeing undefined pixman region
This commit is contained in:
Erik Reider 2024-04-18 01:03:25 +02:00 committed by GitHub
parent 8ad2605c65
commit 40a5ebf109
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1592,6 +1592,9 @@ void output_render(struct fx_render_context *ctx) {
struct sway_output *output = ctx->output; struct sway_output *output = ctx->output;
pixman_region32_t *damage = ctx->output_damage; pixman_region32_t *damage = ctx->output_damage;
pixman_region32_t transformed_damage;
pixman_region32_init(&transformed_damage);
struct fx_effect_framebuffers *effect_fbos = ctx->pass->fx_effect_framebuffers; struct fx_effect_framebuffers *effect_fbos = ctx->pass->fx_effect_framebuffers;
struct sway_workspace *workspace = output->current.active_workspace; struct sway_workspace *workspace = output->current.active_workspace;
@ -1617,8 +1620,6 @@ void output_render(struct fx_render_context *ctx) {
}, },
}); });
} }
pixman_region32_t transformed_damage;
pixman_region32_init(&transformed_damage);
pixman_region32_copy(&transformed_damage, damage); pixman_region32_copy(&transformed_damage, damage);
transform_output_damage(&transformed_damage, wlr_output); transform_output_damage(&transformed_damage, wlr_output);
@ -1704,7 +1705,7 @@ void output_render(struct fx_render_context *ctx) {
pixman_region32_init(&blur_region); pixman_region32_init(&blur_region);
bool workspace_has_blur = workspace_get_blur_info(workspace, &blur_region); bool workspace_has_blur = workspace_get_blur_info(workspace, &blur_region);
// Expand the damage to compensate for blur // Expand the damage to compensate for blur
if (workspace_has_blur) { if (effect_fbos && workspace_has_blur) {
// Skip the blur artifact prevention if damaging the whole viewport // Skip the blur artifact prevention if damaging the whole viewport
if (effect_fbos->blur_buffer_dirty) { if (effect_fbos->blur_buffer_dirty) {
// Needs to be extended before clearing // Needs to be extended before clearing
@ -1765,7 +1766,7 @@ void output_render(struct fx_render_context *ctx) {
// Check if the background needs to be blurred. // Check if the background needs to be blurred.
// Render optimized/x-ray blur // Render optimized/x-ray blur
if (workspace_has_blur && effect_fbos->blur_buffer_dirty) { if (effect_fbos && workspace_has_blur && effect_fbos->blur_buffer_dirty) {
const float opacity = 1.0f; const float opacity = 1.0f;
struct fx_render_blur_pass_options blur_options = { struct fx_render_blur_pass_options blur_options = {
.tex_options = { .tex_options = {
@ -1828,7 +1829,7 @@ render_overlay:
renderer_end: renderer_end:
// Not needed if we damaged the whole viewport // Not needed if we damaged the whole viewport
if (!effect_fbos->blur_buffer_dirty) { if (effect_fbos && !effect_fbos->blur_buffer_dirty) {
// Render the saved pixels over the blur artifacts // Render the saved pixels over the blur artifacts
fx_renderer_read_to_buffer(ctx->pass, &effect_fbos->blur_padding_region, fx_renderer_read_to_buffer(ctx->pass, &effect_fbos->blur_padding_region,
ctx->pass->buffer, effect_fbos->blur_saved_pixels_buffer, true); ctx->pass->buffer, effect_fbos->blur_saved_pixels_buffer, true);