H/Wアクセラレータをするにあたって、処理はホスト側メモリをDMAで読み出し、演算して、DMAでホスト側メモリに戻す。
ここでH/WアクセラレータがDMAしやすいように、OpenCVのデータはCMA領域に置きたい。
そこで、イメージをAllocするときに、CMA領域を確保できるようにすれば良い。
ただ、CMA領域は限りがあるので制限がでてしまうが・・・
CMA領域に確保できない場合は、ソフト処理になるようにしておくのも念頭において置かなければいけない。
ここで手を入れるのはOpenCVのアロケーションの部分で以前検討したのでそのとおりでいいや。
http://www.sweetcafe.jp/?p=317
気をつけるのはCMA領域を確保できれば、ImageDataのポインタをCMA領域のポインタに置き換える。
この時、OpenCVライブラリ側で取得したCMA領域のポインタを覚えておく。
freeするときに、CMA領域のポインタであれば、CMA領域を開放する。
H/Wアクセラレータの対象関数はCMA領域であれば、H/Wアクセラレータを実行し、そうでないユーザーランドのポインタであればソフトウェア処理する。
あぁ、これでCMA領域が足りなくなっても、ソフトウェア処理で逃げれるように作れそうだな。
CMA領域の確保はドライバがするということで、OpenCV H/Wアクセラレータ用の専用ドライバを作成しよう。
ハードの回路作るのは簡単だが、こういうシステム周りの実装が面倒そうだなぁ。