Список переменных аргументов в Renderscript

Я портирую несколько больших видеокодеков на Renderscript. Мне только что удалось портировать libx264 и кодировать его в необработанный поток H.264. Я сделал это, объединив библиотеку с помощью CIL и сделав глобальные переменные статическими, а также перенеся собственную строку libc Android и некоторые функции stdio (слияние) и функцию распределения кучи, которая использует предварительно выделенный буфер.

Теперь я хочу портировать libvpx. Эта библиотека использует переменные аргументы для более центральных функций, чем libx264 (по сути, единственная часть, которую мне нужно было закомментировать в libx264, — это ведение журнала, остальное просто настроено правильно и несколько определений макросов для замены вещей).

Итак, мой вопрос: есть ли у кого-нибудь совет о том, как использовать списки переменных аргументов для статических функций в Renderscript? Google заявляет, что Renderscript совместим с C99, поэтому это должно быть каким-то образом возможно. Если у кого-то есть предложение по взлому для этого, дайте мне знать, если оно в настоящее время не поддерживается.

/Харальд


person Harald Gustafsson    schedule 24.04.2012    source источник


Ответы (1)


В вашем каталоге SDK вы можете обнаружить, что заголовок stdarg.h на самом деле включен в ./android-sdks/platform-tools/renderscript/clang-include/stdarg.h. Если вы добавите

#include "stdarg.h" 

с вашими обычными операторами include компилятор, похоже, понимает, о чем вы говорите. У меня нет практического способа проверить это, кроме компиляции.

[EDIT] Я только что получил сообщение «llvm-rs-cc.exe перестал работать» в Windows. Дамп стека из консоли говорит, что произошел сбой при синтаксическом анализе примера функции, которую я добавил, чтобы увидеть, будут ли компилироваться varargs. Вот дамп стека. Компилятор каждый раз вылетает. Я предполагаю, что это поддерживается в теории, но компилятор не обрабатывает его должным образом.

Stack dump:
0.  engine.rs:882:32: current parser token ';'
1.  engine.rs:876:1: parsing function body 'average'
2.  engine.rs:876:1: in compound statement ('{}')

После удаления функции, но без включения заголовка, в консоль попадает следующее (без сбоя):

C:\android-sdks\platform-tools\renderscript\clang-include\stdarg.h:30:9: error: unknown type name '__builtin_va_list'
C:\android-sdks\platform-tools\renderscript\clang-include\stdarg.h:48:9: error: unknown type name '__builtin_va_list'
person Jared    schedule 24.04.2012
comment
Спасибо, это примерно то, что я понимаю. Похоже, они забыли обработать функции _builtin_va* и ввести *={start, end, arg, list}. Я знаю, что это нелегко сделать, так как это очень зависит от цели. Например, __builtin_va_start принимает переменную непосредственно перед ... в качестве входных данных. Если это находится в стеке, и мы знаем, в каком направлении растет стек, это можно использовать для получения указателя на первый аргумент, но это очень зависит от цели и компилятора. Обычно некоторые аргументы передаются в регистрах. Но я предполагаю, что в LLVM IR/bitcode есть некоторая информация об этом. - person Harald Gustafsson; 24.04.2012
comment
Да. RenderScript все еще находится в зачаточном состоянии. Как указано в документации, предполагаемая цель состоит в том, чтобы запустить его на многих различных типах процессоров, что с чем-то настолько зависимым от цели может быть очень трудным делом. Google указывает, что некоторые функции еще не были включены, поскольку это не позволяет им гарантировать, что код будет работать на всех целях. Возможно, по мере роста среды они добавят эту функцию, но кажется, что, по крайней мере, сейчас, это невозможно. - person Jared; 24.04.2012