diff --git a/include/damage-refinery.h b/include/damage-refinery.h deleted file mode 100644 index 8fb3088..0000000 --- a/include/damage-refinery.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2020 - 2021 Andri Yngvason - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#pragma once - -#include - -struct pixman_region16; -struct wv_buffer; - -struct damage_refinery { - uint32_t* hashes; - uint32_t width; - uint32_t height; -}; - -int damage_refinery_init(struct damage_refinery* self, uint32_t width, - uint32_t height); -int damage_refinery_resize(struct damage_refinery* self, uint32_t width, - uint32_t height); -void damage_refinery_destroy(struct damage_refinery* self); - -void damage_refine(struct damage_refinery* self, - struct pixman_region16* refined, - struct pixman_region16* hint, - const struct wv_buffer* buffer); diff --git a/include/murmurhash.h b/include/murmurhash.h deleted file mode 100644 index b12ac2d..0000000 --- a/include/murmurhash.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2014 Joseph Werle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef MURMURHASH_H -#define MURMURHASH_H 1 - -#include - -#define MURMURHASH_VERSION "0.0.3" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Returns a murmur hash of `key' based on `seed' - * using the MurmurHash3 algorithm - */ - -uint32_t -murmurhash (const char *, uint32_t, uint32_t); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/meson.build b/meson.build index 27c2c35..14b9ee0 100644 --- a/meson.build +++ b/meson.build @@ -88,8 +88,6 @@ sources = [ 'src/buffer.c', 'src/pixels.c', 'src/transform-util.c', - 'src/damage-refinery.c', - 'src/murmurhash.c', ] dependencies = [ diff --git a/src/damage-refinery.c b/src/damage-refinery.c deleted file mode 100644 index 3de7d34..0000000 --- a/src/damage-refinery.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2020 - 2021 Andri Yngvason - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include - -#include "damage-refinery.h" -#include "buffer.h" -#include "util.h" -#include "murmurhash.h" - -#define HASH_SEED 0 - -int damage_refinery_init(struct damage_refinery* self, uint32_t width, - uint32_t height) -{ - self->width = width; - self->height = height; - - uint32_t twidth = UDIV_UP(width, 32); - uint32_t theight = UDIV_UP(height, 32); - - self->hashes = calloc(twidth * theight, sizeof(*self->hashes)); - if (!self->hashes) - return -1; - - return 0; -} - -int damage_refinery_resize(struct damage_refinery* self, uint32_t width, - uint32_t height) -{ - if (width == self->width && height == self->height) - return 0; - - damage_refinery_destroy(self); - return damage_refinery_init(self, width, height); -} - -void damage_refinery_destroy(struct damage_refinery* self) -{ - free(self->hashes); -} - -static uint32_t damage_hash_tile(struct damage_refinery* self, uint32_t tx, - uint32_t ty, const struct wv_buffer* buffer) -{ - // TODO: Support different pixel sizes - uint32_t* pixels = buffer->pixels; - int pixel_stride = buffer->stride / 4; - - if (buffer->y_inverted) { - pixels += (buffer->height - 1) * pixel_stride; - pixel_stride *= -1; - } - - int x_start = tx * 32; - int x_stop = MIN((tx + 1) * 32, self->width); - int y_start = ty * 32; - int y_stop = MIN((ty + 1) * 32, self->height); - - uint32_t hash = 0; - - for (int y = y_start; y < y_stop; ++y) - hash = murmurhash((void*)&(pixels[x_start + y * pixel_stride]), - 4 * (x_stop - x_start), hash); - - return hash; -} - -static uint32_t* damage_tile_hash_ptr(struct damage_refinery* self, - uint32_t tx, uint32_t ty) -{ - uint32_t twidth = UDIV_UP(self->width, 32); - return &self->hashes[tx + ty * twidth]; -} - -static void damage_refine_tile(struct damage_refinery* self, - struct pixman_region16* refined, uint32_t tx, uint32_t ty, - const struct wv_buffer* buffer) -{ - uint32_t hash = damage_hash_tile(self, tx, ty, buffer); - uint32_t* old_hash_ptr = damage_tile_hash_ptr(self, tx, ty); - int is_damaged = hash != *old_hash_ptr; - *old_hash_ptr = hash; - - if (is_damaged) - pixman_region_union_rect(refined, refined, tx * 32, ty * 32, 32, - 32); -} - -static void tile_region_from_region(struct pixman_region16* dst, - struct pixman_region16* src) -{ - int n_rects = 0; - struct pixman_box16* rects = pixman_region_rectangles(src, &n_rects); - - for (int i = 0; i < n_rects; ++i) { - int x1 = rects[i].x1 / 32; - int y1 = rects[i].y1 / 32; - int x2 = UDIV_UP(rects[i].x2, 32); - int y2 = UDIV_UP(rects[i].y2, 32); - - pixman_region_union_rect(dst, dst, x1, y1, x2 - x1, y2 - y1); - } -} - -void damage_refine(struct damage_refinery* self, - struct pixman_region16* refined, - struct pixman_region16* hint, - const struct wv_buffer* buffer) -{ - assert(self->width == (uint32_t)buffer->width && - self->height == (uint32_t)buffer->height); - - struct pixman_region16 tile_region; - pixman_region_init(&tile_region); - tile_region_from_region(&tile_region, hint); - - int n_rects = 0; - struct pixman_box16* rects = pixman_region_rectangles(&tile_region, - &n_rects); - - for (int i = 0; i < n_rects; ++i) - for (int ty = rects[i].y1; ty < rects[i].y2; ++ty) - for (int tx = rects[i].x1; tx < rects[i].x2; ++tx) - damage_refine_tile(self, refined, tx, ty, buffer); - - pixman_region_fini(&tile_region); - pixman_region_intersect_rect(refined, refined, 0, 0, self->width, - self->height); -} diff --git a/src/main.c b/src/main.c index 56ca3df..f52f121 100644 --- a/src/main.c +++ b/src/main.c @@ -96,8 +96,6 @@ struct wayvnc { struct nvnc* nvnc; struct nvnc_display* nvnc_display; - struct damage_refinery damage_refinery; - const char* kb_layout; const char* kb_variant; @@ -587,33 +585,11 @@ void wayvnc_process_frame(struct wayvnc* self) self->damage_area_sum += calculate_region_area(&buffer->damage); - uint32_t width = buffer->width; - uint32_t height = buffer->height; - - damage_refinery_resize(&self->damage_refinery, width, height); - - DTRACE_PROBE(wayvnc, refine_damage_start); - struct pixman_region16 refined; - pixman_region_init(&refined); - damage_refine(&self->damage_refinery, &refined, &buffer->damage, - buffer); - DTRACE_PROBE(wayvnc, refine_damage_end); - - struct pixman_region16 txdamage; - pixman_region_init(&txdamage); - wv_region_transform(&txdamage, &refined, - self->selected_output->transform, - self->selected_output->width, - self->selected_output->height); - pixman_region_fini(&refined); - nvnc_fb_set_transform(buffer->nvnc_fb, (enum nvnc_transform)self->selected_output->transform); nvnc_display_feed_buffer(self->nvnc_display, buffer->nvnc_fb, - &txdamage); - - pixman_region_fini(&txdamage); + &buffer->damage); wayvnc_start_capture(self); } @@ -967,8 +943,6 @@ int main(int argc, char* argv[]) screencopy_stop(&self.screencopy); - damage_refinery_destroy(&self.damage_refinery); - nvnc_display_unref(self.nvnc_display); nvnc_close(self.nvnc); if (zwp_linux_dmabuf) diff --git a/src/murmurhash.c b/src/murmurhash.c deleted file mode 100644 index 2edbf0e..0000000 --- a/src/murmurhash.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2014 Joseph Werle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include -#include -#include -#include "murmurhash.h" - -uint32_t -murmurhash (const char *key, uint32_t len, uint32_t seed) { - uint32_t c1 = 0xcc9e2d51; - uint32_t c2 = 0x1b873593; - uint32_t r1 = 15; - uint32_t r2 = 13; - uint32_t m = 5; - uint32_t n = 0xe6546b64; - uint32_t h = 0; - uint32_t k = 0; - uint8_t *d = (uint8_t *) key; // 32 bit extract from `key' - const uint32_t *chunks = NULL; - const uint8_t *tail = NULL; // tail - last 8 bytes - int i = 0; - int l = len / 4; // chunk length - - h = seed; - - chunks = (const uint32_t *) (d + l * 4); // body - tail = (const uint8_t *) (d + l * 4); // last 8 byte chunk of `key' - - // for each 4 byte chunk of `key' - for (i = -l; i != 0; ++i) { - // next 4 byte chunk of `key' - k = chunks[i]; - - // encode next 4 byte chunk of `key' - k *= c1; - k = (k << r1) | (k >> (32 - r1)); - k *= c2; - - // append to hash - h ^= k; - h = (h << r2) | (h >> (32 - r2)); - h = h * m + n; - } - - k = 0; - - // remainder - switch (len & 3) { // `len % 4' - case 3: k ^= (tail[2] << 16); - case 2: k ^= (tail[1] << 8); - - case 1: - k ^= tail[0]; - k *= c1; - k = (k << r1) | (k >> (32 - r1)); - k *= c2; - h ^= k; - } - - h ^= len; - - h ^= (h >> 16); - h *= 0x85ebca6b; - h ^= (h >> 13); - h *= 0xc2b2ae35; - h ^= (h >> 16); - - return h; -}