#include "src/cpu.h"
#include "src/cdef.h"

extern void BF(dav2d_cdef_filter_block_4x4, rvv)(pixel *dst, const ptrdiff_t dst_stride,
                                    const pixel (*left)[2],
                                    const pixel *const top, const pixel *const bottom,
                                    const int pri_strength, const int sec_strength, const int dir,
                                    const int damping, const enum CdefEdgeFlags edges HIGHBD_DECL_SUFFIX);

extern void BF(dav2d_cdef_filter_block_4x8, rvv)(pixel *dst, const ptrdiff_t dst_stride,
                                    const pixel (*left)[2],
                                    const pixel *const top, const pixel *const bottom,
                                    const int pri_strength, const int sec_strength, const int dir,
                                    const int damping, const enum CdefEdgeFlags edges HIGHBD_DECL_SUFFIX);

extern void BF(dav2d_cdef_filter_block_8x8, rvv)(pixel *dst, const ptrdiff_t dst_stride,
                                    const pixel (*left)[2],
                                    const pixel *const top, const pixel *const bottom,
                                    const int pri_strength, const int sec_strength, const int dir,
                                    const int damping, const enum CdefEdgeFlags edges HIGHBD_DECL_SUFFIX);


static ALWAYS_INLINE void cdef_dsp_init_riscv(Dav2dCdefDSPContext *const c) {
    const unsigned flags = dav2d_get_cpu_flags();
    if (!(flags & DAV2D_RISCV_CPU_FLAG_V)) return;

    // c->dir = BF(dav2d_cdef_dir, rvv);
    c->fb[0] = BF(dav2d_cdef_filter_block_8x8, rvv);
    c->fb[1] = BF(dav2d_cdef_filter_block_4x8, rvv);
    c->fb[2] = BF(dav2d_cdef_filter_block_4x4, rvv);
}
