Кодирование функций в нескольких отрисовках, чтобы избежать дублирования - PullRequest
0 голосов
/ 03 января 2019

У меня есть следующий рендер-скрипт:

#pragma version(1)
#pragma rs java_package_name(some.mypkg)
#pragma rs_fp_relaxed

rs_allocation inputImg;

void root(const uint16_t *v_in, uint16_t *v_out,
          const void *usrData, uint32_t x, uint32_t y) {

    // Read in pixel values from latest frame - YUV color space
    uchar4 in_pixel= rsYuvToRGBA_uchar4(rsGetElementAtYuv_uchar_Y(inputImg, x, y),
                                        rsGetElementAtYuv_uchar_U(inputImg, x, y),
                                        rsGetElementAtYuv_uchar_V(inputImg, x, y));

    //Do some more stuff

    *v_out = newPixel;
}

void doWork( rs_script script, rs_allocation alloc_out) {

    //I cannot refer the input allocation here because I got runtime 
    //errors claiming that the allocations had different size. I think
    //it was caused by the format conversions.
    rsForEach(script, alloc_out, alloc_out);
}

Затем у меня есть еще один рендер-скрипт, который почти идентичен, я называю его при переходе с портретного на ландшафтный и мне нужно повернуть изображение на 90 градусов:

#pragma version(1)
#pragma rs java_package_name(some.mypkg)
#pragma rs_fp_relaxed

rs_allocation inputImg;

void root(const uint16_t *v_in, uint16_t *v_out,
          const void *usrData, uint32_t x, uint32_t y) {

    // Read in pixel values from latest frame - YUV color space
    uchar4 in_pixel= rsYuvToRGBA_uchar4(rsGetElementAtYuv_uchar_Y(inputImg, y, x),
                                        rsGetElementAtYuv_uchar_U(inputImg, y, x),
                                        rsGetElementAtYuv_uchar_V(inputImg, y, x));

    //Do some more stuff

    *v_out = newPixel;
}

void doWork( rs_script script, rs_allocation alloc_out) {

    //I cannot refer the input allocation here because I got runtime 
    //errors claiming that the allocations had different size. I think
    //it was caused by the format conversions.
    rsForEach(script, alloc_out, alloc_out);
}

Единственными отличиями являются функции {rsGetElementAtYuv_uchar_ $ YUV $ (inputImg, x, y )}, измененные на {rsGetElementAtYuv_uchar_ $ YUV $ (inputImg, y, x * 1010)*)}

На самом деле в финальной реализации у меня должно быть четыре сценария рендеринга для каждой функции, так что будет много дублирования кода, в «Делать еще что-то» есть много вещей, но худшийДело в том, что в Java-коде я должен разместить много ifs.С другой стороны, я не хочу помещать флаг с условием в ядре, потому что это сильно повлияет на производительность.

Есть ли способ сделать его чище, не влияя на производительность?Например, можно ли вызывать разные ядра из doWork (или создавать несколько forEach)?Можно ли из одного рендеринга вызвать функцию из другого рендеринга?

...