bufferhubd: Add DetachedBufferChannel
1/ Introduces four new BufferHub RPC operations.
2/ Implements the ProducerBufferDetach with test case.
3/ Also fixes a bug that Hangup signal wasn't propogated to the client
when bufferhubd closes a producer channel.
Bug: 38137191
Bug: 70046255
Bug: 70912269
Test: buffer_hub-test
Change-Id: Ia2ba0e95abd3c1b960670c505c6fdb9c9de3a6dd
diff --git a/services/vr/bufferhubd/buffer_hub.cpp b/services/vr/bufferhubd/buffer_hub.cpp
index 1eb4ef9..e4e19c7 100644
--- a/services/vr/bufferhubd/buffer_hub.cpp
+++ b/services/vr/bufferhubd/buffer_hub.cpp
@@ -100,6 +100,41 @@
stream << std::setw(8) << info.index;
stream << std::endl;
}
+
+ if (channel->channel_type() == BufferHubChannel::kDetachedBufferType) {
+ BufferHubChannel::BufferInfo info = channel->GetBufferInfo();
+
+ stream << std::right;
+ stream << std::setw(6) << info.id;
+ stream << " ";
+ stream << std::setw(9) << "N/A";
+ stream << " ";
+ if (info.format == HAL_PIXEL_FORMAT_BLOB) {
+ std::string size = std::to_string(info.width) + " B";
+ stream << std::setw(14) << size;
+ } else {
+ std::string dimensions = std::to_string(info.width) + "x" +
+ std::to_string(info.height) + "x" +
+ std::to_string(info.layer_count);
+ stream << std::setw(14) << dimensions;
+ }
+ stream << " ";
+ stream << std::setw(6) << info.format;
+ stream << " ";
+ stream << "0x" << std::hex << std::setfill('0');
+ stream << std::setw(8) << info.usage;
+ stream << std::dec << std::setfill(' ');
+ stream << " ";
+ stream << std::setw(9) << "N/A";
+ stream << " ";
+ stream << std::hex << std::setfill(' ');
+ stream << std::setw(18) << "Detached";
+ stream << " ";
+ stream << std::setw(18) << "N/A";
+ stream << " ";
+ stream << std::setw(10) << "N/A";
+ stream << std::endl;
+ }
}
stream << std::endl;
@@ -215,6 +250,15 @@
*this, &BufferHubService::OnCreateProducerQueue, message);
return {};
+ case BufferHubRPC::ProducerBufferDetach::Opcode:
+ // In addition to the message handler in the ProducerChannel's
+ // HandleMessage method, we also need to invalid the producer channel (and
+ // all associated consumer channels). Note that this has to be done after
+ // HandleMessage returns to make sure the IPC request has went back to the
+ // client first.
+ SetChannel(channel->channel_id(), nullptr);
+ return {};
+
default:
return DefaultHandleMessage(message);
}