@@ -510,9 +510,20 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
510
510
input_tile_size = tile_size * scale;
511
511
output_tile_size = tile_size;
512
512
}
513
- int num_tiles_x = (input_width - (int )(input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
513
+ int tile_overlap = (input_tile_size * tile_overlap_factor);
514
+ int non_tile_overlap = input_tile_size - tile_overlap;
515
+
516
+ int num_tiles_x = (input_width - tile_overlap) / non_tile_overlap;
517
+ int overshoot_x = ((num_tiles_x + 1 ) * non_tile_overlap + tile_overlap) % input_width;
518
+
519
+ if ((overshoot_x != non_tile_overlap) && (overshoot_x <= num_tiles_x * (input_tile_size / 2 - tile_overlap))) {
520
+ // if tiles don't fit perfectly using the desired overlap
521
+ // and there is enough room to squeeze an extra tile without overlap becoming >0.5
522
+ num_tiles_x++;
523
+ }
524
+
514
525
float tile_overlap_factor_x = (float )(input_tile_size * num_tiles_x - input_width) / (float )(input_tile_size * (num_tiles_x - 1 ));
515
- if (num_tiles_x <= 1 ) {
526
+ if (num_tiles_x <= 2 ) {
516
527
if (input_width == input_tile_size) {
517
528
num_tiles_x = 1 ;
518
529
tile_overlap_factor_x = 0 ;
@@ -522,9 +533,17 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
522
533
}
523
534
}
524
535
525
- int num_tiles_y = (input_height - (int )(input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
536
+ int num_tiles_y = (input_height - tile_overlap) / non_tile_overlap;
537
+ int overshoot_y = ((num_tiles_y + 1 ) * non_tile_overlap + tile_overlap) % input_height;
538
+
539
+ if ((overshoot_y != non_tile_overlap) && (overshoot_y <= num_tiles_y * (input_tile_size / 2 - tile_overlap))) {
540
+ // if tiles don't fit perfectly using the desired overlap
541
+ // and there is enough room to squeeze an extra tile without overlap becoming >0.5
542
+ num_tiles_y++;
543
+ }
544
+
526
545
float tile_overlap_factor_y = (float )(input_tile_size * num_tiles_y - input_height) / (float )(input_tile_size * (num_tiles_y - 1 ));
527
- if (num_tiles_y <= 1 ) {
546
+ if (num_tiles_y <= 2 ) {
528
547
if (input_height == input_tile_size) {
529
548
num_tiles_y = 1 ;
530
549
tile_overlap_factor_y = 0 ;
0 commit comments