sdm: pass buffer sync handle to resource extension
resource manager needs to use fence for hardware synchronization.
Pass the buffer sync handle to resource extension. Buffer sync
handle will be the host for different OS sync mechanism.
Change-Id: I80a08ea3e94af6609a6e635a6bd634886b2a07eb
diff --git a/sdm/include/core/buffer_sync_handler.h b/sdm/include/core/buffer_sync_handler.h
index 29a58a2..fe9a978 100644
--- a/sdm/include/core/buffer_sync_handler.h
+++ b/sdm/include/core/buffer_sync_handler.h
@@ -76,6 +76,27 @@
virtual DisplayError SyncMerge(int fd1, int fd2, int *merged_fd) = 0;
+ /*! @brief Method to close sync fd
+
+ @details This method closes a sync fd.
+
+ @param[in] fd
+
+ @return \link None \endlink
+ */
+
+ virtual void SyncClose(int fd) = 0;
+
+ /*! @brief Method to detect if sync fd is signaled
+
+ @details This method detects if sync fd is signaled
+
+ @param[in] fd
+
+ @return \link Tue if fd has been signaled \endlink
+ */
+ virtual bool IsSyncSignaled(int fd) = 0;
+
protected:
virtual ~BufferSyncHandler() { }
};
diff --git a/sdm/include/private/extension_interface.h b/sdm/include/private/extension_interface.h
index 8425db5..5a45e2d 100644
--- a/sdm/include/private/extension_interface.h
+++ b/sdm/include/private/extension_interface.h
@@ -61,7 +61,8 @@
virtual DisplayError DestroyStrategyExtn(StrategyInterface *interface) = 0;
virtual DisplayError CreateResourceExtn(const HWResourceInfo &hw_resource_info,
- ResourceInterface **interface) = 0;
+ ResourceInterface **interface,
+ BufferSyncHandler *buffer_sync_handler) = 0;
virtual DisplayError DestroyResourceExtn(ResourceInterface *interface) = 0;
virtual DisplayError CreateRotator(BufferAllocator *buffer_allocator,
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index fdfc582..40022e3 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -303,6 +303,9 @@
uint32_t count; // Total number of layers which need to be set on hardware.
+ bool need_sync_handle;
+ int sync_handle;
+
LayerRect left_partial_update;
// Left ROI.
@@ -310,7 +313,7 @@
// Right ROI.
- HWLayersInfo() : stack(NULL), count(0) { }
+ HWLayersInfo() : stack(NULL), count(0), need_sync_handle(false), sync_handle(-1) { }
};
struct HWLayers {
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index d20f0b6..bb60542 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -39,13 +39,14 @@
}
DisplayError CompManager::Init(const HWResourceInfo &hw_res_info,
- ExtensionInterface *extension_intf) {
+ ExtensionInterface *extension_intf,
+ BufferSyncHandler *buffer_sync_handler) {
SCOPE_LOCK(locker_);
DisplayError error = kErrorNone;
if (extension_intf) {
- error = extension_intf->CreateResourceExtn(hw_res_info, &resource_intf_);
+ error = extension_intf->CreateResourceExtn(hw_res_info, &resource_intf_, buffer_sync_handler);
} else {
resource_intf_ = &resource_default_;
error = resource_default_.Init(hw_res_info);
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 61e0581..502c08b 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -39,7 +39,8 @@
class CompManager : public DumpImpl {
public:
CompManager();
- DisplayError Init(const HWResourceInfo &hw_res_info_, ExtensionInterface *extension_intf);
+ DisplayError Init(const HWResourceInfo &hw_res_info_, ExtensionInterface *extension_intf,
+ BufferSyncHandler *buffer_sync_handler);
DisplayError Deinit();
DisplayError RegisterDisplay(DisplayType type, const HWDisplayAttributes &attributes,
const HWPanelInfo &hw_panel_info, Handle *res_mgr_hnd);
diff --git a/sdm/libs/core/core_impl.cpp b/sdm/libs/core/core_impl.cpp
index 7d5e7b3..65abbe2 100644
--- a/sdm/libs/core/core_impl.cpp
+++ b/sdm/libs/core/core_impl.cpp
@@ -90,7 +90,7 @@
goto CleanupOnError;
}
- error = comp_mgr_.Init(*hw_resource_, extension_intf_);
+ error = comp_mgr_.Init(*hw_resource_, extension_intf_, buffer_sync_handler_);
if (error != kErrorNone) {
goto CleanupOnError;
}
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 9b6f19e..0535a44 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -419,6 +419,11 @@
input_buffer->release_fence_fd = dup(mdp_commit.release_fence);
}
+
+ if (hw_layer_info.need_sync_handle) {
+ hw_layer_info.sync_handle = dup(mdp_commit.release_fence);
+ }
+
DLOGI_IF(kTagDriverConfig, "*************************** %s Commit Input ************************",
device_name_);
DLOGI_IF(kTagDriverConfig, "retire_fence_fd %d", stack->retire_fence_fd);
diff --git a/sdm/libs/hwc/hwc_buffer_sync_handler.cpp b/sdm/libs/hwc/hwc_buffer_sync_handler.cpp
index 9bc4ec9..949745e 100644
--- a/sdm/libs/hwc/hwc_buffer_sync_handler.cpp
+++ b/sdm/libs/hwc/hwc_buffer_sync_handler.cpp
@@ -67,5 +67,17 @@
return error;
}
+void HWCBufferSyncHandler::SyncClose(int fd) {
+ close(fd);
+}
+
+bool HWCBufferSyncHandler::IsSyncSignaled(int fd) {
+ if (sync_wait(fd, 0) < 0) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
} // namespace sdm
diff --git a/sdm/libs/hwc/hwc_buffer_sync_handler.h b/sdm/libs/hwc/hwc_buffer_sync_handler.h
index da94650..c5f2370 100644
--- a/sdm/libs/hwc/hwc_buffer_sync_handler.h
+++ b/sdm/libs/hwc/hwc_buffer_sync_handler.h
@@ -44,6 +44,8 @@
virtual DisplayError SyncWait(int fd);
virtual DisplayError SyncMerge(int fd1, int fd2, int *merged_fd);
+ virtual void SyncClose(int fd);
+ virtual bool IsSyncSignaled(int fd);
};
} // namespace sdm