Tensor: Cpu -> Ahwb storage transfer
PiperOrigin-RevId: 494033280
This commit is contained in:
parent
05535db5f7
commit
bea0caae65
|
@ -361,7 +361,7 @@ void Tensor::AllocateOpenGlBuffer() const {
|
||||||
LOG_IF(FATAL, !gl_context_) << "GlContext is not bound to the thread.";
|
LOG_IF(FATAL, !gl_context_) << "GlContext is not bound to the thread.";
|
||||||
glGenBuffers(1, &opengl_buffer_);
|
glGenBuffers(1, &opengl_buffer_);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, opengl_buffer_);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, opengl_buffer_);
|
||||||
if (!AllocateAhwbMapToSsbo()) {
|
if (!use_ahwb_ || !AllocateAhwbMapToSsbo()) {
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, bytes(), NULL, GL_STREAM_COPY);
|
glBufferData(GL_SHADER_STORAGE_BUFFER, bytes(), NULL, GL_STREAM_COPY);
|
||||||
}
|
}
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
@ -610,7 +610,7 @@ Tensor::CpuWriteView Tensor::GetCpuWriteView() const {
|
||||||
void Tensor::AllocateCpuBuffer() const {
|
void Tensor::AllocateCpuBuffer() const {
|
||||||
if (!cpu_buffer_) {
|
if (!cpu_buffer_) {
|
||||||
#ifdef MEDIAPIPE_TENSOR_USE_AHWB
|
#ifdef MEDIAPIPE_TENSOR_USE_AHWB
|
||||||
if (AllocateAHardwareBuffer()) return;
|
if (use_ahwb_ && AllocateAHardwareBuffer()) return;
|
||||||
#endif // MEDIAPIPE_TENSOR_USE_AHWB
|
#endif // MEDIAPIPE_TENSOR_USE_AHWB
|
||||||
#if MEDIAPIPE_METAL_ENABLED
|
#if MEDIAPIPE_METAL_ENABLED
|
||||||
cpu_buffer_ = AllocateVirtualMemory(bytes());
|
cpu_buffer_ = AllocateVirtualMemory(bytes());
|
||||||
|
|
|
@ -409,8 +409,8 @@ class Tensor {
|
||||||
bool AllocateAHardwareBuffer(int size_alignment = 0) const;
|
bool AllocateAHardwareBuffer(int size_alignment = 0) const;
|
||||||
void CreateEglSyncAndFd() const;
|
void CreateEglSyncAndFd() const;
|
||||||
// Use Ahwb for other views: OpenGL / CPU buffer.
|
// Use Ahwb for other views: OpenGL / CPU buffer.
|
||||||
static inline bool use_ahwb_ = false;
|
|
||||||
#endif // MEDIAPIPE_TENSOR_USE_AHWB
|
#endif // MEDIAPIPE_TENSOR_USE_AHWB
|
||||||
|
static inline bool use_ahwb_ = false;
|
||||||
// Expects the target SSBO to be already bound.
|
// Expects the target SSBO to be already bound.
|
||||||
bool AllocateAhwbMapToSsbo() const;
|
bool AllocateAhwbMapToSsbo() const;
|
||||||
bool InsertAhwbToSsboFence() const;
|
bool InsertAhwbToSsboFence() const;
|
||||||
|
|
|
@ -214,7 +214,7 @@ Tensor::AHardwareBufferView Tensor::GetAHardwareBufferReadView() const {
|
||||||
"supported.";
|
"supported.";
|
||||||
CHECK(ahwb_ || !(valid_ & kValidOpenGlBuffer))
|
CHECK(ahwb_ || !(valid_ & kValidOpenGlBuffer))
|
||||||
<< "Interoperability bettween OpenGL buffer and AHardwareBuffer is not "
|
<< "Interoperability bettween OpenGL buffer and AHardwareBuffer is not "
|
||||||
"supported on targe system.";
|
"supported on target system.";
|
||||||
bool transfer = !ahwb_;
|
bool transfer = !ahwb_;
|
||||||
CHECK(AllocateAHardwareBuffer())
|
CHECK(AllocateAHardwareBuffer())
|
||||||
<< "AHardwareBuffer is not supported on the target system.";
|
<< "AHardwareBuffer is not supported on the target system.";
|
||||||
|
@ -268,7 +268,6 @@ Tensor::AHardwareBufferView Tensor::GetAHardwareBufferWriteView(
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tensor::AllocateAHardwareBuffer(int size_alignment) const {
|
bool Tensor::AllocateAHardwareBuffer(int size_alignment) const {
|
||||||
if (!use_ahwb_) return false;
|
|
||||||
if (__builtin_available(android 26, *)) {
|
if (__builtin_available(android 26, *)) {
|
||||||
if (ahwb_ == nullptr) {
|
if (ahwb_ == nullptr) {
|
||||||
AHardwareBuffer_Desc desc = {};
|
AHardwareBuffer_Desc desc = {};
|
||||||
|
|
|
@ -136,6 +136,34 @@ TEST_F(TensorAhwbGpuTest, TestGpuToCpuFloat16) {
|
||||||
testing::Pointwise(NearWithPrecision(0.001), reference));
|
testing::Pointwise(NearWithPrecision(0.001), reference));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TensorAhwbGpuTest, TestReplacingCpuByAhwb) {
|
||||||
|
// Request the CPU view to get the memory to be allocated.
|
||||||
|
// Request Ahwb view then to transform the storage into Ahwb.
|
||||||
|
Tensor::SetPreferredStorageType(Tensor::StorageType::kDefault);
|
||||||
|
constexpr size_t num_elements = 20;
|
||||||
|
Tensor tensor{Tensor::ElementType::kFloat32, Tensor::Shape({num_elements})};
|
||||||
|
{
|
||||||
|
auto ptr = tensor.GetCpuWriteView().buffer<float>();
|
||||||
|
EXPECT_NE(ptr, nullptr);
|
||||||
|
for (int i = 0; i < num_elements; i++) {
|
||||||
|
ptr[i] = static_cast<float>(i) / 10.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto view = tensor.GetAHardwareBufferReadView();
|
||||||
|
EXPECT_NE(view.handle(), nullptr);
|
||||||
|
}
|
||||||
|
auto ptr = tensor.GetCpuReadView().buffer<float>();
|
||||||
|
EXPECT_NE(ptr, nullptr);
|
||||||
|
std::vector<float> reference;
|
||||||
|
reference.resize(num_elements);
|
||||||
|
for (int i = 0; i < num_elements; i++) {
|
||||||
|
reference[i] = static_cast<float>(i) / 10.0f;
|
||||||
|
}
|
||||||
|
EXPECT_THAT(absl::Span<const float>(ptr, num_elements),
|
||||||
|
testing::Pointwise(testing::FloatEq(), reference));
|
||||||
|
}
|
||||||
|
|
||||||
#endif // MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_31
|
#endif // MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_31
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user