AHardwareBuffer

AHardwareBuffer は、gralloc のバッファをラップする共有メモリの一種です。Android 10 では、ニューラル ネットワーク API(NNAPI)が AHardwareBuffer の使用をサポートし、データをコピーせずにドライバを実行できるため、アプリのパフォーマンスと消費電力が改善します。たとえば、カメラ HAL のスタックは、カメラ NDK の API とメディア NDK の API で生成された AHardwareBuffer ハンドルを使用して、AHardwareBuffer オブジェクトを機械学習ワークロードの NNAPI に渡すことができます。詳しくは ANeuralNetworksMemory_createFromAHardwareBuffer をご覧ください。

NNAPI で使用される AHardwareBuffer オブジェクトは、hardware_buffer または hardware_buffer_blob と名付けられた hidl_memory 構造体を介してドライバに渡されます。hidl_memory 構造体 hardware_buffer_blob は、AHARDWAREBUFFER_FORMAT_BLOB 形式の AHardwareBuffer オブジェクトのみを表します。

フレームワークで必要な情報は、hidl_memory 構造体の hidl_handle フィールドでエンコードされます。hidl_handle フィールドは native_handle をラップして、AHardwareBuffer または Gralloc バッファに関する必須のメタデータをすべてエンコードします。

ドライバは、提供された hidl_handle フィールドを適切にデコードして、 によって記述されたメモリにアクセスする必要があります。getSupportedOperations_1_2getSupportedOperations_1_1、または getSupportedOperations メソッドが呼び出されると、ドライバは、提供された hidl_handle をデコードして hidl_handle によって記述されたメモリにアクセスできるかどうかを検出します。定数オペランドに使用する hidl_handle フィールドがサポートされていない場合、モデルの準備は必ず失敗します。入力または出力オペランドに使用する hidl_handle フィールドがサポートされていない場合、その実行は必ず失敗します。モデルの準備や実行が失敗した場合、ドライバは GENERAL_FAILURE エラーコードを返すことが推奨されます。