Replace kProducerStateBit with kFirstClientBitMask.
kProducerStateBit covers the MSB of the buffer/fence state.
kFirstClientBitMask covers the LSB of the buffer/fence state.
This change replaces the kProducerStateBit with kFirstClientBitMask, and
update the kConsumerStateBit to be the inverse of kFirstClientBitMask.
Test: AHardwareBufferTest BufferHubBuffer_test BufferHubMetadata_test
buffer_hub-test buffer_hub_binder_service-test buffer_hub_queue-test
buffer_hub_queue_producer-test buffer_node-test dvr_api-test
dvr_buffer_queue-test dvr_display-test libgui_test libdvrcommon_test
pdx_tests GraphicBuffer_test
Bug: 118718713
Change-Id: I647f36ee3fb2eb5dc996b781ed0ff71f7f72c112
diff --git a/services/vr/bufferhubd/producer_channel.cpp b/services/vr/bufferhubd/producer_channel.cpp
index 162065b..4e89730 100644
--- a/services/vr/bufferhubd/producer_channel.cpp
+++ b/services/vr/bufferhubd/producer_channel.cpp
@@ -100,6 +100,12 @@
active_clients_bit_mask_ =
new (&metadata_header_->active_clients_bit_mask) std::atomic<uint64_t>(0);
+ // Producer channel is never created after consumer channel, and one buffer
+ // only have one fixed producer for now. Thus, it is correct to assume
+ // producer state bit is kFirstClientBitMask for now.
+ active_clients_bit_mask_->store(BufferHubDefs::kFirstClientBitMask,
+ std::memory_order_release);
+
acquire_fence_fd_.Reset(epoll_create1(EPOLL_CLOEXEC));
release_fence_fd_.Reset(epoll_create1(EPOLL_CLOEXEC));
if (!acquire_fence_fd_ || !release_fence_fd_) {
@@ -171,7 +177,7 @@
BufferHubChannel::BufferInfo ProducerChannel::GetBufferInfo() const {
// Derive the mask of signaled buffers in this producer / consumer set.
- uint64_t signaled_mask = signaled() ? BufferHubDefs::kProducerStateBit : 0;
+ uint64_t signaled_mask = signaled() ? BufferHubDefs::kFirstClientBitMask : 0;
for (const ConsumerChannel* consumer : consumer_channels_) {
signaled_mask |= consumer->signaled() ? consumer->client_state_mask() : 0;
}
@@ -239,7 +245,7 @@
ATRACE_NAME("ProducerChannel::OnGetBuffer");
ALOGD_IF(TRACE, "ProducerChannel::OnGetBuffer: buffer=%d, state=%" PRIx64 ".",
buffer_id(), buffer_state_->load(std::memory_order_acquire));
- return {GetBuffer(BufferHubDefs::kProducerStateBit)};
+ return {GetBuffer(BufferHubDefs::kFirstClientBitMask)};
}
Status<RemoteChannelHandle> ProducerChannel::CreateConsumer(Message& message) {
@@ -264,8 +270,7 @@
uint64_t current_active_clients_bit_mask =
active_clients_bit_mask_->load(std::memory_order_acquire);
uint64_t client_state_mask = BufferHubDefs::FindNextAvailableClientStateMask(
- current_active_clients_bit_mask | orphaned_consumer_bit_mask_ |
- BufferHubDefs::kProducerStateBit);
+ current_active_clients_bit_mask | orphaned_consumer_bit_mask_);
if (client_state_mask == 0ULL) {
ALOGE(
"ProducerChannel::CreateConsumer: reached the maximum mumber of "
@@ -504,7 +509,7 @@
// has to done by BufferHub as it requries synchronization among all
// consumers.
BufferHubDefs::ModifyBufferState(buffer_state_,
- BufferHubDefs::kProducerStateBit, 0ULL);
+ BufferHubDefs::kFirstClientBitMask, 0ULL);
ALOGD_IF(TRACE,
"ProducerChannel::OnConsumerRelease: releasing last consumer: "
"buffer_id=%d state=%" PRIx64 ".",