[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -1,9 +1,10 @@
<services>
<service name="tar_git">
- <param name="url">https://github.com/mer-hybris/qt5-qpa-hwcomposer-plugin.git</param>
- <param name="branch">master</param>
- <param name="revision"/>
- <param name="token"/>
- <param name="debian">N</param>
- <param name="dumb">N</param>
-</service></services>
\ No newline at end of file
+ <param name="url">https://github.com/mer-hybris/qt5-qpa-hwcomposer-plugin.git</param>
+ <param name="branch">master</param>
+ <param name="revision">HEAD</param>
+ <param name="token"/>
+ <param name="debian">N</param>
+ <param name="dumb">N</param>
+ </service>
+</services>
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend.cpp
^
|
@@ -39,6 +39,8 @@
**
****************************************************************************/
+#include <dlfcn.h>
+
#include "hwcomposer_backend.h"
#ifdef HWC_DEVICE_API_VERSION_0_1
#include "hwcomposer_backend_v0.h"
@@ -47,13 +49,21 @@
#include "hwcomposer_backend_v11.h"
-HwComposerBackend::HwComposerBackend(hw_module_t *hwc_module)
- : hwc_module(hwc_module)
+extern "C" void *android_dlopen(const char *filename, int flags);
+extern "C" void *android_dlsym(void *handle, const char *symbol);
+extern "C" int android_dlclose(void *handle);
+
+HwComposerBackend::HwComposerBackend(hw_module_t *hwc_module, void *libmsf)
+ : hwc_module(hwc_module), libminisf(libmsf)
{
}
HwComposerBackend::~HwComposerBackend()
{
+ if (libminisf) {
+ android_dlclose(libminisf);
+ }
+
// XXX: Close/free hwc_module?
}
@@ -62,6 +72,8 @@
{
hw_module_t *hwc_module = NULL;
hw_device_t *hwc_device = NULL;
+ void *libminisf;
+ void (*startMiniSurfaceFlinger)(void) = NULL;
// Some implementations insist on having the framebuffer module opened before loading
// the hardware composer one. Therefor we rely on using the fbdev HYBRIS_EGLPLATFORM
@@ -70,6 +82,24 @@
eglGetDisplay(EGL_DEFAULT_DISPLAY);
}
+ // A reason for calling this method here is to initialize the binder
+ // thread pool such that services started from for example the
+ // hwcomposer plugin don't get stuck.
+ // Another is to have the SurfaceFlinger service in the same process
+ // as hwcomposer, on some devices this could improve performance.
+
+ libminisf = android_dlopen("libminisf.so", RTLD_LAZY);
+
+ if (libminisf) {
+ startMiniSurfaceFlinger = (void(*)(void))android_dlsym(libminisf, "startMiniSurfaceFlinger");
+ }
+
+ if (startMiniSurfaceFlinger) {
+ startMiniSurfaceFlinger();
+ } else {
+ fprintf(stderr, "libminisf is incompatible or missing. Can not possibly start the SurfaceFlinger service. If you're experiencing troubles with media try updating droidmedia (and/or this plugin).");
+ }
+
// Open hardware composer
HWC_PLUGIN_ASSERT_ZERO(hw_get_module(HWC_HARDWARE_MODULE_ID, (const hw_module_t **)(&hwc_module)));
@@ -99,7 +129,7 @@
if ((hwc_device->version == HWC_DEVICE_API_VERSION_0_1) ||
(hwc_device->version == HWC_DEVICE_API_VERSION_0_2) ||
(hwc_device->version == HWC_DEVICE_API_VERSION_0_3)) {
- return new HwComposerBackend_v0(hwc_module, hwc_device);
+ return new HwComposerBackend_v0(hwc_module, hwc_device, libminisf);
}
#endif
@@ -109,12 +139,12 @@
case HWC_DEVICE_API_VERSION_0_1:
case HWC_DEVICE_API_VERSION_0_2:
case HWC_DEVICE_API_VERSION_0_3:
- return new HwComposerBackend_v0(hwc_module, hwc_device);
+ return new HwComposerBackend_v0(hwc_module, hwc_device, libminisf);
break;
#endif
#ifdef HWC_DEVICE_API_VERSION_1_0
case HWC_DEVICE_API_VERSION_1_0:
- return new HwComposerBackend_v10(hwc_module, hwc_device);
+ return new HwComposerBackend_v10(hwc_module, hwc_device, libminisf);
break;
#endif /* HWC_DEVICE_API_VERSION_1_0 */
#ifdef HWC_PLUGIN_HAVE_HWCOMPOSER1_API
@@ -133,7 +163,7 @@
#endif
// HWC_NUM_DISPLAY_TYPES is the actual size of the array, otherwise
// underrun/overruns happen
- return new HwComposerBackend_v11(hwc_module, hwc_device, HWC_NUM_DISPLAY_TYPES);
+ return new HwComposerBackend_v11(hwc_module, hwc_device, libminisf, HWC_NUM_DISPLAY_TYPES);
break;
#endif /* HWC_PLUGIN_HAVE_HWCOMPOSER1_API */
default:
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend.h
^
|
@@ -112,10 +112,11 @@
virtual bool requestUpdate(QEglFSWindow *) { return false; }
protected:
- HwComposerBackend(hw_module_t *hwc_module);
+ HwComposerBackend(hw_module_t *hwc_module, void *libmsf);
virtual ~HwComposerBackend();
hw_module_t *hwc_module;
+ void *libminisf;
};
#endif /* HWCOMPOSER_BACKEND_H */
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v0.cpp
^
|
@@ -44,8 +44,8 @@
#ifdef HWC_DEVICE_API_VERSION_0_1
-HwComposerBackend_v0::HwComposerBackend_v0(hw_module_t *hwc_module, hw_device_t *hw_device)
- : HwComposerBackend(hwc_module)
+HwComposerBackend_v0::HwComposerBackend_v0(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf)
+ : HwComposerBackend(hwc_module, libminisf)
, hwc_device((hwc_composer_device_t *)hw_device)
, hwc_layer_list(NULL)
{
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v0.h
^
|
@@ -47,7 +47,7 @@
class HwComposerBackend_v0 : public HwComposerBackend {
public:
- HwComposerBackend_v0(hw_module_t *hwc_module, hw_device_t *hw_device);
+ HwComposerBackend_v0(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf);
virtual ~HwComposerBackend_v0();
virtual EGLNativeDisplayType display();
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v10.cpp
^
|
@@ -132,8 +132,8 @@
};
-HwComposerBackend_v10::HwComposerBackend_v10(hw_module_t *hwc_module, hw_device_t *hw_device)
- : HwComposerBackend(hwc_module)
+HwComposerBackend_v10::HwComposerBackend_v10(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf)
+ : HwComposerBackend(hwc_module, libminisf)
, hwc_device((hwc_composer_device_1_t *)hw_device)
, hwc_list(NULL)
, hwc_mList(NULL)
@@ -146,6 +146,8 @@
HwComposerBackend_v10::~HwComposerBackend_v10()
{
+ hwc_device->eventControl(hwc_device, 0, HWC_EVENT_VSYNC, 0);
+
// Close the hwcomposer handle
HWC_PLUGIN_EXPECT_ZERO(hwc_close_1(hwc_device));
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v10.h
^
|
@@ -51,7 +51,7 @@
class HwComposerBackend_v10 : public HwComposerBackend {
public:
- HwComposerBackend_v10(hw_module_t *hwc_module, hw_device_t *hw_device);
+ HwComposerBackend_v10(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf);
virtual ~HwComposerBackend_v10();
virtual EGLNativeDisplayType display();
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v11.cpp
^
|
@@ -48,10 +48,11 @@
#include <QtCore/QCoreApplication>
#include <private/qwindow_p.h>
+#include <private/qsystrace_p.h>
+
#ifdef HWC_PLUGIN_HAVE_HWCOMPOSER1_API
// #define QPA_HWC_TIMING
-// #define QPA_HWC_SYNC_BEFORE_SET
#ifdef QPA_HWC_TIMING
#define QPA_HWC_TIMING_SAMPLE(variable) variable = timer.nsecsElapsed()
@@ -71,6 +72,13 @@
static void hwc11_callback_vsync(const struct hwc_procs *procs, int, int64_t)
{
+ static int counter = 0;
+ ++counter;
+ if (counter % 2)
+ QSystrace::begin("graphics", "QPA::vsync", "");
+ else
+ QSystrace::end("graphics", "QPA::vsync", "");
+
QCoreApplication::postEvent(static_cast<const HwcProcs_v11 *>(procs)->backend, new QEvent(QEvent::User));
}
@@ -90,6 +98,7 @@
hwc_composer_device_1_t *hwcdevice;
hwc_display_contents_1_t **mlist;
int num_displays;
+ bool m_syncBeforeSet;
protected:
void present(HWComposerNativeWindowBuffer *buffer);
@@ -112,25 +121,28 @@
{
int bufferCount = qBound(2, qgetenv("QPA_HWC_BUFFER_COUNT").toInt(), 8);
setBufferCount(bufferCount);
+ m_syncBeforeSet = qEnvironmentVariableIsSet("QPA_HWC_SYNC_BEFORE_SET");
}
void HWComposer::present(HWComposerNativeWindowBuffer *buffer)
{
+ QSystraceEvent trace("graphics", "QPA::present");
+
QPA_HWC_TIMING_SAMPLE(presentTime);
fblayer->handle = buffer->handle;
fblayer->releaseFenceFd = -1;
-#ifdef QPA_HWC_SYNC_BEFORE_SET
- int acqFd = getFenceBufferFd(buffer);
- if (acqFd >= 0) {
- sync_wait(acqFd, -1);
- close(acqFd);
- fblayer->acquireFenceFd = -1;
+ if (m_syncBeforeSet) {
+ int acqFd = getFenceBufferFd(buffer);
+ if (acqFd >= 0) {
+ sync_wait(acqFd, -1);
+ close(acqFd);
+ fblayer->acquireFenceFd = -1;
+ }
+ } else {
+ fblayer->acquireFenceFd = getFenceBufferFd(buffer);
}
-#else
- fblayer->acquireFenceFd = getFenceBufferFd(buffer);
-#endif
QPA_HWC_TIMING_SAMPLE(syncTime);
@@ -139,8 +151,10 @@
QPA_HWC_TIMING_SAMPLE(prepareTime);
+ QSystrace::begin("graphics", "QPA::set", "");
err = hwcdevice->set(hwcdevice, num_displays, mlist);
HWC_PLUGIN_EXPECT_ZERO(err);
+ QSystrace::end("graphics", "QPA::set", "");
QPA_HWC_TIMING_SAMPLE(setTime);
@@ -152,8 +166,8 @@
}
}
-HwComposerBackend_v11::HwComposerBackend_v11(hw_module_t *hwc_module, hw_device_t *hw_device, int num_displays)
- : HwComposerBackend(hwc_module)
+HwComposerBackend_v11::HwComposerBackend_v11(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf, int num_displays)
+ : HwComposerBackend(hwc_module, libminisf)
, hwc_device((hwc_composer_device_1_t *)hw_device)
, hwc_list(NULL)
, hwc_mList(NULL)
@@ -174,6 +188,8 @@
HwComposerBackend_v11::~HwComposerBackend_v11()
{
+ hwc_device->eventControl(hwc_device, 0, HWC_EVENT_VSYNC, 0);
+
// Close the hwcomposer handle
if (!qgetenv("QPA_HWC_WORKAROUNDS").split(',').contains("no-close-hwc"))
HWC_PLUGIN_EXPECT_ZERO(hwc_close_1(hwc_device));
@@ -405,6 +421,7 @@
void HwComposerBackend_v11::handleVSyncEvent()
{
+ QSystraceEvent trace("graphics", "QPA::handleVsync");
QSet<QWindow *> pendingWindows = m_pendingUpdate;
m_pendingUpdate.clear();
foreach (QWindow *w, pendingWindows) {
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-qpa-hwcomposer-plugin-5.6.2.3.tar.bz2/hwcomposer/hwcomposer_backend_v11.h
^
|
@@ -56,7 +56,7 @@
class HwComposerBackend_v11 : public QObject, public HwComposerBackend {
public:
- HwComposerBackend_v11(hw_module_t *hwc_module, hw_device_t *hw_device, int num_displays);
+ HwComposerBackend_v11(hw_module_t *hwc_module, hw_device_t *hw_device, void *libminisf, int num_displays);
virtual ~HwComposerBackend_v11();
virtual EGLNativeDisplayType display();
|