Add benchmark for zrle

tight-png
Andri Yngvason 2019-08-27 22:29:46 +00:00 committed by Andri Yngvason
parent 712215cc73
commit f31b5a6915
6 changed files with 77 additions and 8 deletions

7
.gitignore vendored
View File

@ -1,5 +1,8 @@
.clang_complete .clang_complete
src/*.o */*.o
src/*.o.deps */*.o.deps
neatvnc neatvnc
vgcore.* vgcore.*
perf.data
perf.data.old
zrle-bench

View File

@ -2,7 +2,7 @@ all: neatvnc
DEPENDENCIES := pixman-1 libpng libuv DEPENDENCIES := pixman-1 libpng libuv
CFLAGS := -g -O0 -std=gnu11 -D_GNU_SOURCE -Iinc \ CFLAGS := -g -O3 -DNDEBUG -std=gnu11 -D_GNU_SOURCE -Iinc \
$(foreach dep,$(DEPENDENCIES),$(shell pkg-config --cflags $(dep))) $(foreach dep,$(DEPENDENCIES),$(shell pkg-config --cflags $(dep)))
LDFLAGS := $(foreach dep,$(DEPENDENCIES),$(shell pkg-config --libs $(dep))) LDFLAGS := $(foreach dep,$(DEPENDENCIES),$(shell pkg-config --libs $(dep)))
@ -10,13 +10,20 @@ LDFLAGS := $(foreach dep,$(DEPENDENCIES),$(shell pkg-config --libs $(dep)))
neatvnc: src/server.o src/util.o src/vec.o src/zrle.o src/pngfb.o neatvnc: src/server.o src/util.o src/vec.o src/zrle.o src/pngfb.o
$(CC) $^ $(LDFLAGS) -o $@ $(CC) $^ $(LDFLAGS) -o $@
zrle-bench: bench/zrle-bench.o src/server.o src/util.o src/vec.o src/zrle.o \
src/pngfb.o
$(CC) $^ $(LDFLAGS) -o $@
src/%.o: src/%.c src/%.o: src/%.c
$(CC) -c $(CFLAGS) $< -o $@ -MMD -MP -MF $@.deps $(CC) -c $(CFLAGS) $< -o $@ -MMD -MP -MF $@.deps
bench/%.o: bench/%.c
$(CC) -c $(CFLAGS) $< -o $@ -MMD -MP -MF $@.deps
.PHONY: clean .PHONY: clean
clean: clean:
rm -f neatvnc rm -f neatvnc
rm -f src/*.o src/*.deps rm -f src/*.o src/*.deps bench/*.o bench/*.deps
-include src/*.deps -include src/*.deps

59
bench/zrle-bench.c 100644
View File

@ -0,0 +1,59 @@
#include "zrle.h"
#include "rfb-proto.h"
#include "util.h"
#include "vec.h"
#include <stdlib.h>
#include <libdrm/drm_fourcc.h>
#include <pixman.h>
int read_png_file(struct vnc_framebuffer* fb, const char *filename);
int run_benchmark(const char *image)
{
int rc = -1;
struct vnc_framebuffer fb;
rc = read_png_file(&fb, image);
if (rc < 0)
return -1;
struct rfb_pixel_format pixfmt;
rfb_pixfmt_from_fourcc(&pixfmt, DRM_FORMAT_ARGB8888);
struct pixman_region16 region;
pixman_region_init(&region);
pixman_region_union_rect(&region, &region, 0, 0, fb.width, fb.height);
struct vec frame;
vec_init(&frame, fb.width * fb.height * 3 / 2);
rc = zrle_encode_frame(&frame, &pixfmt, fb.addr, &pixfmt,
fb.width, fb.height, &region);
if (rc < 0)
goto failure;
rc = 0;
failure:
pixman_region_fini(&region);
vec_destroy(&frame);
free(fb.addr);
return 0;
}
int main(int argc, char *argv[])
{
int rc = 0;
char *image = argv[1];
if (image)
return run_benchmark(image) < 0 ? 1 :0;
rc |= run_benchmark("test-images/tv-test-card.png") < 0 ? 1 : 0;
rc |= run_benchmark("test-images/lena-soderberg.png") < 0 ? 1 : 0;
return rc;
}

View File

@ -19,4 +19,6 @@ struct vnc_write_request {
int vnc__write(uv_stream_t *stream, const void *payload, size_t size, int vnc__write(uv_stream_t *stream, const void *payload, size_t size,
uv_write_cb on_done); uv_write_cb on_done);
int rfb_pixfmt_from_fourcc(struct rfb_pixel_format *dst, uint32_t src);
#endif /* _VNC_UTIL_H_ */ #endif /* _VNC_UTIL_H_ */

View File

@ -685,6 +685,7 @@ failure:
int read_png_file(struct vnc_framebuffer* fb, const char *filename); int read_png_file(struct vnc_framebuffer* fb, const char *filename);
/*
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (!argv[1]) { if (!argv[1]) {
@ -709,3 +710,4 @@ int main(int argc, char *argv[])
uv_run(uv_default_loop(), UV_RUN_DEFAULT); uv_run(uv_default_loop(), UV_RUN_DEFAULT);
} }
*/

View File

@ -235,9 +235,6 @@ int zrle_encode_box(struct vec* out, const struct rfb_pixel_format *dst_fmt,
int tile_width = width - tile_x >= 64 ? 64 : width - tile_x; int tile_width = width - tile_x >= 64 ? 64 : width - tile_x;
int tile_height = height - tile_y >= 64 ? 64 : height - tile_y; int tile_height = height - tile_y >= 64 ? 64 : height - tile_y;
printf("Encoding tile @ %dx%d. width: %d, height: %d\n", tile_x,
tile_y, tile_width, tile_height);
zrle_encode_tile(&in, dst_fmt, zrle_encode_tile(&in, dst_fmt,
((uint32_t*)src) + tile_x + tile_y * width, ((uint32_t*)src) + tile_x + tile_y * width,
src_fmt, stride, tile_width, tile_height); src_fmt, stride, tile_width, tile_height);
@ -251,7 +248,6 @@ int zrle_encode_box(struct vec* out, const struct rfb_pixel_format *dst_fmt,
/* There seems to be something extra at the end */ /* There seems to be something extra at the end */
out->len -= 4; out->len -= 4;
printf("Encoded with size: %lu\n", out->len - size_index);
uint32_t out_size = htonl(out->len - size_index - 4); uint32_t out_size = htonl(out->len - size_index - 4);
memcpy(((uint8_t*)out->data) + size_index, &out_size, sizeof(out_size)); memcpy(((uint8_t*)out->data) + size_index, &out_size, sizeof(out_size));