Создать ответ 
 
Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ассемблер
Автор Сообщение
uncle Не на форуме
Новичок
*

Сообщений: 19
Зарегистрирован: 18.04.2005
Рейтинг: 0
Сказал спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщ.
Сообщение: #36
RE: Ассемблер
Код:
#include <kos.h>


static vuint32 * const tareg = (vuint32 *)0xa05f8000;


// YUVCONV registers
#define TA_YUV_TEX_BASE 0x148/4
#define TA_YUV_TEX_CTRL 0x14c/4
#define TA_YUV_TEX_CNT  0x150/4


static void block8x8_sq_copy(uint32 *s, uint32 * &d, int stride_4) {

    d[0] = s[0];
    d[1] = s[1];
    s += stride_4;

    d[2] = s[0];
    d[3] = s[1];
    s += stride_4;

    d[4] = s[0];
    d[5] = s[1];
    s += stride_4;

    d[6] = s[0];
    d[7] = s[1];
    s += stride_4;

    __asm__("pref @%0" : : "r"(d));
    d += 8;

    d[0] = s[0];
    d[1] = s[1];
    s += stride_4;

    d[2] = s[0];
    d[3] = s[1];
    s += stride_4;

    d[4] = s[0];
    d[5] = s[1];
    s += stride_4;

    d[6] = s[0];
    d[7] = s[1];

    __asm__("pref @%0" : : "r"(d));
    d += 8;
}



extern "C" void mbcopy(uint8 *y, uint8 *u, uint8 *v, pvr_ptr_t dest, int w, int h) {

    tareg[TA_YUV_TEX_BASE] = (unsigned long)dest;
    tareg[TA_YUV_TEX_CTRL] = ((w / 16 - 1) << 8) | (h / 16 - 1);

    int val = tareg[TA_YUV_TEX_CTRL];

    dest = (pvr_ptr_t)0x10800000;

    /* Set store queue memory area as desired */
    QACR0 = ((((unsigned int)dest) >> 26) << 2) & 0x1c;
    QACR1 = ((((unsigned int)dest) >> 26) << 2) & 0x1c;

    int stride_y_4 = w / 4;
    int stride_uv_4 = w / 8;

    uint32 *dst = (uint32 *)(void *)
                      (0xe0000000 | (((unsigned long)dest) & 0x03ffffe0));

    for(int y = 0; y < h / 16; y++) {
        for(int x = 0; x < w / 2; x += 8) {
            block8x8_sq_copy((uint32 *)(u + x), dst, stride_uv_4);
            block8x8_sq_copy((uint32 *)(v + x), dst, stride_uv_4);
            block8x8_sq_copy ((uint32 *)(y + x * 2), dst, stride_y_4);
            block8x8_sq_copy ((uint32 *)(y + x * 2 + 8), dst, stride_y_4);
            block8x8_sq_copy ((uint32 *)(y + x * 2 + w * 8), dst, stride_y_4);
            block8x8_sq_copy ((uint32 *)(y + x * 2 + 8 + w * 8), dst, stride_y_4);
        }
        y += w * 16;
        u += w * 4;
        v += w * 4;
    }
}

Сделал пересылку напрямую в YUV конвертер по SQ. В распоряжении был только lxdream и результата нет, но если ему верить в плане скорости - работает очень быстро. На железке проверить пока не могу. Вообще есть сомнения что таким методом вообще можно. Если есть интерес и возможность проверьте. Могу скомпилить реальный тест.
Насчет сброса кэша данных: Как-то странно он реализован в KOS. Затратная операция получается.
(Последний раз сообщение было отредактировано 02.10.2013 в 19:07, отредактировал пользователь uncle.)
02.10.2013 19:00
Вебсайт Найти все сообщения Цитировать это сообщение
Создать ответ 


Сообщения в этой теме
Ассемблер - zzPSIXzz - 16.01.2011, 20:19
RE: Ассемблер - sc_maxim - 16.01.2011, 23:43
RE: Ассемблер - Rio - 16.01.2011, 23:58
RE: Ассемблер - zzPSIXzz - 17.01.2011, 01:03
RE: Ассемблер - sc_maxim - 17.01.2011, 01:17
RE: Ассемблер - Rio - 17.01.2011, 01:33
RE: Ассемблер - zzPSIXzz - 17.01.2011, 02:53
RE: Ассемблер - sc_maxim - 17.01.2011, 03:05
RE: Ассемблер - Rio - 19.01.2011, 16:34
RE: Ассемблер - sc_maxim - 09.09.2013, 23:31
RE: Ассемблер - SWAT - 10.09.2013, 07:16
RE: Ассемблер - sc_maxim - 10.09.2013, 10:18
RE: Ассемблер - sc_maxim - 10.09.2013, 22:07
RE: Ассемблер - SWAT - 11.09.2013, 08:51
RE: Ассемблер - sc_maxim - 11.09.2013, 09:10
RE: Ассемблер - SWAT - 11.09.2013, 13:28
RE: Ассемблер - sc_maxim - 11.09.2013, 22:09
RE: Ассемблер - uncle - 19.09.2013, 17:34
RE: Ассемблер - SWAT - 19.09.2013, 20:46
RE: Ассемблер - uncle - 21.09.2013, 12:04
RE: Ассемблер - uncle - 21.09.2013, 14:10
RE: Ассемблер - SWAT - 23.09.2013, 15:24
RE: Ассемблер - uncle - 25.09.2013, 12:34
RE: Ассемблер - SWAT - 25.09.2013, 15:27
RE: Ассемблер - uncle - 25.09.2013, 15:35
RE: Ассемблер - SWAT - 26.09.2013, 08:18
RE: Ассемблер - uncle - 26.09.2013, 13:53
RE: Ассемблер - SWAT - 27.09.2013, 07:04
RE: Ассемблер - MetalliC - 27.09.2013, 14:11
RE: Ассемблер - uncle - 27.09.2013, 12:58
RE: Ассемблер - uncle - 27.09.2013, 15:30
RE: Ассемблер - MetalliC - 27.09.2013, 18:11
RE: Ассемблер - SWAT - 29.09.2013, 11:02
RE: Ассемблер - MetalliC - 29.09.2013, 14:25
RE: Ассемблер - SWAT - 29.09.2013, 19:27
RE: Ассемблер - uncle - 02.10.2013 19:00
RE: Ассемблер - SWAT - 03.10.2013, 13:28
RE: Ассемблер - uncle - 03.10.2013, 17:34
RE: Ассемблер - SWAT - 03.10.2013, 21:00
RE: Ассемблер - SWAT - 10.10.2013, 12:01

Переход:


Пользователи просматривают эту тему: 1 Гость(ей)