diff options
Diffstat (limited to 'x11vnc/xdamage.c')
-rw-r--r-- | x11vnc/xdamage.c | 130 |
1 files changed, 128 insertions, 2 deletions
diff --git a/x11vnc/xdamage.c b/x11vnc/xdamage.c index 655b496..7b8b9b2 100644 --- a/x11vnc/xdamage.c +++ b/x11vnc/xdamage.c @@ -13,7 +13,13 @@ Damage xdamage = 0; #endif int use_xdamage = XDAMAGE; /* use the xdamage rects for scanline hints */ int xdamage_present = 0; + +#ifdef MACOSX +int xdamage_max_area = 50000; +#else int xdamage_max_area = 20000; /* pixels */ +#endif + double xdamage_memory = 1.0; /* in units of NSCAN */ int xdamage_tile_count = 0, xdamage_direct_count = 0; double xdamage_scheduled_mark = 0.0; @@ -24,6 +30,7 @@ int XD_skip = 0, XD_tot = 0, XD_des = 0; /* for stats */ void add_region_xdamage(sraRegionPtr new_region); void clear_xdamage_mark_region(sraRegionPtr markregion, int flush); +int collect_macosx_damage(int x_in, int y_in, int w_in, int h_in, int call); int collect_xdamage(int scancnt, int call); int xdamage_hint_skip(int y); void initialize_xdamage(void); @@ -31,7 +38,6 @@ void create_xdamage_if_needed(void); void destroy_xdamage_if_needed(void); void check_xdamage_state(void); - static void record_desired_xdamage_rect(int x, int y, int w, int h); @@ -158,7 +164,7 @@ void add_region_xdamage(sraRegionPtr new_region) { reg = xdamage_regions[prev_tick]; if (reg != NULL) { -if (0) fprintf(stderr, "add_region_xdamage: prev_tick: %d reg %p\n", prev_tick, (void *)reg); +if (debug_xdamage > 1) fprintf(stderr, "add_region_xdamage: prev_tick: %d reg %p\n", prev_tick, (void *)reg); sraRgnOr(reg, new_region); } } @@ -211,6 +217,125 @@ void clear_xdamage_mark_region(sraRegionPtr markregion, int flush) { #endif } +int collect_macosx_damage(int x_in, int y_in, int w_in, int h_in, int call) { + sraRegionPtr tmpregion; + sraRegionPtr reg; + static int rect_count = 0; + int nreg, ccount = 0, dcount = 0, ecount = 0; + static time_t last_rpt = 0; + time_t now; + double tm, dt; + int x, y, w, h, x2, y2; + +if (call && debug_xdamage > 1) fprintf(stderr, "collect_macosx_damage: %d %d %d %d - %d / %d\n", x_in, y_in, w_in, h_in, call, use_xdamage); + + if (! use_xdamage) { + return 0; + } + + dtime0(&tm); + + nreg = (xdamage_memory * NSCAN) + 1; + + if (call == 0) { + xdamage_ticker = (xdamage_ticker+1) % nreg; + xdamage_direct_count = 0; + reg = xdamage_regions[xdamage_ticker]; + sraRgnMakeEmpty(reg); + } else { + reg = xdamage_regions[xdamage_ticker]; + } + + if (x_in < 0) { + return 0; + } + + + x = x_in; + y = y_in; + w = w_in; + h = h_in; + + /* translate if needed */ + if (clipshift) { + /* set coords relative to fb origin */ + if (0 && rootshift) { + /* + * Note: not needed because damage is + * relative to subwin, not rootwin. + */ + x = x - off_x; + y = y - off_y; + } + if (clipshift) { + x = x - coff_x; + y = y - coff_y; + } + + x2 = x + w; /* upper point */ + x = nfix(x, dpy_x); /* place both in fb area */ + x2 = nfix(x2, dpy_x+1); + w = x2 - x; /* recompute w */ + + y2 = y + h; + y = nfix(y, dpy_y); + y2 = nfix(y2, dpy_y+1); + h = y2 - y; + + if (w <= 0 || h <= 0) { + return 0; + } + } + if (debug_xdamage > 2) { + fprintf(stderr, "xdamage: -> event %dx%d+%d+%d area:" + " %d dups: %d %s\n", w, h, x, y, w*h, dcount, + (w*h > xdamage_max_area) ? "TOO_BIG" : ""); + } + + record_desired_xdamage_rect(x, y, w, h); + + tmpregion = sraRgnCreateRect(x, y, x + w, y + h); + sraRgnOr(reg, tmpregion); + sraRgnDestroy(tmpregion); + rect_count++; + ccount++; + + if (0 && xdamage_direct_count) { + fb_push(); + } + + dt = dtime(&tm); + if ((debug_tiles > 1 && ecount) || (debug_tiles && ecount > 200) + || debug_xdamage > 1) { + fprintf(stderr, "collect_macosx_damage(%d): %.4f t: %.4f ev/dup/accept" + "/direct %d/%d/%d/%d\n", call, dt, tm - x11vnc_start, ecount, + dcount, ccount, xdamage_direct_count); + } + now = time(NULL); + if (! last_rpt) { + last_rpt = now; + } + if (now > last_rpt + 15) { + double rat = -1.0; + + if (XD_tot) { + rat = ((double) XD_skip)/XD_tot; + } + if (debug_tiles || debug_xdamage) { + fprintf(stderr, "xdamage: == scanline skip/tot: " + "%04d/%04d =%.3f rects: %d desired: %d\n", + XD_skip, XD_tot, rat, rect_count, XD_des); + } + + XD_skip = 0; + XD_tot = 0; + XD_des = 0; + rect_count = 0; + last_rpt = now; + } + return 0; +} + int collect_xdamage(int scancnt, int call) { #if LIBVNCSERVER_HAVE_LIBXDAMAGE XDamageNotifyEvent *dev; @@ -436,6 +561,7 @@ int xdamage_hint_skip(int y) { } } sraRgnDestroy(tmpl); +if (0) fprintf(stderr, "xdamage_hint_skip: %d -> %d\n", y, ret); return ret; } |