switch to integer division trick in downsample

thanks to eggs for the tip
This commit is contained in:
Shaun Inman 2023-02-11 21:25:21 -05:00
parent ba1e74b1c8
commit edaadd1f45

View file

@ -3346,52 +3346,22 @@ static int Menu_options(MenuList* list) {
return 0; return 0;
} }
static void downsample_ORIGINAL(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) { static void downsample(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) {
double x_step = w / (double)FIXED_WIDTH; // TODO: broken when pcsx_rearmed is the active core, returns -0.0 uint32_t ox = 0;
double y_step = h / (double)FIXED_HEIGHT; uint32_t oy = 0;
uint32_t ix = (w<<16) / FIXED_WIDTH;
uint32_t iy = (h<<16) / FIXED_HEIGHT;
double ox = 0;
double oy = 0;
for (int y=0; y<FIXED_HEIGHT; y++) { for (int y=0; y<FIXED_HEIGHT; y++) {
uint16_t* restrict src_row = (void*)src + ((int)oy * pitch); uint16_t* restrict src_row = (void*)src + (oy>>16) * pitch;
uint16_t* restrict dst_row = (void*)dst + y * dst_pitch; uint16_t* restrict dst_row = (void*)dst + y * dst_pitch;
for (int x=0; x<FIXED_WIDTH; x++) { for (int x=0; x<FIXED_WIDTH; x++) {
*dst_row = *(src_row + (int)ox); *dst_row = *(src_row + (ox>>16));
dst_row += 1; dst_row += 1;
ox += x_step; ox += ix;
} }
ox = 0; ox = 0;
oy += y_step; oy += iy;
}
}
static void downsample(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) {
int dx = w - FIXED_WIDTH;
int dy = h - FIXED_HEIGHT;
int ax = 0;
int ay = 0;
int ox = 0;
int oy = 0;
for (int y=0; y<FIXED_HEIGHT; y++) {
uint16_t* restrict src_row = (void*)src + (oy * pitch);
uint16_t* restrict dst_row = (void*)dst + (y * dst_pitch);
for (int x=0; x<FIXED_WIDTH; x++) {
*dst_row = *(src_row + ox);
dst_row += 1;
ox += 1;
ax += dx;
while (ax>=FIXED_WIDTH) {
ax -= FIXED_WIDTH;
ox += 1;
}
}
ox = 0;
oy += 1;
ay += dy;
while (ay>=FIXED_HEIGHT) {
ay -= FIXED_HEIGHT;
oy += 1;
}
} }
} }