Loading headers/media_plugin/media/openmax/OMX_AsString.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -189,6 +189,7 @@ inline static const char *asString(OMX_AUDIO_CODINGEXTTYPE i, const char *def = switch (i) { switch (i) { case OMX_AUDIO_CodingAndroidAC3: return "AndroidAC3"; case OMX_AUDIO_CodingAndroidAC3: return "AndroidAC3"; case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS"; case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS"; case OMX_AUDIO_CodingAndroidAC4: return "AndroidAC4"; default: return asString((OMX_AUDIO_CODINGTYPE)i, def); default: return asString((OMX_AUDIO_CODINGTYPE)i, def); } } } } Loading Loading @@ -536,6 +537,7 @@ inline static const char *asString(OMX_INDEXEXTTYPE i, const char *def = "??") { case OMX_IndexParamAudioAndroidOpus: return "ParamAudioAndroidOpus"; case OMX_IndexParamAudioAndroidOpus: return "ParamAudioAndroidOpus"; case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation"; case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation"; case OMX_IndexParamAudioAndroidEac3: return "ParamAudioAndroidEac3"; case OMX_IndexParamAudioAndroidEac3: return "ParamAudioAndroidEac3"; case OMX_IndexParamAudioAndroidAc4: return "ParamAudioAndroidAc4"; case OMX_IndexParamAudioProfileQuerySupported: return "ParamAudioProfileQuerySupported"; case OMX_IndexParamAudioProfileQuerySupported: return "ParamAudioProfileQuerySupported"; // case OMX_IndexParamNalStreamFormatSupported: return "ParamNalStreamFormatSupported"; // case OMX_IndexParamNalStreamFormatSupported: return "ParamNalStreamFormatSupported"; // case OMX_IndexParamNalStreamFormat: return "ParamNalStreamFormat"; // case OMX_IndexParamNalStreamFormat: return "ParamNalStreamFormat"; Loading headers/media_plugin/media/openmax/OMX_AudioExt.h +10 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ typedef enum OMX_AUDIO_CODINGEXTTYPE { OMX_AUDIO_CodingAndroidAC3, /**< AC3 encoded data */ OMX_AUDIO_CodingAndroidAC3, /**< AC3 encoded data */ OMX_AUDIO_CodingAndroidOPUS, /**< OPUS encoded data */ OMX_AUDIO_CodingAndroidOPUS, /**< OPUS encoded data */ OMX_AUDIO_CodingAndroidEAC3, /**< EAC3 encoded data */ OMX_AUDIO_CodingAndroidEAC3, /**< EAC3 encoded data */ OMX_AUDIO_CodingAndroidAC4, /**< AC4 encoded data */ } OMX_AUDIO_CODINGEXTTYPE; } OMX_AUDIO_CODINGEXTTYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE { typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE { Loading @@ -68,6 +69,15 @@ typedef struct OMX_AUDIO_PARAM_ANDROID_EAC3TYPE { variable or unknown sampling rate. */ variable or unknown sampling rate. */ } OMX_AUDIO_PARAM_ANDROID_EAC3TYPE; } OMX_AUDIO_PARAM_ANDROID_EAC3TYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_AC4TYPE { OMX_U32 nSize; /**< size of the structure in bytes */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ OMX_U32 nPortIndex; /**< port that this structure applies to */ OMX_U32 nChannels; /**< Number of channels */ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for variable or unknown sampling rate. */ } OMX_AUDIO_PARAM_ANDROID_AC4TYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE { typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE { OMX_U32 nSize; /**< size of the structure in bytes */ OMX_U32 nSize; /**< size of the structure in bytes */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ Loading headers/media_plugin/media/openmax/OMX_IndexExt.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ typedef enum OMX_INDEXEXTTYPE { OMX_IndexParamAudioAndroidEac3, /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */ OMX_IndexParamAudioAndroidEac3, /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */ OMX_IndexParamAudioProfileQuerySupported, /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */ OMX_IndexParamAudioProfileQuerySupported, /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */ OMX_IndexParamAudioAndroidAacDrcPresentation, /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */ OMX_IndexParamAudioAndroidAacDrcPresentation, /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */ OMX_IndexParamAudioAndroidAc4, /**< reference: OMX_AUDIO_PARAM_ANDROID_AC4TYPE */ OMX_IndexExtAudioEndUnused, OMX_IndexExtAudioEndUnused, /* Image parameters and configurations */ /* Image parameters and configurations */ Loading libs/gui/tests/Surface_test.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -207,7 +207,7 @@ TEST_F(SurfaceTest, QueryConsumerUsage) { } } TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) { TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) { const android_dataspace TEST_DATASPACE = HAL_DATASPACE_SRGB; const android_dataspace TEST_DATASPACE = HAL_DATASPACE_V0_SRGB; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&producer, &consumer); BufferQueue::createBufferQueue(&producer, &consumer); Loading libs/ui/BufferHubBuffer.cpp +105 −3 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,16 @@ namespace { // to use Binder. // to use Binder. static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client"; static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client"; using dvr::BufferHubDefs::AnyClientAcquired; using dvr::BufferHubDefs::AnyClientGained; using dvr::BufferHubDefs::AnyClientPosted; using dvr::BufferHubDefs::IsClientAcquired; using dvr::BufferHubDefs::IsClientGained; using dvr::BufferHubDefs::IsClientPosted; using dvr::BufferHubDefs::IsClientReleased; using dvr::BufferHubDefs::kHighBitsMask; using dvr::BufferHubDefs::kMetadataHeaderSize; } // namespace } // namespace BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {} BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {} Loading Loading @@ -151,11 +161,17 @@ int BufferHubBuffer::ImportGraphicBuffer() { } } size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size()); size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size()); if (metadataSize < dvr::BufferHubDefs::kMetadataHeaderSize) { if (metadataSize < kMetadataHeaderSize) { ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize); ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize); return -EINVAL; return -EINVAL; } } // Populate shortcuts to the atomics in metadata. auto metadata_header = mMetadata.metadata_header(); buffer_state_ = &metadata_header->buffer_state; fence_state_ = &metadata_header->fence_state; active_clients_bit_mask_ = &metadata_header->active_clients_bit_mask; // Import the buffer: We only need to hold on the native_handle_t here so that // Import the buffer: We only need to hold on the native_handle_t here so that // GraphicBuffer instance can be created in future. // GraphicBuffer instance can be created in future. mBufferHandle = bufferTraits.take_buffer_handle(); mBufferHandle = bufferTraits.take_buffer_handle(); Loading @@ -176,7 +192,93 @@ int BufferHubBuffer::ImportGraphicBuffer() { // TODO(b/112012161) Set up shared fences. // TODO(b/112012161) Set up shared fences. ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(), ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(), mMetadata.metadata_header()->buffer_state.load(std::memory_order_acquire)); buffer_state_->load(std::memory_order_acquire)); return 0; } int BufferHubBuffer::Gain() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientGained(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already gained by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } do { if (AnyClientGained(current_buffer_state & (~mClientStateMask)) || AnyClientAcquired(current_buffer_state)) { ALOGE("%s: Buffer is in use, id=%d mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Change the buffer state to gained state, whose value happens to be the same as // mClientStateMask. } while (!buffer_state_->compare_exchange_weak(current_buffer_state, mClientStateMask, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence. return 0; } int BufferHubBuffer::Post() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); uint64_t current_active_clients_bit_mask = 0ULL; uint64_t updated_buffer_state = 0ULL; do { if (!IsClientGained(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot post a buffer that is not gained by this client. buffer_id=%d " "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Set the producer client buffer state to released, other clients' buffer state to posted. current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); updated_buffer_state = current_active_clients_bit_mask & (~mClientStateMask) & kHighBitsMask; } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence if needed. return 0; } int BufferHubBuffer::Acquire() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientAcquired(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already acquired by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } uint64_t updated_buffer_state = 0ULL; do { if (!IsClientPosted(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot acquire a buffer that is not in posted state. buffer_id=%d " "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Change the buffer state for this consumer from posted to acquired. updated_buffer_state = current_buffer_state ^ mClientStateMask; } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence. return 0; } int BufferHubBuffer::Release() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientReleased(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already released by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } uint64_t updated_buffer_state = 0ULL; do { updated_buffer_state = current_buffer_state & (~mClientStateMask); } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence if needed. return 0; return 0; } } Loading Loading
headers/media_plugin/media/openmax/OMX_AsString.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -189,6 +189,7 @@ inline static const char *asString(OMX_AUDIO_CODINGEXTTYPE i, const char *def = switch (i) { switch (i) { case OMX_AUDIO_CodingAndroidAC3: return "AndroidAC3"; case OMX_AUDIO_CodingAndroidAC3: return "AndroidAC3"; case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS"; case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS"; case OMX_AUDIO_CodingAndroidAC4: return "AndroidAC4"; default: return asString((OMX_AUDIO_CODINGTYPE)i, def); default: return asString((OMX_AUDIO_CODINGTYPE)i, def); } } } } Loading Loading @@ -536,6 +537,7 @@ inline static const char *asString(OMX_INDEXEXTTYPE i, const char *def = "??") { case OMX_IndexParamAudioAndroidOpus: return "ParamAudioAndroidOpus"; case OMX_IndexParamAudioAndroidOpus: return "ParamAudioAndroidOpus"; case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation"; case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation"; case OMX_IndexParamAudioAndroidEac3: return "ParamAudioAndroidEac3"; case OMX_IndexParamAudioAndroidEac3: return "ParamAudioAndroidEac3"; case OMX_IndexParamAudioAndroidAc4: return "ParamAudioAndroidAc4"; case OMX_IndexParamAudioProfileQuerySupported: return "ParamAudioProfileQuerySupported"; case OMX_IndexParamAudioProfileQuerySupported: return "ParamAudioProfileQuerySupported"; // case OMX_IndexParamNalStreamFormatSupported: return "ParamNalStreamFormatSupported"; // case OMX_IndexParamNalStreamFormatSupported: return "ParamNalStreamFormatSupported"; // case OMX_IndexParamNalStreamFormat: return "ParamNalStreamFormat"; // case OMX_IndexParamNalStreamFormat: return "ParamNalStreamFormat"; Loading
headers/media_plugin/media/openmax/OMX_AudioExt.h +10 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ typedef enum OMX_AUDIO_CODINGEXTTYPE { OMX_AUDIO_CodingAndroidAC3, /**< AC3 encoded data */ OMX_AUDIO_CodingAndroidAC3, /**< AC3 encoded data */ OMX_AUDIO_CodingAndroidOPUS, /**< OPUS encoded data */ OMX_AUDIO_CodingAndroidOPUS, /**< OPUS encoded data */ OMX_AUDIO_CodingAndroidEAC3, /**< EAC3 encoded data */ OMX_AUDIO_CodingAndroidEAC3, /**< EAC3 encoded data */ OMX_AUDIO_CodingAndroidAC4, /**< AC4 encoded data */ } OMX_AUDIO_CODINGEXTTYPE; } OMX_AUDIO_CODINGEXTTYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE { typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE { Loading @@ -68,6 +69,15 @@ typedef struct OMX_AUDIO_PARAM_ANDROID_EAC3TYPE { variable or unknown sampling rate. */ variable or unknown sampling rate. */ } OMX_AUDIO_PARAM_ANDROID_EAC3TYPE; } OMX_AUDIO_PARAM_ANDROID_EAC3TYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_AC4TYPE { OMX_U32 nSize; /**< size of the structure in bytes */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ OMX_U32 nPortIndex; /**< port that this structure applies to */ OMX_U32 nChannels; /**< Number of channels */ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for variable or unknown sampling rate. */ } OMX_AUDIO_PARAM_ANDROID_AC4TYPE; typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE { typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE { OMX_U32 nSize; /**< size of the structure in bytes */ OMX_U32 nSize; /**< size of the structure in bytes */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ Loading
headers/media_plugin/media/openmax/OMX_IndexExt.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ typedef enum OMX_INDEXEXTTYPE { OMX_IndexParamAudioAndroidEac3, /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */ OMX_IndexParamAudioAndroidEac3, /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */ OMX_IndexParamAudioProfileQuerySupported, /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */ OMX_IndexParamAudioProfileQuerySupported, /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */ OMX_IndexParamAudioAndroidAacDrcPresentation, /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */ OMX_IndexParamAudioAndroidAacDrcPresentation, /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */ OMX_IndexParamAudioAndroidAc4, /**< reference: OMX_AUDIO_PARAM_ANDROID_AC4TYPE */ OMX_IndexExtAudioEndUnused, OMX_IndexExtAudioEndUnused, /* Image parameters and configurations */ /* Image parameters and configurations */ Loading
libs/gui/tests/Surface_test.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -207,7 +207,7 @@ TEST_F(SurfaceTest, QueryConsumerUsage) { } } TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) { TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) { const android_dataspace TEST_DATASPACE = HAL_DATASPACE_SRGB; const android_dataspace TEST_DATASPACE = HAL_DATASPACE_V0_SRGB; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&producer, &consumer); BufferQueue::createBufferQueue(&producer, &consumer); Loading
libs/ui/BufferHubBuffer.cpp +105 −3 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,16 @@ namespace { // to use Binder. // to use Binder. static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client"; static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client"; using dvr::BufferHubDefs::AnyClientAcquired; using dvr::BufferHubDefs::AnyClientGained; using dvr::BufferHubDefs::AnyClientPosted; using dvr::BufferHubDefs::IsClientAcquired; using dvr::BufferHubDefs::IsClientGained; using dvr::BufferHubDefs::IsClientPosted; using dvr::BufferHubDefs::IsClientReleased; using dvr::BufferHubDefs::kHighBitsMask; using dvr::BufferHubDefs::kMetadataHeaderSize; } // namespace } // namespace BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {} BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {} Loading Loading @@ -151,11 +161,17 @@ int BufferHubBuffer::ImportGraphicBuffer() { } } size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size()); size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size()); if (metadataSize < dvr::BufferHubDefs::kMetadataHeaderSize) { if (metadataSize < kMetadataHeaderSize) { ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize); ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize); return -EINVAL; return -EINVAL; } } // Populate shortcuts to the atomics in metadata. auto metadata_header = mMetadata.metadata_header(); buffer_state_ = &metadata_header->buffer_state; fence_state_ = &metadata_header->fence_state; active_clients_bit_mask_ = &metadata_header->active_clients_bit_mask; // Import the buffer: We only need to hold on the native_handle_t here so that // Import the buffer: We only need to hold on the native_handle_t here so that // GraphicBuffer instance can be created in future. // GraphicBuffer instance can be created in future. mBufferHandle = bufferTraits.take_buffer_handle(); mBufferHandle = bufferTraits.take_buffer_handle(); Loading @@ -176,7 +192,93 @@ int BufferHubBuffer::ImportGraphicBuffer() { // TODO(b/112012161) Set up shared fences. // TODO(b/112012161) Set up shared fences. ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(), ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(), mMetadata.metadata_header()->buffer_state.load(std::memory_order_acquire)); buffer_state_->load(std::memory_order_acquire)); return 0; } int BufferHubBuffer::Gain() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientGained(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already gained by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } do { if (AnyClientGained(current_buffer_state & (~mClientStateMask)) || AnyClientAcquired(current_buffer_state)) { ALOGE("%s: Buffer is in use, id=%d mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Change the buffer state to gained state, whose value happens to be the same as // mClientStateMask. } while (!buffer_state_->compare_exchange_weak(current_buffer_state, mClientStateMask, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence. return 0; } int BufferHubBuffer::Post() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); uint64_t current_active_clients_bit_mask = 0ULL; uint64_t updated_buffer_state = 0ULL; do { if (!IsClientGained(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot post a buffer that is not gained by this client. buffer_id=%d " "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Set the producer client buffer state to released, other clients' buffer state to posted. current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); updated_buffer_state = current_active_clients_bit_mask & (~mClientStateMask) & kHighBitsMask; } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence if needed. return 0; } int BufferHubBuffer::Acquire() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientAcquired(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already acquired by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } uint64_t updated_buffer_state = 0ULL; do { if (!IsClientPosted(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot acquire a buffer that is not in posted state. buffer_id=%d " "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } // Change the buffer state for this consumer from posted to acquired. updated_buffer_state = current_buffer_state ^ mClientStateMask; } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence. return 0; } int BufferHubBuffer::Release() { uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientReleased(current_buffer_state, mClientStateMask)) { ALOGV("%s: Buffer is already released by this client %" PRIx64 ".", __FUNCTION__, mClientStateMask); return 0; } uint64_t updated_buffer_state = 0ULL; do { updated_buffer_state = current_buffer_state & (~mClientStateMask); } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)); // TODO(b/119837586): Update fence state and return GPU fence if needed. return 0; return 0; } } Loading