fix: swap _v/_h dispatch fn selection — naming refers to filter direction not edge direction
This commit is contained in:
@@ -105,28 +105,47 @@ static int build_mb_edges(int mb_x, int mb_y, int last_mb_x, int last_mb_y,
|
||||
(e == 0) ? 4 : (int)(1 + xs64() % 3),
|
||||
/*boundary?*/ (e == 0 && mb_y == 0));
|
||||
|
||||
/* V chroma Cb: 2 edges. */
|
||||
/* DEBLOCK_CHROMA_MODE selector for bisect:
|
||||
* unset / "all" → all chroma edges (default).
|
||||
* "intra_only" → only bS=4 boundary edges.
|
||||
* "h_only" → bS<4 H edges + bS=4 H edges, no V chroma at all.
|
||||
* "v_only" → bS<4 V edges + bS=4 V edges, no H chroma.
|
||||
* "none" → no chroma edges (luma-only). */
|
||||
int chroma_intra_only = 0, chroma_none = 0;
|
||||
int skip_v_chroma = 0, skip_h_chroma = 0;
|
||||
const char *cm = getenv("DEBLOCK_CHROMA_MODE");
|
||||
if (cm) {
|
||||
if (!strcmp(cm, "intra_only")) chroma_intra_only = 1;
|
||||
else if (!strcmp(cm, "none")) chroma_none = 1;
|
||||
else if (!strcmp(cm, "h_only")) skip_v_chroma = 1;
|
||||
else if (!strcmp(cm, "v_only")) skip_h_chroma = 1;
|
||||
}
|
||||
|
||||
for (int e = 0; e < 2; e++)
|
||||
EDGE(0, /*Cb*/1, e,
|
||||
(e == 0) ? 4 : (int)(1 + xs64() % 3),
|
||||
(chroma_none) || skip_v_chroma || (chroma_intra_only && e != 0) ||
|
||||
(e == 0 && mb_x == 0));
|
||||
|
||||
/* H chroma Cb. */
|
||||
for (int e = 0; e < 2; e++)
|
||||
EDGE(1, 1, e,
|
||||
(e == 0) ? 4 : (int)(1 + xs64() % 3),
|
||||
(chroma_none) || skip_h_chroma || (chroma_intra_only && e != 0) ||
|
||||
(e == 0 && mb_y == 0));
|
||||
|
||||
/* V chroma Cr. */
|
||||
for (int e = 0; e < 2; e++)
|
||||
EDGE(0, /*Cr*/2, e,
|
||||
(e == 0) ? 4 : (int)(1 + xs64() % 3),
|
||||
(chroma_none) || skip_v_chroma || (chroma_intra_only && e != 0) ||
|
||||
(e == 0 && mb_x == 0));
|
||||
|
||||
/* H chroma Cr. */
|
||||
for (int e = 0; e < 2; e++)
|
||||
EDGE(1, 2, e,
|
||||
(e == 0) ? 4 : (int)(1 + xs64() % 3),
|
||||
(chroma_none) || skip_h_chroma || (chroma_intra_only && e != 0) ||
|
||||
(e == 0 && mb_y == 0));
|
||||
|
||||
#undef EDGE
|
||||
@@ -246,12 +265,30 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Check 1: CPU vs QPU byte-exact. */
|
||||
size_t y_diffs = 0, uv_diffs = 0;
|
||||
size_t y_first = (size_t) -1, uv_first = (size_t) -1;
|
||||
for (size_t i = 0; i < y_size; i++)
|
||||
if (out_cpu_y[i] != out_qpu_y[i]) y_diffs++;
|
||||
if (out_cpu_y[i] != out_qpu_y[i]) {
|
||||
if (y_first == (size_t) -1) y_first = i;
|
||||
y_diffs++;
|
||||
}
|
||||
for (size_t i = 0; i < uv_size; i++)
|
||||
if (out_cpu_uv[i] != out_qpu_uv[i]) uv_diffs++;
|
||||
if (out_cpu_uv[i] != out_qpu_uv[i]) {
|
||||
if (uv_first == (size_t) -1) uv_first = i;
|
||||
uv_diffs++;
|
||||
}
|
||||
printf("CPU vs QPU: Y diff %zu/%zu, UV diff %zu/%zu\n",
|
||||
y_diffs, y_size, uv_diffs, uv_size);
|
||||
if (uv_diffs && uv_first != (size_t)-1) {
|
||||
size_t chroma_w = (size_t) width; /* NV12 UV row pitch = width */
|
||||
size_t row = uv_first / chroma_w;
|
||||
size_t col = uv_first % chroma_w;
|
||||
size_t mb_x = col / 16; /* NV12 interleaved Cb/Cr; 2 chroma px per pair → 8 chroma cols / MB but 16 NV12 bytes */
|
||||
size_t mb_y = row / 8;
|
||||
printf(" first UV diff at byte %zu (row %zu col %zu) -> MB(%zu,%zu) chroma_%s offset (%zu,%zu)\n",
|
||||
uv_first, row, col, mb_x, mb_y,
|
||||
(col & 1) ? "Cr" : "Cb", row % 8, (col % 16) / 2);
|
||||
printf(" CPU=%u QPU=%u\n", out_cpu_uv[uv_first], out_qpu_uv[uv_first]);
|
||||
}
|
||||
if (y_diffs != 0 || uv_diffs != 0) {
|
||||
fprintf(stderr, "FAIL: CPU and QPU outputs differ — dispatch wiring broken\n");
|
||||
return 1;
|
||||
|
||||
Reference in New Issue
Block a user