From 427ce1ad75048c4a3cdbaa67fa9625ecef4d1f6b Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Wed, 1 Jul 2020 16:59:07 +0900 Subject: [PATCH 01/16] DSObject: add test cases (DSObjectTest.*) Change-Id: I7a273543675a598bef4ad08927d56b0f78300a2e Signed-off-by: Sung-Jin Park --- tests/DSObject-test.cpp | 189 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/meson.build | 1 + 2 files changed, 190 insertions(+) create mode 100644 tests/DSObject-test.cpp diff --git a/tests/DSObject-test.cpp b/tests/DSObject-test.cpp new file mode 100644 index 0000000..eb500da --- /dev/null +++ b/tests/DSObject-test.cpp @@ -0,0 +1,189 @@ +#include "libds-tests.h" +#include "DSCore.h" +#include "DSObject.h" + +using namespace display_server; + +class DSObjectTest : public ::testing::Test +{ +public: + void SetUp(void) override + {} + void TearDown(void) override + {} +}; + +/* Temporary classes for implemting PImpl Idiom based on DSObject/DSObjectPrivate classes */ +class TempObject; +class TempObjectPrivate : public DSObjectPrivate +{ +public: + TempObjectPrivate() = delete; + TempObjectPrivate(TempObject *p_ptr); + ~TempObjectPrivate(); + + unsigned int funcMiddle(void); + +protected: + DS_DECLARE_PUBLIC(TempObject) + +private: + DS_DECLARE_PUBLIC_PTR(TempObject) +}; + +class TempObject : public DSObject +{ +public: + explicit TempObject(); + virtual ~TempObject(); + + unsigned int funcEnter(unsigned int val); + unsigned int funcExit(); + +protected: + DS_DECLARE_PRIVATE_PTR(TempObject) + +private: + unsigned int __val = 0; + + DS_DECLARE_PRIVATE(TempObject) +}; + +TempObjectPrivate::TempObjectPrivate(TempObject *p_ptr) + : DSObjectPrivate(p_ptr), __p_ptr(p_ptr) +{ + ; +} + +TempObjectPrivate::~TempObjectPrivate() +{ + ; +} + +unsigned int TempObjectPrivate::funcMiddle(void) +{ + DS_GET_PUB(TempObject); + + return pub->funcExit(); +} + +TempObject::TempObject() + : DS_INIT_PRIVATE_PTR(TempObject) +{ + __val = 0; +} + +unsigned int TempObject::funcEnter(unsigned int val) +{ + DS_GET_PRIV(TempObject); + __val = val; + return priv->funcMiddle(); +} + +unsigned int TempObject::funcExit() +{ + return __val; +} + +TempObject::~TempObject() +{ + ; +} + +/* Test cases */ +TEST_F(DSObjectTest, NewDSObject) +{ + DSObject *obj = new DSObject; + EXPECT_TRUE(obj != nullptr); + + if (obj) + delete obj; +} + +TEST_F(DSObjectTest, DSObjectSetGetName) +{ + std::string gName; + + DSObject *obj = new DSObject(); + EXPECT_TRUE(obj != nullptr); + + if (obj) + { + obj->setName(std::string{"DSObject"}); + gName = obj->getName(); + EXPECT_TRUE(gName.empty() == false); + EXPECT_TRUE(gName.compare(std::string{"DSObject"}) == 0); + + if (!gName.empty()) + gName.clear(); + + delete obj; + } +} + +TEST_F(DSObjectTest, NewDSObjecPrivate) +{ + DSObject *obj = nullptr; + DSObjectPrivate *objPrivate = nullptr; + + obj = new DSObject(); + EXPECT_TRUE(obj != nullptr); + + if (obj) + { + objPrivate = new DSObjectPrivate(obj); + EXPECT_TRUE(objPrivate != nullptr); + + if (objPrivate) + delete objPrivate; + + delete obj; + } +} + +TEST_F(DSObjectTest, NewTempObject) +{ + TempObject *obj = new TempObject(); + EXPECT_TRUE(obj != nullptr); + + if (obj) + delete obj; +} + +TEST_F(DSObjectTest, DerivedObjectSetGetName) +{ + std::string gName; + + TempObject *obj = new TempObject(); + EXPECT_TRUE(obj != nullptr); + + if (obj) + { + obj->setName(std::string{"TempObject"}); + gName = obj->getName(); + EXPECT_TRUE(gName.empty() == false); + EXPECT_TRUE(gName.compare(std::string{"TempObject"}) == 0); + + if (!gName.empty()) + gName.clear(); + + delete obj; + } +} + +TEST_F(DSObjectTest, DerivedObjectPimpl) +{ + unsigned int vIn = 0xdeadbeaf; + unsigned int vOut = 0; + + TempObject *obj = new TempObject(); + EXPECT_TRUE(obj != nullptr); + + if (obj) + { + vOut = obj->funcEnter(vIn); + EXPECT_TRUE(vOut == vIn); + + delete obj; + } +} diff --git a/tests/meson.build b/tests/meson.build index abf9099..fe400da 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -18,6 +18,7 @@ libds_tests_srcs = [ 'DSWaylandOutput-test.cpp', 'DSWaylandTizenInputDeviceManager-test.cpp', 'DSWaylandTizenInputDevice-test.cpp', + 'DSObject-test.cpp', ] gmock_dep = dependency('gmock', method : 'pkg-config') -- 2.7.4 From 26b52bdf36e601fe68048d57d5c9228db321f259 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 11:44:21 +0900 Subject: [PATCH 02/16] test: add DSDebugLog.h Change-Id: Iec2a366a99a43a13b63b18ac36a601a9877c788f --- tests/libds-tests.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/libds-tests.h b/tests/libds-tests.h index 3c8ff11..6f280b7 100644 --- a/tests/libds-tests.h +++ b/tests/libds-tests.h @@ -31,6 +31,7 @@ #include #include +#include "DSDebugLog.h" using ::testing::TestWithParam; using ::testing::Bool; -- 2.7.4 From c6830d3751a7e8bc4a9b4f8bb5b3ad8cd18df0cb Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 12:37:16 +0900 Subject: [PATCH 03/16] DSBuffer: add some method to get the properties of DSBufferQueue int getBufferWidth() int getBufferHeight() void *getNativeBufferQueue() Change-Id: I04bb0a2c4b0bbba40b913f35edd16ca7a3dc55b1 --- src/DSBuffer/DSBufferQueueTBMImpl.cpp | 15 +++++++++++++++ src/DSBuffer/DSBufferQueueTBMImpl.h | 4 ++++ src/DSBuffer/IDSBufferQueue.h | 3 +++ tests/DSBufferTBMImpl-test.cpp | 9 +++++++++ 4 files changed, 31 insertions(+) diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.cpp b/src/DSBuffer/DSBufferQueueTBMImpl.cpp index b1ed14d..2666866 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.cpp +++ b/src/DSBuffer/DSBufferQueueTBMImpl.cpp @@ -22,6 +22,21 @@ DSBufferQueueTBMImpl::~DSBufferQueueTBMImpl() tbm_surface_queue_destroy(__tqueue); } +int DSBufferQueueTBMImpl::getBufferWidth() +{ + return __bufferWidth; +} + +int DSBufferQueueTBMImpl::getBufferHeight() +{ + return __bufferHeight; +} + +void *DSBufferQueueTBMImpl::getNativeBufferQueue() +{ + return (void *)__tqueue; +} + IDSBuffer *DSBufferQueueTBMImpl::dequeueBuffer() { // TODO: diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.h b/src/DSBuffer/DSBufferQueueTBMImpl.h index 628f8f6..1a7c118 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.h +++ b/src/DSBuffer/DSBufferQueueTBMImpl.h @@ -13,6 +13,10 @@ public: DSBufferQueueTBMImpl(int slotSize, int bufferWidth, int bufferHeight, IDSBuffer::Format format); ~DSBufferQueueTBMImpl(); + int getBufferWidth() override; + int getBufferHeight() override; + void *getNativeBufferQueue() override; + IDSBuffer *dequeueBuffer() override; bool enqueueBuffer(IDSBuffer *buffer) override; IDSBuffer *acquireBuffer() override; diff --git a/src/DSBuffer/IDSBufferQueue.h b/src/DSBuffer/IDSBufferQueue.h index ab3c144..17cc606 100644 --- a/src/DSBuffer/IDSBufferQueue.h +++ b/src/DSBuffer/IDSBufferQueue.h @@ -11,6 +11,9 @@ class IDSBufferQueue public: virtual ~IDSBufferQueue() = default; + virtual int getBufferWidth() = 0; + virtual int getBufferHeight() = 0; + virtual void *getNativeBufferQueue() = 0; virtual IDSBuffer *dequeueBuffer() = 0; virtual bool enqueueBuffer(IDSBuffer *buffer) = 0; virtual IDSBuffer *acquireBuffer() = 0; diff --git a/tests/DSBufferTBMImpl-test.cpp b/tests/DSBufferTBMImpl-test.cpp index 4a6d6a1..efc5a5f 100644 --- a/tests/DSBufferTBMImpl-test.cpp +++ b/tests/DSBufferTBMImpl-test.cpp @@ -26,6 +26,15 @@ TEST_F(DSBufferTBMImplTest, CreateBufferQueue) EXPECT_TRUE(bufferQueue.get() != nullptr); } +TEST_F(DSBufferTBMImplTest, CheckInitialValues) +{ + std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue.get() != nullptr); + EXPECT_TRUE(bufferQueue->getBufferWidth() == 100); + EXPECT_TRUE(bufferQueue->getBufferHeight() == 100); + EXPECT_TRUE(bufferQueue->getNativeBufferQueue() != nullptr); +} + TEST_F(DSBufferTBMImplTest, DequeueBuffer) { std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); -- 2.7.4 From 09d00af8d24dcf6ec528dc8fe63fbd5d66c6f083 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 12:39:35 +0900 Subject: [PATCH 04/16] DSBuffer: add getNativeBuffer on DSBUffer interface Change-Id: I2707aa6043cf1ff3d0e236d5a27e1d81aa5453fe --- src/DSBuffer/DSBufferTBMImpl.cpp | 5 +++++ src/DSBuffer/DSBufferTBMImpl.h | 2 ++ src/DSBuffer/IDSBuffer.h | 2 ++ 3 files changed, 9 insertions(+) diff --git a/src/DSBuffer/DSBufferTBMImpl.cpp b/src/DSBuffer/DSBufferTBMImpl.cpp index 93555d5..00d9ce2 100644 --- a/src/DSBuffer/DSBufferTBMImpl.cpp +++ b/src/DSBuffer/DSBufferTBMImpl.cpp @@ -20,6 +20,11 @@ DSBufferTBMImpl::~DSBufferTBMImpl() tbm_surface_destroy(__tsurface); } +void *DSBufferTBMImpl::getNativeBuffer() +{ + return (void *)__tsurface; +} + tbm_format DSBufferTBMImpl::getTBMFormat(IDSBuffer::Format &format) { tbm_format tformat = 0; // what is the error format? diff --git a/src/DSBuffer/DSBufferTBMImpl.h b/src/DSBuffer/DSBufferTBMImpl.h index ce2a37e..7cba1bc 100644 --- a/src/DSBuffer/DSBufferTBMImpl.h +++ b/src/DSBuffer/DSBufferTBMImpl.h @@ -13,6 +13,8 @@ public: DSBufferTBMImpl(int width, int height, IDSBuffer::Format format); ~DSBufferTBMImpl(); + void *getNativeBuffer() override; + static tbm_format getTBMFormat(IDSBuffer::Format &format); private: int __width; diff --git a/src/DSBuffer/IDSBuffer.h b/src/DSBuffer/IDSBuffer.h index 2e40f4c..d25e281 100644 --- a/src/DSBuffer/IDSBuffer.h +++ b/src/DSBuffer/IDSBuffer.h @@ -13,6 +13,8 @@ public: public: virtual ~IDSBuffer() = default; + + virtual void *getNativeBuffer() = 0; }; } -- 2.7.4 From a41d44dccd63a708340d002f7150e7286a8210f4 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 12:40:44 +0900 Subject: [PATCH 05/16] DSBuffer: add DSBufferTBMImpl constructor with tbm_surface_h as a parameter Change-Id: I74ee3614f46e73cfc125b2d22fa7eef399630613 --- src/DSBuffer/DSBufferTBMImpl.cpp | 7 +++++++ src/DSBuffer/DSBufferTBMImpl.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/DSBuffer/DSBufferTBMImpl.cpp b/src/DSBuffer/DSBufferTBMImpl.cpp index 00d9ce2..ef9014e 100644 --- a/src/DSBuffer/DSBufferTBMImpl.cpp +++ b/src/DSBuffer/DSBufferTBMImpl.cpp @@ -15,6 +15,13 @@ DSBufferTBMImpl::DSBufferTBMImpl(int width, int height, IDSBuffer::Format format } } +DSBufferTBMImpl::DSBufferTBMImpl(int width, int height, IDSBuffer::Format format, tbm_surface_h tsurface) + : __width{width}, + __height{height}, + __format{format}, + __tsurface{tsurface} +{} + DSBufferTBMImpl::~DSBufferTBMImpl() { tbm_surface_destroy(__tsurface); diff --git a/src/DSBuffer/DSBufferTBMImpl.h b/src/DSBuffer/DSBufferTBMImpl.h index 7cba1bc..5c821af 100644 --- a/src/DSBuffer/DSBufferTBMImpl.h +++ b/src/DSBuffer/DSBufferTBMImpl.h @@ -11,6 +11,7 @@ class DSBufferTBMImpl : public IDSBuffer { public: DSBufferTBMImpl(int width, int height, IDSBuffer::Format format); + DSBufferTBMImpl(int width, int height, IDSBuffer::Format format, tbm_surface_h tsurface); ~DSBufferTBMImpl(); void *getNativeBuffer() override; -- 2.7.4 From b0421ab2fcca321cd537052806c1b38b53e1fc60 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 12:42:40 +0900 Subject: [PATCH 06/16] DSBuffer: implement the DSBufferQueue methods implement dequeue, enqueue, aquire and release. Change-Id: I7e90cf7acbb1b36c528c17586a97b266fa440d03 --- src/DSBuffer/DSBufferQueueTBMImpl.cpp | 79 +++++++++++++++++++++++---- src/DSBuffer/DSBufferQueueTBMImpl.h | 10 ++-- src/DSBuffer/IDSBufferQueue.h | 9 +-- src/DSBuffer/plantuml/IDSBufferQueue.plantuml | 15 ++--- tests/DSBufferTBMImpl-test.cpp | 50 ++++++++++++----- 5 files changed, 122 insertions(+), 41 deletions(-) mode change 100644 => 100755 src/DSBuffer/plantuml/IDSBufferQueue.plantuml diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.cpp b/src/DSBuffer/DSBufferQueueTBMImpl.cpp index 2666866..91d3f70 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.cpp +++ b/src/DSBuffer/DSBufferQueueTBMImpl.cpp @@ -1,6 +1,7 @@ #include "DSBufferQueueTBMImpl.h" #include "DSBufferTBMImpl.h" #include "DSDebugLog.h" +#include namespace display_server { @@ -19,6 +20,7 @@ DSBufferQueueTBMImpl::DSBufferQueueTBMImpl(int slotSize, int bufferWidth, int bu DSBufferQueueTBMImpl::~DSBufferQueueTBMImpl() { + __bufferVector.erase(__bufferVector.begin(), __bufferVector.end()); tbm_surface_queue_destroy(__tqueue); } @@ -37,28 +39,81 @@ void *DSBufferQueueTBMImpl::getNativeBufferQueue() return (void *)__tqueue; } -IDSBuffer *DSBufferQueueTBMImpl::dequeueBuffer() +std::shared_ptr DSBufferQueueTBMImpl::dequeueBuffer() { - // TODO: - return nullptr; + tbm_surface_queue_error_e terror = TBM_SURFACE_QUEUE_ERROR_NONE; + tbm_surface_h tsurface; + + terror = tbm_surface_queue_dequeue(__tqueue, &tsurface); + if (terror != TBM_SURFACE_QUEUE_ERROR_NONE) { + DSLOG_ERR("BuffeQueueTBM", "tbm_surface_queue_dequeue fails.\n"); + return nullptr; + } + + auto isMatchFunc = [tsurface](std::shared_ptr buffer) -> bool { + return ((tbm_surface_h)buffer->getNativeBuffer() == tsurface); + }; + + auto iter= std::find_if(__bufferVector.begin(), __bufferVector.end(), isMatchFunc); + if (iter == __bufferVector.end()) { + // create a IDSBuffer with tsurface. + __bufferVector.push_back(std::make_shared(__bufferWidth, __bufferWidth, __format, tsurface)); + + return __bufferVector.back(); + } + + return *iter; } -bool DSBufferQueueTBMImpl::enqueueBuffer(IDSBuffer *buffer) +bool DSBufferQueueTBMImpl::enqueueBuffer(std::shared_ptr buffer) { - // TODO: - return false; + tbm_surface_queue_error_e terror = TBM_SURFACE_QUEUE_ERROR_NONE; + tbm_surface_h tsurface = (tbm_surface_h)buffer->getNativeBuffer(); + + terror = tbm_surface_queue_enqueue(__tqueue, tsurface); + if (terror != TBM_SURFACE_QUEUE_ERROR_NONE) { + DSLOG_ERR("BuffeQueueTBM", "tbm_surface_queue_enqueue fails."); + return false; + } + + return true; } -IDSBuffer *DSBufferQueueTBMImpl::acquireBuffer() +std::shared_ptr DSBufferQueueTBMImpl::acquireBuffer() { - // TODO: - return nullptr; + tbm_surface_queue_error_e terror = TBM_SURFACE_QUEUE_ERROR_NONE; + tbm_surface_h tsurface; + + terror = tbm_surface_queue_acquire(__tqueue, &tsurface); + if (terror != TBM_SURFACE_QUEUE_ERROR_NONE) { + DSLOG_ERR("BuffeQueueTBM", "tbm_surface_queue_enqueue fails."); + return nullptr; + } + + auto isMatchFunc = [tsurface](std::shared_ptr buffer) -> bool { + return ((tbm_surface_h)buffer->getNativeBuffer() == tsurface); + }; + + auto iter= std::find_if(__bufferVector.begin(), __bufferVector.end(), isMatchFunc); + if (iter == __bufferVector.end()) { + DSLOG_ERR("BuffeQueueTBM", "No Buffer in this BufferQueue."); + return nullptr; + } + + return *iter; } -bool DSBufferQueueTBMImpl::releaseBuffer(IDSBuffer *buffer) +bool DSBufferQueueTBMImpl::releaseBuffer(std::shared_ptr buffer) { - // TODO: - return false; + tbm_surface_queue_error_e terror = TBM_SURFACE_QUEUE_ERROR_NONE; + + terror = tbm_surface_queue_release(__tqueue, (tbm_surface_h)buffer->getNativeBuffer()); + if (terror != TBM_SURFACE_QUEUE_ERROR_NONE) { + DSLOG_ERR("BuffeQueueTBM", "tbm_surface_queue_release fails."); + return false; + } + + return true; } } diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.h b/src/DSBuffer/DSBufferQueueTBMImpl.h index 1a7c118..1da8ae0 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.h +++ b/src/DSBuffer/DSBufferQueueTBMImpl.h @@ -3,6 +3,7 @@ #include "IDSBufferQueue.h" #include +#include namespace display_server { @@ -17,10 +18,10 @@ public: int getBufferHeight() override; void *getNativeBufferQueue() override; - IDSBuffer *dequeueBuffer() override; - bool enqueueBuffer(IDSBuffer *buffer) override; - IDSBuffer *acquireBuffer() override; - bool releaseBuffer(IDSBuffer *buffer) override; + std::shared_ptr dequeueBuffer() override; + bool enqueueBuffer(std::shared_ptr buffer) override; + std::shared_ptr acquireBuffer() override; + bool releaseBuffer(std::shared_ptr buffer) override; private: int __slotSize; @@ -28,6 +29,7 @@ private: int __bufferHeight; IDSBuffer::Format __format; tbm_surface_queue_h __tqueue; + std::vector> __bufferVector; }; } diff --git a/src/DSBuffer/IDSBufferQueue.h b/src/DSBuffer/IDSBufferQueue.h index 17cc606..a3e719d 100644 --- a/src/DSBuffer/IDSBufferQueue.h +++ b/src/DSBuffer/IDSBufferQueue.h @@ -2,6 +2,7 @@ #define __I_DS_BUFFER_QUEUE_H_ #include "IDSBuffer.h" +#include namespace display_server { @@ -14,10 +15,10 @@ public: virtual int getBufferWidth() = 0; virtual int getBufferHeight() = 0; virtual void *getNativeBufferQueue() = 0; - virtual IDSBuffer *dequeueBuffer() = 0; - virtual bool enqueueBuffer(IDSBuffer *buffer) = 0; - virtual IDSBuffer *acquireBuffer() = 0; - virtual bool releaseBuffer(IDSBuffer *buffer) = 0; + virtual std::shared_ptr dequeueBuffer() = 0; + virtual bool enqueueBuffer(std::shared_ptr ) = 0; + virtual std::shared_ptr acquireBuffer() = 0; + virtual bool releaseBuffer(std::shared_ptr ) = 0; }; } diff --git a/src/DSBuffer/plantuml/IDSBufferQueue.plantuml b/src/DSBuffer/plantuml/IDSBufferQueue.plantuml old mode 100644 new mode 100755 index fec0c13..65fc114 --- a/src/DSBuffer/plantuml/IDSBufferQueue.plantuml +++ b/src/DSBuffer/plantuml/IDSBufferQueue.plantuml @@ -1,3 +1,4 @@ +@startuml class Client { } @@ -7,10 +8,10 @@ Client -[hidden]- IDSBuffer interface IDSBufferQueue { - + virtual bool enqueueBuffer(IDSBuffer *buffer) = 0; - + virtual IDSBuffer *dequeueBuffer() = 0; - + virtual IDSBuffer *acquireBuffer() = 0; - + virtual bool releaseBuffer(IDSBuffer *buffer) = 0; + + virtual bool enqueueBuffer(std::shared_ptr buffer) = 0; + + virtual std::shared_ptr dequeueBuffer() = 0; + + virtual std::shared_ptr acquireBuffer() = 0; + + virtual bool releaseBuffer(std::shared_ptr buffer) = 0; } IDSBuffer "0..*" *-up- "1" DSBufferQueueTBMImpl @@ -28,10 +29,10 @@ class DSBufferQueueTBMImpl + DSBufferQueueTBMImpl(int slotSize, int bufferWidth, int bufferHeight, IDSBuffer::Format format); + ~DSBufferQueueTBMImpl(); - + bool enqueueBuffer(IDSBuffer *buffer) override; + + bool enqueueBuffer(std::shared_ptr buffer) override; + IDSBuffer *dequeueBuffer() override; + IDSBuffer *acquireBuffer() override; - + bool releaseBuffer(IDSBuffer *buffer) override; + + bool releaseBuffer(std::shared_ptr buffer) override; - int __slotSize; - int __bufferWidth; @@ -42,5 +43,5 @@ class DSBufferQueueTBMImpl IDSBuffer <|-down-- DSBufferTBMImpl IDSBuffer <|-down-- DSBufferSHMImpl - +@enduml diff --git a/tests/DSBufferTBMImpl-test.cpp b/tests/DSBufferTBMImpl-test.cpp index efc5a5f..f2758e8 100644 --- a/tests/DSBufferTBMImpl-test.cpp +++ b/tests/DSBufferTBMImpl-test.cpp @@ -40,7 +40,7 @@ TEST_F(DSBufferTBMImplTest, DequeueBuffer) std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); EXPECT_TRUE(bufferQueue.get() != nullptr); - IDSBuffer *buffer = bufferQueue->dequeueBuffer(); + std::shared_ptr buffer = bufferQueue->dequeueBuffer(); EXPECT_TRUE(buffer != nullptr); } @@ -49,10 +49,9 @@ TEST_F(DSBufferTBMImplTest, EnqueueBuffer) std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); EXPECT_TRUE(bufferQueue.get() != nullptr); - IDSBuffer *buffer = bufferQueue->dequeueBuffer(); + std::shared_ptr buffer = bufferQueue->dequeueBuffer(); EXPECT_TRUE(buffer != nullptr); - bool ret = bufferQueue->enqueueBuffer(buffer); - EXPECT_TRUE(ret); + EXPECT_TRUE(bufferQueue->enqueueBuffer(buffer)); } TEST_F(DSBufferTBMImplTest, AcquireBuffer) @@ -60,11 +59,10 @@ TEST_F(DSBufferTBMImplTest, AcquireBuffer) std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); EXPECT_TRUE(bufferQueue.get() != nullptr); - IDSBuffer *buffer1 = bufferQueue->dequeueBuffer(); + std::shared_ptr buffer1 = bufferQueue->dequeueBuffer(); EXPECT_TRUE(buffer1 != nullptr); - bool ret1 = bufferQueue->enqueueBuffer(buffer1); - EXPECT_TRUE(ret1); - IDSBuffer *buffer2 = bufferQueue->acquireBuffer(); + EXPECT_TRUE(bufferQueue->enqueueBuffer(buffer1)); + std::shared_ptr buffer2 = bufferQueue->acquireBuffer(); EXPECT_TRUE(buffer2 != nullptr); } @@ -73,12 +71,36 @@ TEST_F(DSBufferTBMImplTest, ReleaseBuffer) std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); EXPECT_TRUE(bufferQueue.get() != nullptr); - IDSBuffer *buffer1 = bufferQueue->dequeueBuffer(); + std::shared_ptr buffer1 = bufferQueue->dequeueBuffer(); EXPECT_TRUE(buffer1 != nullptr); - bool ret1 = bufferQueue->enqueueBuffer(buffer1); - EXPECT_TRUE(ret1); - IDSBuffer *buffer2 = bufferQueue->acquireBuffer(); + EXPECT_TRUE(bufferQueue->enqueueBuffer(buffer1)); + std::shared_ptr buffer2 = bufferQueue->acquireBuffer(); EXPECT_TRUE(buffer2 != nullptr); - bool ret2 = bufferQueue->releaseBuffer(buffer2); - EXPECT_TRUE(ret2); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer2)); +} + +TEST_F(DSBufferTBMImplTest, DequeueBuffer_4Times) +{ + std::unique_ptr bufferQueue = std::make_unique(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue.get() != nullptr); + + std::shared_ptr buffer1 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer1 != nullptr); + std::shared_ptr buffer2 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer2 != nullptr); + std::shared_ptr buffer3 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer3 != nullptr); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer1)); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer2)); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer3)); + + std::shared_ptr buffer4 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer1.get() == buffer4.get()); + std::shared_ptr buffer5 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer2.get() == buffer5.get()); + std::shared_ptr buffer6 = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer3.get() == buffer6.get()); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer4)); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer5)); + EXPECT_TRUE(bufferQueue->releaseBuffer(buffer6)); } \ No newline at end of file -- 2.7.4 From 6e9e287b023e56932f50310bdd573d584ca49575 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 14:17:09 +0900 Subject: [PATCH 07/16] DSRender: redesign DSRender - simplify the DSRender design with two resources which are DSRenderEngine and DSRenderView. - implement DSRenderEngineEcoreEvasImpl and DSRenderViewEcoreEvasImpl Change-Id: I35e61e596e9ec6d5c6c73d16b4094ac23bbb887d --- packaging/libds.spec | 1 + src/DSRender/DSRenderEngine.cpp | 12 ---- src/DSRender/DSRenderEngine.h | 19 ------ src/DSRender/DSRenderEngineDaliImpl.cpp | 17 +++++- src/DSRender/DSRenderEngineDaliImpl.h | 12 ++-- src/DSRender/DSRenderEngineEcoreEvasImpl.cpp | 55 ++++++++++++++++- src/DSRender/DSRenderEngineEcoreEvasImpl.h | 19 ++++-- src/DSRender/DSRenderFactoryDaliImpl.cpp | 30 --------- src/DSRender/DSRenderFactoryDaliImpl.h | 27 --------- src/DSRender/DSRenderFactoryEcoreEvasImpl.cpp | 30 --------- src/DSRender/DSRenderFactoryEcoreEvasImpl.h | 27 --------- src/DSRender/DSRenderSurface.cpp | 12 ---- src/DSRender/DSRenderSurface.h | 18 ------ src/DSRender/DSRenderSurfaceDaliImpl.cpp | 12 ---- src/DSRender/DSRenderSurfaceDaliImpl.h | 21 ------- src/DSRender/DSRenderSurfaceEcoreEvasImpl.cpp | 12 ---- src/DSRender/DSRenderSurfaceEcoreEvasImpl.h | 20 ------ src/DSRender/DSRenderView.cpp | 2 +- src/DSRender/DSRenderView.h | 7 ++- src/DSRender/DSRenderViewDaliImpl.cpp | 7 ++- src/DSRender/DSRenderViewDaliImpl.h | 4 +- src/DSRender/DSRenderViewEcoreEvasImpl.cpp | 26 +++++++- src/DSRender/DSRenderViewEcoreEvasImpl.h | 8 ++- src/DSRender/IDSRenderEngine.h | 21 +++++++ src/DSRender/IDSRenderFactory.h | 21 ------- src/DSRender/plantuml/IDSRenderEngine.plantuml | 33 ++++++++++ src/meson.build | 9 +-- tests/DSRenderEngineDaliImpl-test.cpp | 52 ++++++++++++++++ tests/DSRenderEngineEcoreEvasImpl-test.cpp | 60 ++++++++++++++++++ tests/DSRenderFactoryDaliImpl-test.cpp | 84 -------------------------- tests/DSRenderFactoryEcoreEvasImpl-test.cpp | 84 -------------------------- tests/meson.build | 6 +- 32 files changed, 307 insertions(+), 461 deletions(-) delete mode 100644 src/DSRender/DSRenderEngine.cpp delete mode 100644 src/DSRender/DSRenderEngine.h delete mode 100644 src/DSRender/DSRenderFactoryDaliImpl.cpp delete mode 100644 src/DSRender/DSRenderFactoryDaliImpl.h delete mode 100644 src/DSRender/DSRenderFactoryEcoreEvasImpl.cpp delete mode 100644 src/DSRender/DSRenderFactoryEcoreEvasImpl.h delete mode 100644 src/DSRender/DSRenderSurface.cpp delete mode 100644 src/DSRender/DSRenderSurface.h delete mode 100644 src/DSRender/DSRenderSurfaceDaliImpl.cpp delete mode 100644 src/DSRender/DSRenderSurfaceDaliImpl.h delete mode 100644 src/DSRender/DSRenderSurfaceEcoreEvasImpl.cpp delete mode 100644 src/DSRender/DSRenderSurfaceEcoreEvasImpl.h create mode 100644 src/DSRender/IDSRenderEngine.h delete mode 100644 src/DSRender/IDSRenderFactory.h create mode 100644 src/DSRender/plantuml/IDSRenderEngine.plantuml create mode 100644 tests/DSRenderEngineDaliImpl-test.cpp create mode 100644 tests/DSRenderEngineEcoreEvasImpl-test.cpp delete mode 100644 tests/DSRenderFactoryDaliImpl-test.cpp delete mode 100644 tests/DSRenderFactoryEcoreEvasImpl-test.cpp diff --git a/packaging/libds.spec b/packaging/libds.spec index a1f8c84..d775ad1 100644 --- a/packaging/libds.spec +++ b/packaging/libds.spec @@ -20,6 +20,7 @@ BuildRequires: pkgconfig(tizen-surface-server) BuildRequires: pkgconfig(xdg-shell-unstable-v6-server) BuildRequires: pkgconfig(xdg-shell-server) BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(ecore-evas) %description diff --git a/src/DSRender/DSRenderEngine.cpp b/src/DSRender/DSRenderEngine.cpp deleted file mode 100644 index cd35ad0..0000000 --- a/src/DSRender/DSRenderEngine.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "DSRenderEngine.h" - -namespace display_server -{ - -DSRenderEngine::DSRenderEngine(/* args */) -{} - -DSRenderEngine::~DSRenderEngine() -{} - -} // namespace display_server diff --git a/src/DSRender/DSRenderEngine.h b/src/DSRender/DSRenderEngine.h deleted file mode 100644 index 14ce3f0..0000000 --- a/src/DSRender/DSRenderEngine.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __DS_RENDER_ENGINE_H_ -#define __DS_RENDER_ENGINE_H_ - -namespace display_server -{ - -class DSRenderEngine -{ -public: - DSRenderEngine(/* args */); - virtual ~DSRenderEngine(); - -private: - /* data */ -}; - -} - -#endif diff --git a/src/DSRender/DSRenderEngineDaliImpl.cpp b/src/DSRender/DSRenderEngineDaliImpl.cpp index e56f877..3bf7990 100644 --- a/src/DSRender/DSRenderEngineDaliImpl.cpp +++ b/src/DSRender/DSRenderEngineDaliImpl.cpp @@ -1,12 +1,27 @@ #include "DSRenderEngineDaliImpl.h" +#include "DSRenderViewDaliImpl.h" +#include "DSDebugLog.h" namespace display_server { -DSRenderEngineDaliImpl::DSRenderEngineDaliImpl(/* args */) +DSRenderEngineDaliImpl::DSRenderEngineDaliImpl(std::shared_ptr bufferQueue) + : __bufferQueue{bufferQueue} {} DSRenderEngineDaliImpl::~DSRenderEngineDaliImpl() {} +std::shared_ptr DSRenderEngineDaliImpl::makeRenderView() +{ + std::shared_ptr renderView = std::make_shared(); + + return renderView; +} + +bool DSRenderEngineDaliImpl::renderFrame() +{ + return false; +} + } // namespace display_server diff --git a/src/DSRender/DSRenderEngineDaliImpl.h b/src/DSRender/DSRenderEngineDaliImpl.h index 7b7375d..d50ac49 100644 --- a/src/DSRender/DSRenderEngineDaliImpl.h +++ b/src/DSRender/DSRenderEngineDaliImpl.h @@ -1,19 +1,23 @@ #ifndef __DS_RENDER_ENGINE_DALI_IMPL_H_ #define __DS_RENDER_ENGINE_DALI_IMPL_H_ -#include "DSRenderEngine.h" +#include "IDSRenderEngine.h" +#include "IDSBufferQueue.h" namespace display_server { -class DSRenderEngineDaliImpl : public DSRenderEngine +class DSRenderEngineDaliImpl : public IDSRenderEngine { public: - DSRenderEngineDaliImpl(/* args */); + DSRenderEngineDaliImpl(std::shared_ptr bufferQueue); ~DSRenderEngineDaliImpl(); + std::shared_ptr makeRenderView() override; + bool renderFrame() override; + private: - /* data */ + std::shared_ptr __bufferQueue; }; } diff --git a/src/DSRender/DSRenderEngineEcoreEvasImpl.cpp b/src/DSRender/DSRenderEngineEcoreEvasImpl.cpp index 8a0f920..dc4551e 100644 --- a/src/DSRender/DSRenderEngineEcoreEvasImpl.cpp +++ b/src/DSRender/DSRenderEngineEcoreEvasImpl.cpp @@ -1,12 +1,61 @@ #include "DSRenderEngineEcoreEvasImpl.h" +#include "DSRenderViewEcoreEvasImpl.h" +#include "DSDebugLog.h" namespace display_server { -DSRenderEngineEcoreEvasImpl::DSRenderEngineEcoreEvasImpl(/* args */) -{} +DSRenderEngineEcoreEvasImpl::DSRenderEngineEcoreEvasImpl(std::shared_ptr bufferQueue) + : __bufferQueue(bufferQueue), + __bufferWidth{bufferQueue->getBufferWidth()}, + __bufferHeight{bufferQueue->getBufferHeight()}, + __ee{nullptr} +{ + if (!evas_init()) { + DSLOG_ERR("RENDER_ENGINE_ECORE_EVAS", "evas_init fails\n"); + } + + if (!ecore_evas_init()) { + DSLOG_ERR("RENDER_ENGINE_ECORE_EVAS", "ecore_evas_init fails\n"); + } + + auto alloc_func = [](void *data, int w, int h) -> void * { + IDSBufferQueue *bufferQueue = static_cast(data); + void *nativeBufferQueue = bufferQueue->getNativeBufferQueue(); + + return nativeBufferQueue; + }; + + auto free_func = [](void *data, void *tqueue) -> void {}; + + __ee = ecore_evas_tbm_allocfunc_new("gl_tbm", __bufferWidth, __bufferHeight, alloc_func, free_func, (void *)bufferQueue.get()); + if (!__ee) { + DSLOG_ERR("RENDER_ENGINE_ECORE_EVAS", "ecore_evas_tbm_allocfunc_new fails.\n"); + } + + ecore_evas_manual_render_set(__ee, 1); + ecore_evas_show(__ee); +} DSRenderEngineEcoreEvasImpl::~DSRenderEngineEcoreEvasImpl() -{} +{ + ecore_evas_free(__ee); + ecore_evas_shutdown(); + evas_shutdown(); +} + +std::shared_ptr DSRenderEngineEcoreEvasImpl::makeRenderView() +{ + std::shared_ptr renderView = std::make_shared(__ee); + + return renderView; +} + +bool DSRenderEngineEcoreEvasImpl::renderFrame() +{ + ecore_evas_manual_render(__ee); + + return true; +} } // namespace display_server diff --git a/src/DSRender/DSRenderEngineEcoreEvasImpl.h b/src/DSRender/DSRenderEngineEcoreEvasImpl.h index a3368f3..163c7f2 100644 --- a/src/DSRender/DSRenderEngineEcoreEvasImpl.h +++ b/src/DSRender/DSRenderEngineEcoreEvasImpl.h @@ -1,18 +1,27 @@ #ifndef __DS_RENDER_ENGINE_ECORE_EVAS_IMPL_H_ #define __DS_RENDER_ENGINE_ECORE_EVAS_IMPL_H_ -#include "DSRenderEngine.h" +#include "IDSRenderEngine.h" +#include "IDSBufferQueue.h" +#include namespace display_server { -class DSRenderEngineEcoreEvasImpl : public DSRenderEngine +class DSRenderEngineEcoreEvasImpl : public IDSRenderEngine { -private: - /* data */ public: - DSRenderEngineEcoreEvasImpl(/* args */); + DSRenderEngineEcoreEvasImpl(std::shared_ptr bufferQueue); ~DSRenderEngineEcoreEvasImpl(); + + std::shared_ptr makeRenderView() override; + bool renderFrame() override; + +private: + std::shared_ptr __bufferQueue; + int __bufferWidth; + int __bufferHeight; + Ecore_Evas *__ee; }; } diff --git a/src/DSRender/DSRenderFactoryDaliImpl.cpp b/src/DSRender/DSRenderFactoryDaliImpl.cpp deleted file mode 100644 index bffb7d7..0000000 --- a/src/DSRender/DSRenderFactoryDaliImpl.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "DSRenderFactoryDaliImpl.h" - -namespace display_server -{ - -DSRenderFactoryDaliImpl::DSRenderFactoryDaliImpl(/* args */) -{} - -DSRenderFactoryDaliImpl::~DSRenderFactoryDaliImpl() -{} - -DSRenderEngine *DSRenderFactoryDaliImpl::createDSRenderEngine() -{ - DSRenderEngine *renderer = new DSRenderEngineDaliImpl; - return renderer; -} - -DSRenderSurface *DSRenderFactoryDaliImpl::createDSRenderSurface() -{ - DSRenderSurface *renderSurface = new DSRenderSurfaceDaliImpl; - return renderSurface; -} - -DSRenderView *DSRenderFactoryDaliImpl::createDSRenderView() -{ - DSRenderView *renderView = new DSRenderViewDaliImpl; - return renderView; -} - -} // namespace display_server diff --git a/src/DSRender/DSRenderFactoryDaliImpl.h b/src/DSRender/DSRenderFactoryDaliImpl.h deleted file mode 100644 index c315f99..0000000 --- a/src/DSRender/DSRenderFactoryDaliImpl.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __DS_RENDER_FACTORY_DALI_IMPL_H_ -#define __DS_RENDER_FACTORY_DALI_IMPL_H_ - -#include "IDSRenderFactory.h" -#include "DSRenderEngineDaliImpl.h" -#include "DSRenderSurfaceDaliImpl.h" -#include "DSRenderViewDaliImpl.h" - -namespace display_server -{ -class DSRenderFactoryDaliImpl : public IDSRenderFactory -{ - -private: - /* data */ -public: - DSRenderFactoryDaliImpl(/* args */); - ~DSRenderFactoryDaliImpl(); - - DSRenderEngine *createDSRenderEngine() override; - DSRenderSurface *createDSRenderSurface() override; - DSRenderView *createDSRenderView() override; -}; - -} - -#endif diff --git a/src/DSRender/DSRenderFactoryEcoreEvasImpl.cpp b/src/DSRender/DSRenderFactoryEcoreEvasImpl.cpp deleted file mode 100644 index a9399fb..0000000 --- a/src/DSRender/DSRenderFactoryEcoreEvasImpl.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "DSRenderFactoryEcoreEvasImpl.h" - -namespace display_server -{ - -DSRenderFactoryEcoreEvasImpl::DSRenderFactoryEcoreEvasImpl(/* args */) -{} - -DSRenderFactoryEcoreEvasImpl::~DSRenderFactoryEcoreEvasImpl() -{} - -DSRenderEngine *DSRenderFactoryEcoreEvasImpl::createDSRenderEngine() -{ - DSRenderEngine *renderer = new DSRenderEngineEcoreEvasImpl; - return renderer; -} - -DSRenderSurface *DSRenderFactoryEcoreEvasImpl::createDSRenderSurface() -{ - DSRenderSurface *renderSurface = new DSRenderSurfaceEcoreEvasImpl; - return renderSurface; -} - -DSRenderView *DSRenderFactoryEcoreEvasImpl::createDSRenderView() -{ - DSRenderView *renderView = new DSRenderViewEcoreEvasImpl; - return renderView; -} - -} // namespace display_server diff --git a/src/DSRender/DSRenderFactoryEcoreEvasImpl.h b/src/DSRender/DSRenderFactoryEcoreEvasImpl.h deleted file mode 100644 index ef25280..0000000 --- a/src/DSRender/DSRenderFactoryEcoreEvasImpl.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __DS_RENDER_FACTORY_ECORE_EVAS__IMPL_H_ -#define __DS_RENDER_FACTORY_ECORE_EVAS__IMPL_H_ - -#include "IDSRenderFactory.h" -#include "DSRenderEngineEcoreEvasImpl.h" -#include "DSRenderSurfaceEcoreEvasImpl.h" -#include "DSRenderViewEcoreEvasImpl.h" - -namespace display_server -{ - -class DSRenderFactoryEcoreEvasImpl : public IDSRenderFactory -{ -private: - /* data */ -public: - DSRenderFactoryEcoreEvasImpl(/* args */); - ~DSRenderFactoryEcoreEvasImpl(); - - DSRenderEngine *createDSRenderEngine() override; - DSRenderSurface *createDSRenderSurface() override; - DSRenderView *createDSRenderView() override; -}; - -} - -#endif diff --git a/src/DSRender/DSRenderSurface.cpp b/src/DSRender/DSRenderSurface.cpp deleted file mode 100644 index 4ff8d83..0000000 --- a/src/DSRender/DSRenderSurface.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "DSRenderSurface.h" - -namespace display_server -{ - -DSRenderSurface::DSRenderSurface(/* args */) -{} - -DSRenderSurface::~DSRenderSurface() -{} - -} // namespace display_server diff --git a/src/DSRender/DSRenderSurface.h b/src/DSRender/DSRenderSurface.h deleted file mode 100644 index 6dfca68..0000000 --- a/src/DSRender/DSRenderSurface.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __DS_RENDER_SURFACE_H_ -#define __DS_RENDER_SURFACE_H_ - -namespace display_server -{ - -class DSRenderSurface -{ -private: - /* data */ -public: - DSRenderSurface(/* args */); - virtual ~DSRenderSurface(); -}; - -} - -#endif diff --git a/src/DSRender/DSRenderSurfaceDaliImpl.cpp b/src/DSRender/DSRenderSurfaceDaliImpl.cpp deleted file mode 100644 index 736d5ca..0000000 --- a/src/DSRender/DSRenderSurfaceDaliImpl.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "DSRenderSurfaceDaliImpl.h" - -namespace display_server -{ - -DSRenderSurfaceDaliImpl::DSRenderSurfaceDaliImpl(/* args */) -{} - -DSRenderSurfaceDaliImpl::~DSRenderSurfaceDaliImpl() -{} - -} // namespace display_server diff --git a/src/DSRender/DSRenderSurfaceDaliImpl.h b/src/DSRender/DSRenderSurfaceDaliImpl.h deleted file mode 100644 index 8242f16..0000000 --- a/src/DSRender/DSRenderSurfaceDaliImpl.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __DS_RENDER_SURFACE_DALI_IMPL_H_ -#define __DS_RENDER_SURFACE_DALI_IMPL_H_ - -#include "DSRenderSurface.h" - -namespace display_server -{ - -class DSRenderSurfaceDaliImpl : public DSRenderSurface -{ -public: - DSRenderSurfaceDaliImpl(/* args */); - ~DSRenderSurfaceDaliImpl(); - -private: - /* data */ -}; - -} - -#endif diff --git a/src/DSRender/DSRenderSurfaceEcoreEvasImpl.cpp b/src/DSRender/DSRenderSurfaceEcoreEvasImpl.cpp deleted file mode 100644 index 59946da..0000000 --- a/src/DSRender/DSRenderSurfaceEcoreEvasImpl.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "DSRenderSurfaceEcoreEvasImpl.h" - -namespace display_server -{ - -DSRenderSurfaceEcoreEvasImpl::DSRenderSurfaceEcoreEvasImpl(/* args */) -{} - -DSRenderSurfaceEcoreEvasImpl::~DSRenderSurfaceEcoreEvasImpl() -{} - -} // namespace display_server diff --git a/src/DSRender/DSRenderSurfaceEcoreEvasImpl.h b/src/DSRender/DSRenderSurfaceEcoreEvasImpl.h deleted file mode 100644 index ade3baf..0000000 --- a/src/DSRender/DSRenderSurfaceEcoreEvasImpl.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __DS_RENDER_SURFACE_ECORE_EVAS_IMPL_H_ -#define __DS_RENDER_SURFACE_ECORE_EVAS_IMPL_H_ - -#include "DSRenderSurface.h" - -namespace display_server -{ - -class DSRenderSurfaceEcoreEvasImpl : public DSRenderSurface -{ -public: - DSRenderSurfaceEcoreEvasImpl(/* args */); - ~DSRenderSurfaceEcoreEvasImpl(); - -private: - /* data */ -}; -} - -#endif diff --git a/src/DSRender/DSRenderView.cpp b/src/DSRender/DSRenderView.cpp index 4bae2af..7dd282d 100644 --- a/src/DSRender/DSRenderView.cpp +++ b/src/DSRender/DSRenderView.cpp @@ -3,7 +3,7 @@ namespace display_server { -DSRenderView::DSRenderView(/* args */) +DSRenderView::DSRenderView() {} DSRenderView::~DSRenderView() diff --git a/src/DSRender/DSRenderView.h b/src/DSRender/DSRenderView.h index c3f4065..a76eaa2 100644 --- a/src/DSRender/DSRenderView.h +++ b/src/DSRender/DSRenderView.h @@ -1,15 +1,20 @@ #ifndef __DS_RENDER_VIEW_H_ #define __DS_RENDER_VIEW_H_ +#include "IDSBuffer.h" +#include + namespace display_server { class DSRenderView { public: - DSRenderView(/* args */); + DSRenderView(); virtual ~DSRenderView(); + virtual bool setBuffer(std::shared_ptr buffer) = 0; + private: /* data */ }; diff --git a/src/DSRender/DSRenderViewDaliImpl.cpp b/src/DSRender/DSRenderViewDaliImpl.cpp index 6008a3c..5b83e3a 100644 --- a/src/DSRender/DSRenderViewDaliImpl.cpp +++ b/src/DSRender/DSRenderViewDaliImpl.cpp @@ -3,10 +3,15 @@ namespace display_server { -DSRenderViewDaliImpl::DSRenderViewDaliImpl(/* args */) +DSRenderViewDaliImpl::DSRenderViewDaliImpl() {} DSRenderViewDaliImpl::~DSRenderViewDaliImpl() {} +bool DSRenderViewDaliImpl::setBuffer(std::shared_ptr buffer) +{ + return false; +} + } // namespace display_server diff --git a/src/DSRender/DSRenderViewDaliImpl.h b/src/DSRender/DSRenderViewDaliImpl.h index e80ab8d..36990f1 100644 --- a/src/DSRender/DSRenderViewDaliImpl.h +++ b/src/DSRender/DSRenderViewDaliImpl.h @@ -9,9 +9,11 @@ namespace display_server class DSRenderViewDaliImpl : public DSRenderView { public: - DSRenderViewDaliImpl(/* args */); + DSRenderViewDaliImpl(); ~DSRenderViewDaliImpl(); + bool setBuffer(std::shared_ptr buffer) override; + private: /* data */ }; diff --git a/src/DSRender/DSRenderViewEcoreEvasImpl.cpp b/src/DSRender/DSRenderViewEcoreEvasImpl.cpp index 3231ce3..8ce49be 100644 --- a/src/DSRender/DSRenderViewEcoreEvasImpl.cpp +++ b/src/DSRender/DSRenderViewEcoreEvasImpl.cpp @@ -1,12 +1,32 @@ #include "DSRenderViewEcoreEvasImpl.h" +#include "DSDebugLog.h" namespace display_server { -DSRenderViewEcoreEvasImpl::DSRenderViewEcoreEvasImpl(/* args */) -{} +DSRenderViewEcoreEvasImpl::DSRenderViewEcoreEvasImpl(Ecore_Evas *ee) +{ + __evasView = evas_object_image_filled_add(ecore_evas_get(ee)); + evas_object_image_border_center_fill_set(__evasView, EVAS_BORDER_FILL_SOLID); + evas_object_image_colorspace_set(__evasView, EVAS_COLORSPACE_ARGB8888); +} DSRenderViewEcoreEvasImpl::~DSRenderViewEcoreEvasImpl() -{} +{ + evas_object_del(__evasView); +} + +bool DSRenderViewEcoreEvasImpl::setBuffer(std::shared_ptr buffer) +{ + Evas_Native_Surface ns; + + ns.type = EVAS_NATIVE_SURFACE_TBM; + ns.version = EVAS_NATIVE_SURFACE_VERSION; + ns.data.tbm.buffer = buffer->getNativeBuffer(); + + evas_object_image_native_surface_set(__evasView, &ns); + + return true; +} } // namespace display_server diff --git a/src/DSRender/DSRenderViewEcoreEvasImpl.h b/src/DSRender/DSRenderViewEcoreEvasImpl.h index 9aac180..eca50a7 100644 --- a/src/DSRender/DSRenderViewEcoreEvasImpl.h +++ b/src/DSRender/DSRenderViewEcoreEvasImpl.h @@ -2,6 +2,7 @@ #define __DS_RENDER_VIEW_ECORE_EVAS_IMPL_H_ #include "DSRenderView.h" +#include namespace display_server { @@ -9,13 +10,16 @@ namespace display_server class DSRenderViewEcoreEvasImpl : public DSRenderView { public: - DSRenderViewEcoreEvasImpl(/* args */); + DSRenderViewEcoreEvasImpl(Ecore_Evas *ee); ~DSRenderViewEcoreEvasImpl(); + bool setBuffer(std::shared_ptr buffer) override; + private: - /* data */ + Evas_Object *__evasView; }; + } #endif diff --git a/src/DSRender/IDSRenderEngine.h b/src/DSRender/IDSRenderEngine.h new file mode 100644 index 0000000..17d32cc --- /dev/null +++ b/src/DSRender/IDSRenderEngine.h @@ -0,0 +1,21 @@ +#ifndef __I_DS_RENDER_ENGINE_H_ +#define __I_DS_RENDER_ENGINE_H_ + +#include "DSRenderView.h" +#include + +namespace display_server +{ + +class IDSRenderEngine +{ +public: + virtual ~IDSRenderEngine() = default; + + virtual std::shared_ptr makeRenderView() = 0; + virtual bool renderFrame() = 0; +}; + +} + +#endif diff --git a/src/DSRender/IDSRenderFactory.h b/src/DSRender/IDSRenderFactory.h deleted file mode 100644 index 3a3b4f3..0000000 --- a/src/DSRender/IDSRenderFactory.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __DS_RENDER_FACTORY_H_ -#define __DS_RENDER_FACTORY_H_ - -#include "DSRenderEngine.h" -#include "DSRenderSurface.h" -#include "DSRenderView.h" - -namespace display_server -{ -class IDSRenderFactory -{ -public: - virtual ~IDSRenderFactory() = default; - - virtual DSRenderEngine *createDSRenderEngine() = 0; - virtual DSRenderSurface *createDSRenderSurface() = 0; - virtual DSRenderView *createDSRenderView() = 0; -}; -} - -#endif diff --git a/src/DSRender/plantuml/IDSRenderEngine.plantuml b/src/DSRender/plantuml/IDSRenderEngine.plantuml new file mode 100644 index 0000000..f991b17 --- /dev/null +++ b/src/DSRender/plantuml/IDSRenderEngine.plantuml @@ -0,0 +1,33 @@ +class Client +{ +} + +interface IDSRenderEngine +{ + + virtual std::shared_ptr makeRenderView() = 0; + + virtual bool renderFrame() = 0; +} + +Client "1" o-right- "0..*" IDSRenderEngine + +DSRenderEngineEcoreEvasImpl -up..|> IDSRenderEngine +DSRenderEngineDaliImpl -up..|> IDSRenderEngine + +class DSRenderEngineEcoreEvasImpl +{ +} + +class DSRenderEngineDaliImpl +{ +} + +abstract class DSRenderView +{ + + virtual bool setBuffer(std::shared_ptr buffer) = 0; +} + +DSRenderView <|-down-- DSRenderViewEcoreEvasImpl +DSRenderView <|-down-- DSRenderViewDaliImpl + + + diff --git a/src/meson.build b/src/meson.build index ccea800..45d2051 100644 --- a/src/meson.build +++ b/src/meson.build @@ -24,17 +24,11 @@ libds_srcs = [ 'DSProperty/DSProperty.h', 'DSProperty/DSPropertyPrivate.cpp', 'DSProperty/DSPropertyPrivate.h', - 'DSRender/DSRenderEngine.cpp', 'DSRender/DSRenderEngineEcoreEvasImpl.cpp', 'DSRender/DSRenderEngineDaliImpl.cpp', - 'DSRender/DSRenderSurface.cpp', - 'DSRender/DSRenderSurfaceEcoreEvasImpl.cpp', - 'DSRender/DSRenderSurfaceDaliImpl.cpp', 'DSRender/DSRenderView.cpp', 'DSRender/DSRenderViewEcoreEvasImpl.cpp', 'DSRender/DSRenderViewDaliImpl.cpp', - 'DSRender/DSRenderFactoryEcoreEvasImpl.cpp', - 'DSRender/DSRenderFactoryDaliImpl.cpp', 'DSSeat/DSSeat.cpp', 'DSSignal/DSSignal.cpp', 'DSSignal/DSSignal.h', @@ -77,6 +71,7 @@ install_headers( pkgconfig = import('pkgconfig') ecore_dep = dependency('ecore') +ecore_evas_dep = dependency('ecore-evas') dlog_dep = dependency('dlog') libtdm_dep = dependency('libtdm') wayland_dep = dependency('wayland-server') @@ -118,7 +113,7 @@ libds_include_dirs = include_directories( libds_lib = shared_library( 'libds', libds_srcs, - dependencies : [dlog_dep, libtdm_dep, wayland_dep, tizen_ext_deps, ecore_dep], + dependencies : [dlog_dep, libtdm_dep, wayland_dep, tizen_ext_deps, ecore_dep, ecore_evas_dep], include_directories : [libds_include_dirs], version : meson.project_version(), install : true diff --git a/tests/DSRenderEngineDaliImpl-test.cpp b/tests/DSRenderEngineDaliImpl-test.cpp new file mode 100644 index 0000000..2dca108 --- /dev/null +++ b/tests/DSRenderEngineDaliImpl-test.cpp @@ -0,0 +1,52 @@ +#include "libds-tests.h" +#include "DSRenderEngineDaliImpl.h" +#include "DSBufferQueueTBMImpl.h" +#include "DSBufferTBMImpl.h" + + +using namespace display_server; + +class DSRenderEngineDaliTest : public ::testing::Test +{ +public: + void SetUp(void) override + {} + void TearDown(void) override + {} +}; + +TEST_F(DSRenderEngineDaliTest, RenderEngine_Create) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); +} + +TEST_F(DSRenderEngineDaliTest, RenderEngine_CreateRenderView) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); + + std::shared_ptr renderView = renderEngine->makeRenderView(); + EXPECT_TRUE(renderView != nullptr); +} + +TEST_F(DSRenderEngineDaliTest, RenderView_SetBuffer) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); + + std::shared_ptr renderView = renderEngine->makeRenderView(); + EXPECT_TRUE(renderView != nullptr); + + std::shared_ptr buffer = std::make_shared(100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(renderView->setBuffer(buffer)); +} \ No newline at end of file diff --git a/tests/DSRenderEngineEcoreEvasImpl-test.cpp b/tests/DSRenderEngineEcoreEvasImpl-test.cpp new file mode 100644 index 0000000..1aaaf67 --- /dev/null +++ b/tests/DSRenderEngineEcoreEvasImpl-test.cpp @@ -0,0 +1,60 @@ +#include "libds-tests.h" +#include "DSRenderEngineEcoreEvasImpl.h" +#include "DSBufferQueueTBMImpl.h" +#include "DSBufferTBMImpl.h" + +using namespace display_server; + +class DSRenderEngineEcoreEvasTest : public ::testing::Test +{ +public: + void SetUp(void) override + {} + void TearDown(void) override + {} +}; + +TEST_F(DSRenderEngineEcoreEvasTest, RenderEngine_Create) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); +} + +#if 0 // There is a crash issue on evas_shutdown(). I am waiting for fixing it. +TEST_F(DSRenderEngineEcoreEvasTest, RenderEngine_MakeRenderView) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); + std::shared_ptr renderView = renderEngine->makeRenderView(); + EXPECT_TRUE(renderView != nullptr); +} + +TEST_F(DSRenderEngineEcoreEvasTest, RenderView_SetBuffer) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); + std::shared_ptr renderView = renderEngine->makeRenderView(); + EXPECT_TRUE(renderView != nullptr); + std::shared_ptr buffer = std::make_shared (100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(renderView->setBuffer(buffer)); +} + +TEST_F(DSRenderEngineEcoreEvasTest, RenderEngine_RenderFrame) +{ + std::shared_ptr bufferQueue = std::make_shared(3, 100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(bufferQueue != nullptr); + std::unique_ptr renderEngine = std::make_unique(bufferQueue); + EXPECT_TRUE(renderEngine != nullptr); + std::shared_ptr renderView = renderEngine->makeRenderView(); + EXPECT_TRUE(renderView != nullptr); + std::shared_ptr buffer = std::make_shared (100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(renderView->setBuffer(buffer)); + EXPECT_TRUE(renderEngine->renderFrame()); +} +#endif \ No newline at end of file diff --git a/tests/DSRenderFactoryDaliImpl-test.cpp b/tests/DSRenderFactoryDaliImpl-test.cpp deleted file mode 100644 index 01a0058..0000000 --- a/tests/DSRenderFactoryDaliImpl-test.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "libds-tests.h" -#include "DSRenderFactoryDaliImpl.h" - -using namespace display_server; - -class DSRenderFactoryDaliTest : public ::testing::Test -{ -public: - void SetUp(void) override - {} - void TearDown(void) override - {} -}; - -class DSBufferQueueMock -{ -public: - DSBufferQueueMock() {}; - ~DSBufferQueueMock() {}; - //MOCK_METHOD(ReturnType, MethodName, (Args...)); - //MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); -}; - -TEST_F(DSRenderFactoryDaliTest, CreateRenderFactoryDali) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryDaliImpl; - EXPECT_TRUE(renderFactory != nullptr); - - delete renderFactory; -} - -TEST_F(DSRenderFactoryDaliTest, createDSRenderEngine) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryDaliImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderEngine *renderEngine = renderFactory->createDSRenderEngine(); - EXPECT_TRUE(renderEngine != nullptr); - - delete renderEngine; - delete renderFactory; -} - -TEST_F(DSRenderFactoryDaliTest, createDSRenderSurface) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryDaliImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderSurface *renderSurface = renderFactory->createDSRenderSurface(); - EXPECT_TRUE(renderSurface != nullptr); - - delete renderSurface; - delete renderFactory; -} - -TEST_F(DSRenderFactoryDaliTest, createDSRenderView) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryDaliImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderView *renderView = renderFactory->createDSRenderView(); - EXPECT_TRUE(renderView != nullptr); - - delete renderView; - delete renderFactory; -} - -TEST_F(DSRenderFactoryDaliTest, CreateRenderFactoryDaliAll) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryDaliImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderEngine *renderEngine = renderFactory->createDSRenderEngine(); - EXPECT_TRUE(renderEngine != nullptr); - DSRenderSurface *renderSurface = renderFactory->createDSRenderSurface(); - EXPECT_TRUE(renderSurface != nullptr); - DSRenderView *renderView = renderFactory->createDSRenderView(); - EXPECT_TRUE(renderView != nullptr); - - delete renderView; - delete renderSurface; - delete renderEngine; - delete renderFactory; -} diff --git a/tests/DSRenderFactoryEcoreEvasImpl-test.cpp b/tests/DSRenderFactoryEcoreEvasImpl-test.cpp deleted file mode 100644 index 1e8d50b..0000000 --- a/tests/DSRenderFactoryEcoreEvasImpl-test.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "libds-tests.h" -#include "DSRenderFactoryEcoreEvasImpl.h" - -using namespace display_server; - -class DSRenderFactoryEcoreEvasTest : public ::testing::Test -{ -public: - void SetUp(void) override - {} - void TearDown(void) override - {} -}; - -class DSBufferQueueMock -{ -public: - DSBufferQueueMock() {}; - ~DSBufferQueueMock() {}; - //MOCK_METHOD(ReturnType, MethodName, (Args...)); - //MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); -}; - -TEST_F(DSRenderFactoryEcoreEvasTest, CreateRenderFactoryEcoreEvas) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryEcoreEvasImpl; - EXPECT_TRUE(renderFactory != nullptr); - - delete renderFactory; -} - -TEST_F(DSRenderFactoryEcoreEvasTest, createDSRenderEngine) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryEcoreEvasImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderEngine *renderEngine = renderFactory->createDSRenderEngine(); - EXPECT_TRUE(renderEngine != nullptr); - - delete renderEngine; - delete renderFactory; -} - -TEST_F(DSRenderFactoryEcoreEvasTest, createDSRenderSurface) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryEcoreEvasImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderSurface *renderSurface = renderFactory->createDSRenderSurface(); - EXPECT_TRUE(renderSurface != nullptr); - - delete renderSurface; - delete renderFactory; -} - -TEST_F(DSRenderFactoryEcoreEvasTest, createDSRenderView) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryEcoreEvasImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderView *renderView = renderFactory->createDSRenderView(); - EXPECT_TRUE(renderView != nullptr); - - delete renderView; - delete renderFactory; -} - -TEST_F(DSRenderFactoryEcoreEvasTest, CreateRenderFactoryEcoreEvasAll) -{ - IDSRenderFactory *renderFactory = new DSRenderFactoryEcoreEvasImpl; - EXPECT_TRUE(renderFactory != nullptr); - - DSRenderEngine *renderEngine = renderFactory->createDSRenderEngine(); - EXPECT_TRUE(renderEngine != nullptr); - DSRenderSurface *renderSurface = renderFactory->createDSRenderSurface(); - EXPECT_TRUE(renderSurface != nullptr); - DSRenderView *renderView = renderFactory->createDSRenderView(); - EXPECT_TRUE(renderView != nullptr); - - delete renderView; - delete renderSurface; - delete renderEngine; - delete renderFactory; -} diff --git a/tests/meson.build b/tests/meson.build index fe400da..f09eed5 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -3,8 +3,8 @@ libds_tests_srcs = [ 'DSRefBase-test.cpp', 'DSProperty-test.cpp', 'DSBufferTBMImpl-test.cpp', - 'DSRenderFactoryEcoreEvasImpl-test.cpp', - 'DSRenderFactoryDaliImpl-test.cpp', + 'DSRenderEngineEcoreEvasImpl-test.cpp', + 'DSRenderEngineDaliImpl-test.cpp', 'DSCompositor-test.cpp', 'DSOutput-test.cpp', 'DSInput-test.cpp', @@ -27,7 +27,7 @@ ecore_dep = dependency('ecore', method : 'pkg-config') executable( 'libds-tests', libds_tests_srcs, - dependencies : [libds_declared_dep, gmock_dep, ecore_dep], + dependencies : [libds_declared_dep, gmock_dep, ecore_dep, ecore_evas_dep], install_dir : libds_prefix_bindir, install : true ) -- 2.7.4 From dd3e7d2cd0aa1fa20c43ab552df18b37f2df1c82 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 18:03:10 +0900 Subject: [PATCH 08/16] DSDisplay: create the DSDisplayDeviceOutputTDMImpl at DSDisplayDeviceTDMImpl constructor. Change-Id: Ic5a6cfa0787bff6f8ab0d9cbd4d901b88fad9279 --- src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp | 29 +++++++++++--------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp index 66e35e5..2255542 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp @@ -9,43 +9,38 @@ DSDisplayDeviceTDMImpl::DSDisplayDeviceTDMImpl() : __numOutputs(0) { tdm_error terror; + tdm_output *toutput; + IDSDisplayDeviceOutput *deviceOutput; __tdisplay = tdm_display_init(&terror); if (terror != TDM_ERROR_NONE) { DSLOG_ERR("TDM DEVICE", "tdm_display_init fails.\n"); } -} - -DSDisplayDeviceTDMImpl::~DSDisplayDeviceTDMImpl() -{ - tdm_display_deinit(__tdisplay); -} - -std::list DSDisplayDeviceTDMImpl::getOutputList() -{ - tdm_error terror; - tdm_output *toutput; - IDSDisplayDeviceOutput *deviceOutput; terror = tdm_display_get_output_count(__tdisplay, &__numOutputs); if (__numOutputs <= 0) { DSLOG_ERR("TDM DEVICE", "tdm_display_get_output_count fails.\n"); - return __outputList; + return; } for (int i = 0; i < __numOutputs; ++i) { toutput = tdm_display_get_output(__tdisplay, i, &terror); if (terror != TDM_ERROR_NONE) { DSLOG_ERR("TDM DEVICE", "tdm_display_get_output fails.(output num: %d)\n", i); - return __outputList; + return; } deviceOutput = new DSDisplayDeviceOutputTDMImpl(toutput); __outputList.emplace_back(deviceOutput); - - // emit the output added signal - this->__outputAddedSignal.emit(deviceOutput); } +} +DSDisplayDeviceTDMImpl::~DSDisplayDeviceTDMImpl() +{ + tdm_display_deinit(__tdisplay); +} + +std::list DSDisplayDeviceTDMImpl::getOutputList() +{ return __outputList; } -- 2.7.4 From 9c794281aca9d3e932b270ddeb742ea2eb499705 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 18:07:40 +0900 Subject: [PATCH 09/16] test: change the DSDisplayDeviceOutput callback tests. Change-Id: I5339242dceebba463f209d279466d8947ef92e1d --- tests/DSDisplayDeviceTDMImpl-test.cpp | 48 ++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/tests/DSDisplayDeviceTDMImpl-test.cpp b/tests/DSDisplayDeviceTDMImpl-test.cpp index 4255d9d..a7080ac 100644 --- a/tests/DSDisplayDeviceTDMImpl-test.cpp +++ b/tests/DSDisplayDeviceTDMImpl-test.cpp @@ -189,35 +189,41 @@ public: TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputConnected) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - std::unique_ptr displayDeviceOutput = std::make_unique(); - - displayDeviceOutput->registerCallbackOutputConnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputConnected, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputConnected(); - - EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputConnected); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); + for (IDSDisplayDeviceOutput *output : outputList) { + std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); + DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + displayDeviceOutput->registerCallbackOutputConnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputConnected, mockDisplayDeviceOutput, std::placeholders::_1)); + displayDeviceOutput->callCallbackOutputConnected(); + EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputConnected); + } } TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputDisconnected) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - std::unique_ptr displayDeviceOutput = std::make_unique(); - - displayDeviceOutput->registerCallbackOutputDisconnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputDisconnected, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputDisconnected(); - - EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputDisconnected); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); + for (IDSDisplayDeviceOutput *output : outputList) { + std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); + DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + displayDeviceOutput->registerCallbackOutputDisconnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputDisconnected, mockDisplayDeviceOutput, std::placeholders::_1)); + displayDeviceOutput->callCallbackOutputDisconnected(); + EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputDisconnected); + } } TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputResolutionSet) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - std::unique_ptr displayDeviceOutput = std::make_unique(); - - displayDeviceOutput->registerCallbackOutputResolutionSet(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputResolutionSet, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputResolutionSet(); - - EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputResolutionSet); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); + for (IDSDisplayDeviceOutput *output : outputList) { + std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); + DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + displayDeviceOutput->registerCallbackOutputResolutionSet(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputResolutionSet, mockDisplayDeviceOutput, std::placeholders::_1)); + displayDeviceOutput->callCallbackOutputResolutionSet(); + EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputResolutionSet); + } } // DSDisplayDeviceTDMHWC -- 2.7.4 From 33abe8bed1cf284063cf7331c7f363ef7da9732c Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 2 Jul 2020 19:07:52 +0900 Subject: [PATCH 10/16] test: change the smart pointer in DSDisplayDeviceTDMImpl tests Change-Id: I1c089bd6419b3e15d519fc4a32a5106cf6bf8cc4 --- tests/DSDisplayDeviceTDMImpl-test.cpp | 50 +++++++++++++---------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/tests/DSDisplayDeviceTDMImpl-test.cpp b/tests/DSDisplayDeviceTDMImpl-test.cpp index a7080ac..ec75a9e 100644 --- a/tests/DSDisplayDeviceTDMImpl-test.cpp +++ b/tests/DSDisplayDeviceTDMImpl-test.cpp @@ -43,41 +43,37 @@ public: TEST_F(DSDisplayDeviceTDMImplTest, Device_New) { - DSDisplayDeviceTDMImpl *dispayDeviceTDM = new DSDisplayDeviceTDMImpl; - EXPECT_TRUE(dispayDeviceTDM != nullptr); - - delete dispayDeviceTDM; + std::unique_ptr displayDevice = std::make_unique(); + EXPECT_TRUE(displayDevice != nullptr); } TEST_F(DSDisplayDeviceTDMImplTest, Device_getOutputList) { - IDSDisplayDevice *dispayDevice = new DSDisplayDeviceTDMImpl; - std::list outputList = dispayDevice->getOutputList(); + std::unique_ptr displayDevice = std::make_unique(); + EXPECT_TRUE(displayDevice != nullptr); + std::list outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); - - delete dispayDevice; } TEST_F(DSDisplayDeviceTDMImplTest, Device_OutputAdded) { + std::unique_ptr displayDevice = std::make_unique(); std::shared_ptr mockDisplayDevice = std::make_shared(); - std::unique_ptr displayDevice = std::make_unique(); - displayDevice->registerCallbackOutputAdded(mockDisplayDevice.get(), std::bind(&MockDisplayDevice::outputAdded, mockDisplayDevice, std::placeholders::_1)); - displayDevice->callCallbackOutputAdded(); + std::unique_ptr displayDeviceTDM(static_cast(displayDevice.release())); // down-casting of std::unique_ptr + displayDeviceTDM->callCallbackOutputAdded(); EXPECT_TRUE(mockDisplayDevice->flagOutputAdded); } TEST_F(DSDisplayDeviceTDMImplTest, Device_OutputRemoved) { - //MockDisplayDevice *mockDisplayDevice = new MockDisplayDevice; + std::unique_ptr displayDevice = std::make_unique(); std::shared_ptr mockDisplayDevice = std::make_shared(); - std::unique_ptr displayDevice = std::make_unique(); - displayDevice->registerCallbackOutputRemoved(mockDisplayDevice.get(), std::bind(&MockDisplayDevice::outputRemoved, mockDisplayDevice, std::placeholders::_1)); - displayDevice->callCallbackOutputRemoved(); + std::unique_ptr displayDeviceTDM(static_cast(displayDevice.release())); // down-casting of std::unique_ptr + displayDeviceTDM->callCallbackOutputAdded(); EXPECT_TRUE(mockDisplayDevice->flagOutputRemoved); } @@ -85,8 +81,8 @@ TEST_F(DSDisplayDeviceTDMImplTest, Device_OutputRemoved) TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_getInitialValues) { - IDSDisplayDevice *dispayDevice = new DSDisplayDeviceTDMImpl; - std::list outputList = dispayDevice->getOutputList(); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -117,14 +113,12 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_getInitialValues) EXPECT_TRUE(output->getHWC() != nullptr); } } - - delete dispayDevice; } TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_setModeBestResolution) { - IDSDisplayDevice *dispayDevice = new DSDisplayDeviceTDMImpl; - std::list outputList = dispayDevice->getOutputList(); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -156,8 +150,6 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_setModeBestResolution) EXPECT_TRUE(output->setMode(bestMode) == true); EXPECT_TRUE(output->getMode() == bestMode); } - - delete dispayDevice; } class MockDisplayDeviceOutput : public DSObject @@ -230,8 +222,8 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputResolution TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) { - IDSDisplayDevice *dispayDevice = new DSDisplayDeviceTDMImpl; - std::list outputList = dispayDevice->getOutputList(); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -254,14 +246,12 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) deviceHWC->destroyHWCWindow(deviceHWCWindow); } - - delete dispayDevice; } TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) { - IDSDisplayDevice *dispayDevice = new DSDisplayDeviceTDMImpl; - std::list outputList = dispayDevice->getOutputList(); + std::unique_ptr displayDevice = std::make_unique(); + std::list outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -287,6 +277,4 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) deviceHWC->destroyHWCWindow(deviceHWCWindow); } - - delete dispayDevice; } \ No newline at end of file -- 2.7.4 From 370b19b9ab55472912b2882894bbc76becc3a035 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 08:17:13 +0900 Subject: [PATCH 11/16] DSDisplayDevice: make the pointers related to IDSDisplayDeviceOutput into the smart pointer Change-Id: I3462edb81c090c6d8f951083948ed705caf04a5e --- .../DSDisplayDeviceOutputTDMImpl.cpp | 12 ++--- src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h | 14 ++--- src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp | 11 ++-- src/DSDisplayDevice/DSDisplayDeviceTDMImpl.h | 12 ++--- src/DSDisplayDevice/IDSDisplayDevice.h | 6 +-- src/DSDisplayDevice/IDSDisplayDeviceOutput.h | 6 +-- tests/DSDisplayDeviceTDMImpl-test.cpp | 61 ++++++++++++---------- 7 files changed, 62 insertions(+), 60 deletions(-) diff --git a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp index 0cfde74..97d46d3 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp @@ -248,34 +248,34 @@ void DSDisplayDeviceOutputTDMImpl::__updateAvailableModeList() } } -void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputConnected(DSObject *slot, std::function func) +void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputConnected(DSObject *slot, std::function)> func) { this->__connectedSignal.connect(slot, func); } -void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputDisconnected(DSObject *slot, std::function func) +void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputDisconnected(DSObject *slot, std::function)> func) { this->__disconnectedSignal.connect(slot, func); } -void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputResolutionSet(DSObject *slot, std::function func) +void DSDisplayDeviceOutputTDMImpl::registerCallbackOutputResolutionSet(DSObject *slot, std::function)> func) { this->__resolutionSetSignal.connect(slot, func); } void DSDisplayDeviceOutputTDMImpl::callCallbackOutputConnected() { - this->__connectedSignal.emit(this); + this->__connectedSignal.emit(shared_from_this()); } void DSDisplayDeviceOutputTDMImpl::callCallbackOutputDisconnected() { - this->__disconnectedSignal.emit(this); + this->__disconnectedSignal.emit(shared_from_this()); } void DSDisplayDeviceOutputTDMImpl::callCallbackOutputResolutionSet() { - this->__resolutionSetSignal.emit(this); + this->__resolutionSetSignal.emit(shared_from_this()); } } // namespace display_server diff --git a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h index 82dba0d..042cc23 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h @@ -8,7 +8,7 @@ namespace display_server { -class DSDisplayDeviceOutputTDMImpl : public IDSDisplayDeviceOutput +class DSDisplayDeviceOutputTDMImpl : public IDSDisplayDeviceOutput, public std::enable_shared_from_this { public: DSDisplayDeviceOutputTDMImpl(); @@ -29,9 +29,9 @@ public: IDSDisplayDeviceHWC *getHWC() override; // register callback functions - void registerCallbackOutputConnected(DSObject *slot, std::function func) override; - void registerCallbackOutputDisconnected(DSObject *slot, std::function func) override; - void registerCallbackOutputResolutionSet(DSObject *slot, std::function func) override; + void registerCallbackOutputConnected(DSObject *slot, std::function)> func) override; + void registerCallbackOutputDisconnected(DSObject *slot, std::function)> func) override; + void registerCallbackOutputResolutionSet(DSObject *slot, std::function)> func) override; // emit functions void callCallbackOutputConnected(); @@ -58,9 +58,9 @@ private: IDSDisplayDeviceHWC *__displayDeviceHWC; // signals - DSSignal __connectedSignal; - DSSignal __disconnectedSignal; - DSSignal __resolutionSetSignal; + DSSignal> __connectedSignal; + DSSignal> __disconnectedSignal; + DSSignal> __resolutionSetSignal; }; } diff --git a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp index 2255542..7dccce7 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp @@ -10,7 +10,6 @@ DSDisplayDeviceTDMImpl::DSDisplayDeviceTDMImpl() { tdm_error terror; tdm_output *toutput; - IDSDisplayDeviceOutput *deviceOutput; __tdisplay = tdm_display_init(&terror); if (terror != TDM_ERROR_NONE) { @@ -29,8 +28,8 @@ DSDisplayDeviceTDMImpl::DSDisplayDeviceTDMImpl() DSLOG_ERR("TDM DEVICE", "tdm_display_get_output fails.(output num: %d)\n", i); return; } - deviceOutput = new DSDisplayDeviceOutputTDMImpl(toutput); - __outputList.emplace_back(deviceOutput); + + __outputList.emplace_back(std::make_shared(toutput)); } } @@ -39,17 +38,17 @@ DSDisplayDeviceTDMImpl::~DSDisplayDeviceTDMImpl() tdm_display_deinit(__tdisplay); } -std::list DSDisplayDeviceTDMImpl::getOutputList() +std::list> DSDisplayDeviceTDMImpl::getOutputList() { return __outputList; } -void DSDisplayDeviceTDMImpl::registerCallbackOutputAdded(DSObject *slot, std::function func) +void DSDisplayDeviceTDMImpl::registerCallbackOutputAdded(DSObject *slot, std::function)> func) { this->__outputAddedSignal.connect(slot, func); } -void DSDisplayDeviceTDMImpl::registerCallbackOutputRemoved(DSObject *slot, std::function func) +void DSDisplayDeviceTDMImpl::registerCallbackOutputRemoved(DSObject *slot, std::function)> func) { this->__outputRemovedSignal.connect(slot, func); } diff --git a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.h b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.h index 3bf9a16..df4bc05 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.h @@ -14,11 +14,11 @@ public: DSDisplayDeviceTDMImpl(); ~DSDisplayDeviceTDMImpl(); - std::list getOutputList() override; + std::list> getOutputList() override; // register callback functions - void registerCallbackOutputAdded(DSObject *slot, std::function func) override; - void registerCallbackOutputRemoved(DSObject *slot, std::function func) override; + void registerCallbackOutputAdded(DSObject *slot, std::function)> func) override; + void registerCallbackOutputRemoved(DSObject *slot, std::function)> func) override; // emit functions void callCallbackOutputAdded(); @@ -27,11 +27,11 @@ public: private: tdm_display *__tdisplay; int __numOutputs; - std::list __outputList; + std::list> __outputList; // signals - DSSignal __outputAddedSignal; - DSSignal __outputRemovedSignal; + DSSignal> __outputAddedSignal; + DSSignal> __outputRemovedSignal; }; } diff --git a/src/DSDisplayDevice/IDSDisplayDevice.h b/src/DSDisplayDevice/IDSDisplayDevice.h index ea03a3e..1d4257f 100644 --- a/src/DSDisplayDevice/IDSDisplayDevice.h +++ b/src/DSDisplayDevice/IDSDisplayDevice.h @@ -12,9 +12,9 @@ class IDSDisplayDevice : public DSObject public: virtual ~IDSDisplayDevice() = default; - virtual std::list getOutputList() = 0; - virtual void registerCallbackOutputAdded(DSObject *slot, std::function func) = 0; - virtual void registerCallbackOutputRemoved(DSObject *slot, std::function func) = 0; + virtual std::list> getOutputList() = 0; + virtual void registerCallbackOutputAdded(DSObject *slot, std::function)> func) = 0; + virtual void registerCallbackOutputRemoved(DSObject *slot, std::function)> func) = 0; }; } diff --git a/src/DSDisplayDevice/IDSDisplayDeviceOutput.h b/src/DSDisplayDevice/IDSDisplayDeviceOutput.h index 8c4ce70..84e1a7a 100644 --- a/src/DSDisplayDevice/IDSDisplayDeviceOutput.h +++ b/src/DSDisplayDevice/IDSDisplayDeviceOutput.h @@ -75,9 +75,9 @@ public: virtual IDSDisplayDeviceHWC *getHWC() = 0; // Callback methods - virtual void registerCallbackOutputConnected(DSObject *slot, std::function func) = 0; - virtual void registerCallbackOutputDisconnected(DSObject *slot, std::function func) = 0; - virtual void registerCallbackOutputResolutionSet(DSObject *slot, std::function func) = 0; + virtual void registerCallbackOutputConnected(DSObject *slot, std::function)> func) = 0; + virtual void registerCallbackOutputDisconnected(DSObject *slot, std::function)> func) = 0; + virtual void registerCallbackOutputResolutionSet(DSObject *slot, std::function)> func) = 0; }; } diff --git a/tests/DSDisplayDeviceTDMImpl-test.cpp b/tests/DSDisplayDeviceTDMImpl-test.cpp index ec75a9e..d7166ce 100644 --- a/tests/DSDisplayDeviceTDMImpl-test.cpp +++ b/tests/DSDisplayDeviceTDMImpl-test.cpp @@ -29,11 +29,11 @@ public: ~MockDisplayDevice() {} - void outputAdded(IDSDisplayDeviceOutput *output) { + void outputAdded(std::shared_ptr output) { flagOutputAdded = true; } - void outputRemoved(IDSDisplayDeviceOutput *output) { + void outputRemoved(std::shared_ptr output) { flagOutputRemoved = true; } @@ -51,7 +51,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, Device_getOutputList) { std::unique_ptr displayDevice = std::make_unique(); EXPECT_TRUE(displayDevice != nullptr); - std::list outputList = displayDevice->getOutputList(); + std::list> outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); } @@ -82,13 +82,13 @@ TEST_F(DSDisplayDeviceTDMImplTest, Device_OutputRemoved) TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_getInitialValues) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); + std::list> outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; - for (IDSDisplayDeviceOutput *output : outputList) { + for (std::shared_ptr output : outputList) { connType = output->getConnectType(); EXPECT_TRUE(connType <= IDSDisplayDeviceOutput::TYPE_DSI); connState = output->getConnectState(); @@ -118,14 +118,14 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_getInitialValues) TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_setModeBestResolution) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); + std::list> outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; DSDisplayDeviceOutputMode *bestMode; - for (IDSDisplayDeviceOutput *output : outputList) { + for (std::shared_ptr output : outputList) { connType = output->getConnectType(); EXPECT_TRUE(connType <= IDSDisplayDeviceOutput::TYPE_DSI); connState = output->getConnectState(); @@ -162,15 +162,15 @@ public: {} ~MockDisplayDeviceOutput() = default; - void outputConnected(IDSDisplayDeviceOutput *deviceOuptut) { + void outputConnected(std::shared_ptr displayDeviceOuptut) { flagOutputConnected = true; } - void outputDisconnected(IDSDisplayDeviceOutput *deviceOuptut) { + void outputDisconnected(std::shared_ptr displayDeviceOuptut) { flagOutputDisconnected = true; } - void outputResolutionSet(IDSDisplayDeviceOutput *deviceOuptut) { + void outputResolutionSet(std::shared_ptr displayDeviceOuptut) { flagOutputResolutionSet = true; } @@ -182,12 +182,13 @@ public: TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputConnected) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); - for (IDSDisplayDeviceOutput *output : outputList) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + auto outputList = displayDevice->getOutputList(); + for (auto displayDeviceOutput : outputList) { + auto mockDisplayDeviceOutput = std::make_shared(); displayDeviceOutput->registerCallbackOutputConnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputConnected, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputConnected(); + + auto displayDeviceOutputTDM = std::dynamic_pointer_cast(displayDeviceOutput); // down-casting of std::shared_ptr + displayDeviceOutputTDM->callCallbackOutputConnected(); EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputConnected); } } @@ -195,12 +196,13 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputConnected) TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputDisconnected) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); - for (IDSDisplayDeviceOutput *output : outputList) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + auto outputList = displayDevice->getOutputList(); + for (auto displayDeviceOutput : outputList) { + auto mockDisplayDeviceOutput = std::make_shared(); displayDeviceOutput->registerCallbackOutputDisconnected(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputDisconnected, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputDisconnected(); + + auto displayDeviceOutputTDM = std::dynamic_pointer_cast(displayDeviceOutput); // down-casting of std::shared_ptr + displayDeviceOutputTDM->callCallbackOutputDisconnected(); EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputDisconnected); } } @@ -208,12 +210,13 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputDisconnect TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputResolutionSet) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); - for (IDSDisplayDeviceOutput *output : outputList) { - std::shared_ptr mockDisplayDeviceOutput = std::make_shared(); - DSDisplayDeviceOutputTDMImpl *displayDeviceOutput = static_cast(output); + auto outputList = displayDevice->getOutputList(); + for (auto displayDeviceOutput : outputList) { + auto mockDisplayDeviceOutput = std::make_shared(); displayDeviceOutput->registerCallbackOutputResolutionSet(mockDisplayDeviceOutput.get(), std::bind(&MockDisplayDeviceOutput::outputResolutionSet, mockDisplayDeviceOutput, std::placeholders::_1)); - displayDeviceOutput->callCallbackOutputResolutionSet(); + + auto displayDeviceOutputTDM = std::dynamic_pointer_cast(displayDeviceOutput); // down-casting of std::shared_ptr + displayDeviceOutputTDM->callCallbackOutputResolutionSet(); EXPECT_TRUE(mockDisplayDeviceOutput->flagOutputResolutionSet); } } @@ -223,7 +226,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputResolution TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); + std::list> outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -231,7 +234,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) IDSDisplayDeviceHWC *deviceHWC; IDSDisplayDeviceHWCWindow *deviceHWCWindow; - for (IDSDisplayDeviceOutput *output : outputList) { + for (std::shared_ptr output : outputList) { connType = output->getConnectType(); EXPECT_TRUE(connType <= IDSDisplayDeviceOutput::TYPE_DSI); connState = output->getConnectState(); @@ -251,7 +254,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) { std::unique_ptr displayDevice = std::make_unique(); - std::list outputList = displayDevice->getOutputList(); + std::list> outputList = displayDevice->getOutputList(); EXPECT_TRUE(outputList.size() != 0); IDSDisplayDeviceOutput::ConnectorType connType; @@ -259,7 +262,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) IDSDisplayDeviceHWC *deviceHWC; IDSDisplayDeviceHWCWindow *deviceHWCWindow; - for (IDSDisplayDeviceOutput *output : outputList) { + for (std::shared_ptr output : outputList) { connType = output->getConnectType(); EXPECT_TRUE(connType <= IDSDisplayDeviceOutput::TYPE_DSI); connState = output->getConnectState(); -- 2.7.4 From c1ed89a4a64cc9df9a3fda6663dfd98541b48388 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 08:44:31 +0900 Subject: [PATCH 12/16] DSDisplayDevice: make IDSDisplayDeviceHWC be the smart pointer Change-Id: I070b97b3c949680fd71fa99c90d0ee06667f6866 --- src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp | 5 ++--- src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h | 4 ++-- src/DSDisplayDevice/IDSDisplayDeviceOutput.h | 2 +- tests/DSDisplayDeviceTDMImpl-test.cpp | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp index 97d46d3..bfdb287 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp @@ -42,7 +42,7 @@ DSDisplayDeviceOutputTDMImpl::DSDisplayDeviceOutputTDMImpl(tdm_output *toutput) thwc = tdm_output_get_hwc(toutput, &terror); if (thwc) { - __displayDeviceHWC = new DSDisplayDeviceHWCTDMImpl(thwc); + __displayDeviceHWC = std::make_shared(thwc); } else { //TODO: need fallback for HWC DSLOG_WRN("TDM OUTPUT", "tdm_output_get_hwc fails.\n"); @@ -51,7 +51,6 @@ DSDisplayDeviceOutputTDMImpl::DSDisplayDeviceOutputTDMImpl(tdm_output *toutput) DSDisplayDeviceOutputTDMImpl::~DSDisplayDeviceOutputTDMImpl() { - delete __displayDeviceHWC; __deleteAvailableModeList(); } @@ -121,7 +120,7 @@ IDSDisplayDeviceOutput::DPMSMode DSDisplayDeviceOutputTDMImpl::getDPMSMode() return __dpmsMode; } -IDSDisplayDeviceHWC *DSDisplayDeviceOutputTDMImpl::getHWC() +std::shared_ptr DSDisplayDeviceOutputTDMImpl::getHWC() { return __displayDeviceHWC; } diff --git a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h index 042cc23..7baf670 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.h @@ -26,7 +26,7 @@ public: DSDisplayDeviceOutputMode *getMode() override; bool setDPMSMode(IDSDisplayDeviceOutput::DPMSMode dpmsMode) override; DPMSMode getDPMSMode() override; - IDSDisplayDeviceHWC *getHWC() override; + std::shared_ptr getHWC() override; // register callback functions void registerCallbackOutputConnected(DSObject *slot, std::function)> func) override; @@ -55,7 +55,7 @@ private: DSDisplayDeviceOutputMode *__mode; IDSDisplayDeviceOutput::DPMSMode __dpmsMode; - IDSDisplayDeviceHWC *__displayDeviceHWC; + std::shared_ptr __displayDeviceHWC; // signals DSSignal> __connectedSignal; diff --git a/src/DSDisplayDevice/IDSDisplayDeviceOutput.h b/src/DSDisplayDevice/IDSDisplayDeviceOutput.h index 84e1a7a..2da0ca6 100644 --- a/src/DSDisplayDevice/IDSDisplayDeviceOutput.h +++ b/src/DSDisplayDevice/IDSDisplayDeviceOutput.h @@ -72,7 +72,7 @@ public: virtual DSDisplayDeviceOutputMode *getMode() = 0; virtual bool setDPMSMode(DPMSMode dpmsMode) = 0; virtual DPMSMode getDPMSMode() = 0; - virtual IDSDisplayDeviceHWC *getHWC() = 0; + virtual std::shared_ptr getHWC() = 0; // Callback methods virtual void registerCallbackOutputConnected(DSObject *slot, std::function)> func) = 0; diff --git a/tests/DSDisplayDeviceTDMImpl-test.cpp b/tests/DSDisplayDeviceTDMImpl-test.cpp index d7166ce..eb6875c 100644 --- a/tests/DSDisplayDeviceTDMImpl-test.cpp +++ b/tests/DSDisplayDeviceTDMImpl-test.cpp @@ -231,7 +231,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; - IDSDisplayDeviceHWC *deviceHWC; + std::shared_ptr deviceHWC; IDSDisplayDeviceHWCWindow *deviceHWCWindow; for (std::shared_ptr output : outputList) { @@ -259,7 +259,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; - IDSDisplayDeviceHWC *deviceHWC; + std::shared_ptr deviceHWC; IDSDisplayDeviceHWCWindow *deviceHWCWindow; for (std::shared_ptr output : outputList) { -- 2.7.4 From 8211d272700c26b0681185b80b6529cc7f1b76f9 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 13:38:27 +0900 Subject: [PATCH 13/16] DSDebug: add function name and end line at log macro Change-Id: I05044625498492c6cc484d5d3a880c1ddc8bb497 --- src/DSDebug/DSDebugLog.cpp | 4 +++- src/DSDebug/DSDebugLog.h | 10 +++++----- tests/DSDebugLog-test.cpp | 16 ++++++++-------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/DSDebug/DSDebugLog.cpp b/src/DSDebug/DSDebugLog.cpp index 21c26d3..877eb89 100644 --- a/src/DSDebug/DSDebugLog.cpp +++ b/src/DSDebug/DSDebugLog.cpp @@ -31,7 +31,7 @@ DSDebugLog *DSDebugLog::GetInstance() return mInstance; } -void DSDebugLog::printLog(int logLevel, const char *fmt, ...) +void DSDebugLog::printLog(int logLevel, const char *funcName, const char *fmt, ...) { //TODO: apply logLevel //TODO: use dlog or stdout @@ -43,7 +43,9 @@ void DSDebugLog::printLog(int logLevel, const char *fmt, ...) va_start(arg, fmt); printf("%s", color[logLevel]); printf("[%s]", lvl_str[logLevel]); + printf(":[%s]", funcName); vprintf(fmt, arg); + printf("\n"); va_end(arg); } diff --git a/src/DSDebug/DSDebugLog.h b/src/DSDebug/DSDebugLog.h index 2530221..775130f 100644 --- a/src/DSDebug/DSDebugLog.h +++ b/src/DSDebug/DSDebugLog.h @@ -22,7 +22,7 @@ public: void operator=(const DSDebugLog &) = delete; // should not be assignable static DSDebugLog *GetInstance(); - void printLog(int logLevel, const char *fmt, ...); + void printLog(int logLevel, const char *funcName, const char *fmt, ...); int getLogLevel(); private: @@ -37,28 +37,28 @@ private: #define DSLOG_DBG(domain, fmt, args...) \ do { \ DSDebugLog *log = DSDebugLog::GetInstance(); \ - log->printLog(DSDebugLog::LOG_LEVEL_DEBUG, "[" domain "]: " fmt, \ + log->printLog(DSDebugLog::LOG_LEVEL_DEBUG, __func__, "[" domain "]: " fmt, \ ##args); \ } while (0) #define DSLOG_INF(domain, fmt, args...) \ do { \ DSDebugLog *log = DSDebugLog::GetInstance(); \ - log->printLog(DSDebugLog::LOG_LEVEL_INFO, "[" domain "]: " fmt, \ + log->printLog(DSDebugLog::LOG_LEVEL_INFO, __func__, "[" domain "]: " fmt, \ ##args); \ } while (0) #define DSLOG_WRN(domain, fmt, args...) \ do { \ DSDebugLog *log = DSDebugLog::GetInstance(); \ - log->printLog(DSDebugLog::LOG_LEVEL_WARN, "[" domain "]: " fmt, \ + log->printLog(DSDebugLog::LOG_LEVEL_WARN, __func__, "[" domain "]: " fmt, \ ##args); \ } while (0) #define DSLOG_ERR(domain, fmt, args...) \ do { \ DSDebugLog *log = DSDebugLog::GetInstance(); \ - log->printLog(DSDebugLog::LOG_LEVEL_ERR, "[" domain "]: " fmt, \ + log->printLog(DSDebugLog::LOG_LEVEL_ERR, __func__, "[" domain "]: " fmt, \ ##args); \ } while (0) } diff --git a/tests/DSDebugLog-test.cpp b/tests/DSDebugLog-test.cpp index 6fc7d8d..b86456d 100644 --- a/tests/DSDebugLog-test.cpp +++ b/tests/DSDebugLog-test.cpp @@ -23,10 +23,10 @@ TEST_F(DSDebugLogTest, PrintLog) const char *str = "Hi world"; DSDebugLog *log = DSDebugLog::GetInstance(); - log->printLog(DSDebugLog::LOG_LEVEL_DEBUG, "Hello world\n"); - log->printLog(DSDebugLog::LOG_LEVEL_INFO, "%s\n", str); - log->printLog(DSDebugLog::LOG_LEVEL_WARN, "Greeting world\n"); - log->printLog(DSDebugLog::LOG_LEVEL_ERR, "Hey world\n"); + log->printLog(DSDebugLog::LOG_LEVEL_DEBUG, __func__, "Hello world"); + log->printLog(DSDebugLog::LOG_LEVEL_INFO, __func__, "%s", str); + log->printLog(DSDebugLog::LOG_LEVEL_WARN, __func__, "Greeting world"); + log->printLog(DSDebugLog::LOG_LEVEL_ERR, __func__, "Hey world"); EXPECT_TRUE(true); } @@ -35,10 +35,10 @@ TEST_F(DSDebugLogTest, LogMacros) { const char *str = "Hi world"; - DSLOG_DBG("DSTEST", "Hello world\n"); - DSLOG_INF("DSTEST", "%s\n", str); - DSLOG_WRN("DSTEST", "Greeting world\n"); - DSLOG_ERR("DSTEST", "Hey world\n"); + DSLOG_DBG("DSTEST", "Hello world"); + DSLOG_INF("DSTEST", "%s", str); + DSLOG_WRN("DSTEST", "Greeting world"); + DSLOG_ERR("DSTEST", "Hey world"); EXPECT_TRUE(true); } \ No newline at end of file -- 2.7.4 From 01fc6c5a1e37bdb3973de7a5dc7eff14758c09d3 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 14:51:20 +0900 Subject: [PATCH 14/16] DSBuffer: add getTBMFormat method Change-Id: I1654e409a19f536d05df7dd1cd304ef00fb5c70a --- src/DSBuffer/DSBufferTBMImpl.cpp | 17 ++++++++++++++++- src/DSBuffer/DSBufferTBMImpl.h | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/DSBuffer/DSBufferTBMImpl.cpp b/src/DSBuffer/DSBufferTBMImpl.cpp index ef9014e..9a3dc9c 100644 --- a/src/DSBuffer/DSBufferTBMImpl.cpp +++ b/src/DSBuffer/DSBufferTBMImpl.cpp @@ -32,7 +32,7 @@ void *DSBufferTBMImpl::getNativeBuffer() return (void *)__tsurface; } -tbm_format DSBufferTBMImpl::getTBMFormat(IDSBuffer::Format &format) +tbm_format DSBufferTBMImpl::getTBMFormat(const IDSBuffer::Format &format) { tbm_format tformat = 0; // what is the error format? @@ -47,4 +47,19 @@ tbm_format DSBufferTBMImpl::getTBMFormat(IDSBuffer::Format &format) return tformat; } +IDSBuffer::Format DSBufferTBMImpl::getBufferFormat(const tbm_format &tformat) +{ + IDSBuffer::Format format = IDSBuffer::Format::FORMAT_ARGB8888; + + switch (tformat) { + case TBM_FORMAT_ARGB8888 : + format = IDSBuffer::Format::FORMAT_ARGB8888 ; + break; + default: + DSLOG_ERR("DSBufferTBM", "(%d) format is not supported.\n", tformat); + } + + return format; +} + } diff --git a/src/DSBuffer/DSBufferTBMImpl.h b/src/DSBuffer/DSBufferTBMImpl.h index 5c821af..6427d6a 100644 --- a/src/DSBuffer/DSBufferTBMImpl.h +++ b/src/DSBuffer/DSBufferTBMImpl.h @@ -16,7 +16,9 @@ public: void *getNativeBuffer() override; - static tbm_format getTBMFormat(IDSBuffer::Format &format); + static tbm_format getTBMFormat(const IDSBuffer::Format &format); + static IDSBuffer::Format getBufferFormat(const tbm_format &tformat); + private: int __width; int __height; -- 2.7.4 From e011f2d1b81621a1ce024419bf4e279f5c4dce06 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 15:06:28 +0900 Subject: [PATCH 15/16] DSBuffer: add DSBufferQueueTBMImpl constructor with tbm_surface_queue_h Change-Id: Ib67a22936a5be6166e96ae742be8575177f8678f --- src/DSBuffer/DSBufferQueueTBMImpl.cpp | 8 ++++++++ src/DSBuffer/DSBufferQueueTBMImpl.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.cpp b/src/DSBuffer/DSBufferQueueTBMImpl.cpp index 91d3f70..d4e35d8 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.cpp +++ b/src/DSBuffer/DSBufferQueueTBMImpl.cpp @@ -18,6 +18,14 @@ DSBufferQueueTBMImpl::DSBufferQueueTBMImpl(int slotSize, int bufferWidth, int bu } } +DSBufferQueueTBMImpl::DSBufferQueueTBMImpl(tbm_surface_queue_h tqueue) + : __slotSize{tbm_surface_queue_get_size(tqueue)}, + __bufferWidth{tbm_surface_queue_get_width(tqueue)}, + __bufferHeight{tbm_surface_queue_get_height(tqueue)}, + __format{DSBufferTBMImpl::getBufferFormat(tbm_surface_queue_get_format(tqueue))}, + __tqueue{tqueue} +{} + DSBufferQueueTBMImpl::~DSBufferQueueTBMImpl() { __bufferVector.erase(__bufferVector.begin(), __bufferVector.end()); diff --git a/src/DSBuffer/DSBufferQueueTBMImpl.h b/src/DSBuffer/DSBufferQueueTBMImpl.h index 1da8ae0..a4e06e3 100644 --- a/src/DSBuffer/DSBufferQueueTBMImpl.h +++ b/src/DSBuffer/DSBufferQueueTBMImpl.h @@ -12,6 +12,7 @@ class DSBufferQueueTBMImpl : public IDSBufferQueue { public: DSBufferQueueTBMImpl(int slotSize, int bufferWidth, int bufferHeight, IDSBuffer::Format format); + DSBufferQueueTBMImpl(tbm_surface_queue_h tqueue); ~DSBufferQueueTBMImpl(); int getBufferWidth() override; -- 2.7.4 From 277e317899677f24d21fc4211c7934e69e295c9e Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 Jul 2020 15:13:25 +0900 Subject: [PATCH 16/16] DSDisplayDevice: implement HWC functions. Change-Id: I664b763358926f1575f42c122072035e7ca8c366 --- src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.cpp | 200 +++++++++++++++------ src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.h | 18 +- .../DSDisplayDeviceHWCWindowTDMImpl.cpp | 6 +- .../DSDisplayDeviceHWCWindowTDMImpl.h | 3 +- .../DSDisplayDeviceOutputTDMImpl.cpp | 2 +- src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp | 12 ++ src/DSDisplayDevice/IDSDisplayDeviceHWC.h | 14 +- tests/DSDisplayDeviceTDMImpl-test.cpp | 41 +++-- 8 files changed, 216 insertions(+), 80 deletions(-) diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.cpp index d8b17c7..f7b1cce 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.cpp @@ -2,71 +2,149 @@ #include "DSDisplayDeviceHWCTDMImpl.h" #include "DSDisplayDeviceHWCWindowTDMImpl.h" #include "DSDebugLog.h" +#include namespace display_server { + DSDisplayDeviceHWCTDMImpl::DSDisplayDeviceHWCTDMImpl(tdm_hwc *thwc) - : __thwc(thwc) + : __thwc(thwc), + __bufferQueue(nullptr) +{} + +DSDisplayDeviceHWCTDMImpl::~DSDisplayDeviceHWCTDMImpl() +{ + clearVisibleHWCWindows(); +} + +std::shared_ptr DSDisplayDeviceHWCTDMImpl::getTargetBufferQueue() { + tdm_error terror; + tbm_surface_queue_h tqueue; + + if (__bufferQueue) { + DSLOG_INF("TDM_HWC", "return the existed IDSBufferQueue."); + return __bufferQueue; + } + + tqueue = tdm_hwc_get_client_target_buffer_queue(__thwc, &terror); + if (terror != TDM_ERROR_NONE) { + DSLOG_ERR("HWCTDM", "tdm_hwc_get_client_target_buffer_queue fails.\n"); + } + __bufferQueue = std::make_shared(tqueue); + + return __bufferQueue; } -DSDisplayDeviceHWCTDMImpl::~DSDisplayDeviceHWCTDMImpl() + +bool DSDisplayDeviceHWCTDMImpl::setTargetBuffer(std::shared_ptr buffer) { + tdm_error terror; + tdm_region fb_damage; + std::memset(&fb_damage, 0, sizeof (tdm_region)); + + terror = tdm_hwc_set_client_target_buffer(__thwc, (tbm_surface_h)buffer->getNativeBuffer(), fb_damage); + if (terror != TDM_ERROR_NONE) { + DSLOG_ERR("TDM_HWC", "tdm_hwc_set_client_target_buffer fails."); + return false; + } + return true; } -IDSDisplayDeviceHWCWindow *DSDisplayDeviceHWCTDMImpl::createHWCWindow() +std::shared_ptr DSDisplayDeviceHWCTDMImpl::makeHWCWindow() { + std::shared_ptr deviceHWCWindow; tdm_error terror; tdm_hwc_window *twindow; - IDSDisplayDeviceHWCWindow *deviceHWCWindow; twindow = tdm_hwc_create_window(__thwc, &terror); if (!twindow) { - DSLOG_ERR("TDM HWCWindow", "tdm_hwc_create_window fails.\n"); + DSLOG_ERR("HWCTDM", "tdm_hwc_create_window fails.\n"); return nullptr; } - deviceHWCWindow = new DSDisplayDeviceHWCWindowTDMImpl(twindow); + deviceHWCWindow = std::make_shared(twindow); if (!deviceHWCWindow) { - DSLOG_ERR("TDM HWCWindow", "new DSDisplayDeviceHWCWindowTDMImpl fails.\n"); + DSLOG_ERR("HWCTDM", "new DSDisplayDeviceHWCWindowTDMImpl fails.\n"); return nullptr; } - __deviceHWCWindowList.push_back(deviceHWCWindow); - return deviceHWCWindow; } -void DSDisplayDeviceHWCTDMImpl::destroyHWCWindow(IDSDisplayDeviceHWCWindow *deviceHWCWindow) +bool DSDisplayDeviceHWCTDMImpl::addVisibleHWCWindow(std::shared_ptr deviceHWCWindow) +{ + __visibleDeviceHWCWindowList.push_back(deviceHWCWindow); + + return true; +} + +bool DSDisplayDeviceHWCTDMImpl::removeVisibleHWCWindow(std::shared_ptr deviceHWCWindow) +{ + __visibleDeviceHWCWindowList.remove(deviceHWCWindow); + + return true; +} + +void DSDisplayDeviceHWCTDMImpl::clearVisibleHWCWindows() { - delete deviceHWCWindow; - __deviceHWCWindowList.remove(deviceHWCWindow); + __visibleDeviceHWCWindowList.clear(); } bool DSDisplayDeviceHWCTDMImpl::commit() { tdm_error terror; - int numVisibleHWCWins = __deviceHWCWindowList.size(); //TODO: need to fix. change it to visible windows list. __deviceHWCWindowList is not the visible window list. - DSDisplayDeviceHWCWindowTDMImpl *hwcWinsImpl; - uint32_t numTypes; + uint32_t numChanges; - // get the thwc_windows to request validate. + if (!__validate(numChanges)) { + DSLOG_ERR("HWCTDM", "__validate fails.\n"); + return false; + } + + if (numChanges > 0) { + if (!__updateChanges(numChanges)) { + DSLOG_ERR("HWCTDM", "__updateChanges fails.\n"); + return false; + } + } + + if (!__acceptValidation()) { + DSLOG_ERR("HWCTDM", "__acceptValidation fails.\n"); + return false; + } + + //TODO: tdm_hwc_commit + terror = tdm_hwc_commit(__thwc, 0, NULL, NULL); + if (terror != TDM_ERROR_NONE) { + DSLOG_ERR("HWCTDM", "tdm_hwc_commit fails."); + return false; + } + + return true; +} + +bool DSDisplayDeviceHWCTDMImpl::__validate(uint32_t &numChanges) +{ + int numVisibleHWCWins = __visibleDeviceHWCWindowList.size(); + tdm_error terror; tdm_hwc_window **thwc_windows; + int i = 0; + + // get the thwc_windows to request validate. thwc_windows = (tdm_hwc_window **)calloc(numVisibleHWCWins, sizeof(tdm_hwc_window *)); if (thwc_windows == nullptr) { DSLOG_ERR("TDM_HWC", "calloc thwc_windows fails."); return false; } - int i = 0; - for (auto *hwcwins : __deviceHWCWindowList) { - hwcWinsImpl = (DSDisplayDeviceHWCWindowTDMImpl *)hwcwins; - thwc_windows[i++] = hwcWinsImpl->getTDMHWCWindow(); + for (auto &&deviceHWCWindow : __visibleDeviceHWCWindowList) { + auto deviceHWCWindowTDM = std::dynamic_pointer_cast(deviceHWCWindow); + thwc_windows[i++] = deviceHWCWindowTDM->getNativeHWCWindow(); } // validate thwc_windows - terror = tdm_hwc_validate(__thwc, thwc_windows, numVisibleHWCWins, &numTypes); + terror = tdm_hwc_validate(__thwc, thwc_windows, numVisibleHWCWins, &numChanges); if (terror != TDM_ERROR_NONE) { DSLOG_ERR("TDM_HWC", "tdm_hwc_validate fails."); free(thwc_windows); @@ -75,56 +153,60 @@ bool DSDisplayDeviceHWCTDMImpl::commit() free(thwc_windows); - // get changed_types + return true; +} + +bool DSDisplayDeviceHWCTDMImpl::__updateChanges(uint32_t numChanges) +{ + tdm_error terror; tdm_hwc_window **changed_thwc_window = NULL; tdm_hwc_window_composition *tcomposition_types = NULL; - uint32_t numChanges = 0; - if (numTypes > 0) { - changed_thwc_window = (tdm_hwc_window **)calloc(numTypes, sizeof(tdm_hwc_window *)); - if (changed_thwc_window == nullptr) { - DSLOG_ERR("TDM_HWC", "calloc changed_thwc_window fails."); - return false; - } - - tcomposition_types = (tdm_hwc_window_composition *)calloc(numTypes, sizeof(tdm_hwc_window_composition)); - if (tcomposition_types == nullptr) { - DSLOG_ERR("TDM_HWC", "calloc changed_thwc_window fails."); - free(changed_thwc_window); - return false; - } - - terror = tdm_hwc_get_changed_composition_types(__thwc, &numChanges, changed_thwc_window, tcomposition_types); - if (terror != TDM_ERROR_NONE) { - DSLOG_ERR("TDM_HWC", "tdm_hwc_get_changed_composition_types fails."); - free(tcomposition_types); - free(changed_thwc_window); - return false; - } + int i; - for (i = 0; i < (int)numChanges; ++i) { - //TODO: change the TYPES of HWCWindows - } + changed_thwc_window = (tdm_hwc_window **)calloc(numChanges, sizeof(tdm_hwc_window *)); + if (changed_thwc_window == nullptr) { + DSLOG_ERR("TDM_HWC", "calloc changed_thwc_window fails."); + return false; + } - // TODO: accept_validation is depending on the transitions. - terror = tdm_hwc_accept_validation(__thwc); - if (terror != TDM_ERROR_NONE) { - DSLOG_ERR("TDM_HWC", "tdm_hwc_accept_validation fails."); - free(tcomposition_types); - free(changed_thwc_window); - return false; - } + // get changed_types + tcomposition_types = (tdm_hwc_window_composition *)calloc(numChanges, sizeof(tdm_hwc_window_composition)); + if (tcomposition_types == nullptr) { + DSLOG_ERR("TDM_HWC", "calloc changed_thwc_window fails."); + free(changed_thwc_window); + return false; + } + terror = tdm_hwc_get_changed_composition_types(__thwc, &numChanges, changed_thwc_window, tcomposition_types); + if (terror != TDM_ERROR_NONE) { + DSLOG_ERR("TDM_HWC", "tdm_hwc_get_changed_composition_types fails."); free(tcomposition_types); free(changed_thwc_window); + return false; } - //TODO: tdm_hwc_commit - terror = tdm_hwc_commit(__thwc, 0, NULL, NULL); + for (i = 0; i < (int)numChanges; ++i) { + //TODO: change the TYPES of HWCWindows + } + + free(tcomposition_types); + free(changed_thwc_window); + + return true; +} + +bool DSDisplayDeviceHWCTDMImpl::__acceptValidation() +{ + tdm_error terror; + + // TODO: accept_validation is depending on the transitions. + terror = tdm_hwc_accept_validation(__thwc); if (terror != TDM_ERROR_NONE) { - DSLOG_ERR("TDM_HWC", "tdm_hwc_commit fails."); + DSLOG_ERR("TDM_HWC", "tdm_hwc_accept_validation fails.\n"); return false; } return true; } -} \ No newline at end of file + +} diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.h b/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.h index cd266e7..ba1daaf 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCTDMImpl.h @@ -2,6 +2,7 @@ #define _DS_DISPLAY_DEVICE_HWC_TDM_IMPL_H_ #include "IDSDisplayDeviceHWC.h" +#include "DSBufferQueueTBMImpl.h" #include #include @@ -13,13 +14,22 @@ public: DSDisplayDeviceHWCTDMImpl(tdm_hwc *thwc); ~DSDisplayDeviceHWCTDMImpl(); - IDSDisplayDeviceHWCWindow *createHWCWindow() override; - void destroyHWCWindow(IDSDisplayDeviceHWCWindow *deviceHWCWindow) override; - bool commit() override; + std::shared_ptr getTargetBufferQueue() override; + bool setTargetBuffer(std::shared_ptr buffer) override; + std::shared_ptr makeHWCWindow() override; + bool addVisibleHWCWindow(std::shared_ptr deviceHWCWindow) override; + bool removeVisibleHWCWindow(std::shared_ptr deviceHWCWindow) override; + void clearVisibleHWCWindows() override; + bool commit() override; private: tdm_hwc *__thwc; - std::list __deviceHWCWindowList; + std::shared_ptr __bufferQueue; + std::list> __visibleDeviceHWCWindowList; + + bool __validate(uint32_t &numChanges); + bool __updateChanges(uint32_t numChanges); + bool __acceptValidation(); }; } diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.cpp index 7fcf260..3fde0ef 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.cpp @@ -8,8 +8,10 @@ DSDisplayDeviceHWCWindowTDMImpl::DSDisplayDeviceHWCWindowTDMImpl(tdm_hwc_window : __twindow(twindow) {} DSDisplayDeviceHWCWindowTDMImpl::~DSDisplayDeviceHWCWindowTDMImpl() -{} -tdm_hwc_window *DSDisplayDeviceHWCWindowTDMImpl::getTDMHWCWindow() +{ + tdm_hwc_window_destroy(__twindow); +} +tdm_hwc_window *DSDisplayDeviceHWCWindowTDMImpl::getNativeHWCWindow() { return __twindow; } diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.h b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.h index 43facd9..d4d9bbf 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMImpl.h @@ -11,10 +11,11 @@ class DSDisplayDeviceHWCWindowTDMImpl : public IDSDisplayDeviceHWCWindow public: DSDisplayDeviceHWCWindowTDMImpl(tdm_hwc_window *twindow); ~DSDisplayDeviceHWCWindowTDMImpl(); - tdm_hwc_window *getTDMHWCWindow(); + tdm_hwc_window *getNativeHWCWindow(); private: tdm_hwc_window* __twindow; }; + } #endif diff --git a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp index bfdb287..ed1e9c9 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceOutputTDMImpl.cpp @@ -45,7 +45,7 @@ DSDisplayDeviceOutputTDMImpl::DSDisplayDeviceOutputTDMImpl(tdm_output *toutput) __displayDeviceHWC = std::make_shared(thwc); } else { //TODO: need fallback for HWC - DSLOG_WRN("TDM OUTPUT", "tdm_output_get_hwc fails.\n"); + DSLOG_WRN("TDM OUTPUT", "tdm_output_get_hwc fails."); } } diff --git a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp index 7dccce7..c950704 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceTDMImpl.cpp @@ -1,5 +1,6 @@ #include "DSDisplayDeviceTDMImpl.h" #include "DSDisplayDeviceOutputTDMImpl.h" +#include "DSDisplayDeviceHWCTDMImpl.h" #include "DSDebugLog.h" namespace display_server @@ -35,6 +36,17 @@ DSDisplayDeviceTDMImpl::DSDisplayDeviceTDMImpl() DSDisplayDeviceTDMImpl::~DSDisplayDeviceTDMImpl() { + // Clear the visible hwc windows before tdm_display_deinit. + // Otherwise, the process will block inside libtdm + // when it calls tdm_hwc_window_destroy() function at ~DSDisplayDeviceHWCWindowTDMImpl() + // because the mutex_lock(private_display->lock) is destroyed at tdm_display_deinit(). + for (auto displayDeviceOutput: __outputList) { + std::shared_ptr displayDeviceHWC = displayDeviceOutput->getHWC(); + if (displayDeviceHWC) { + displayDeviceHWC->clearVisibleHWCWindows(); + } + } + tdm_display_deinit(__tdisplay); } diff --git a/src/DSDisplayDevice/IDSDisplayDeviceHWC.h b/src/DSDisplayDevice/IDSDisplayDeviceHWC.h index 995ee57..154b4d7 100644 --- a/src/DSDisplayDevice/IDSDisplayDeviceHWC.h +++ b/src/DSDisplayDevice/IDSDisplayDeviceHWC.h @@ -2,18 +2,26 @@ #define _I_DS_DISPLAY_DEVICE_HWC_H_ #include "IDSDisplayDeviceHWCWindow.h" +#include "IDSBufferQueue.h" +#include namespace display_server { + class IDSDisplayDeviceHWC { public: virtual ~IDSDisplayDeviceHWC() = default; - virtual IDSDisplayDeviceHWCWindow *createHWCWindow() = 0; - virtual void destroyHWCWindow(IDSDisplayDeviceHWCWindow *deviceHWCWindow) = 0; - virtual bool commit() = 0; + virtual std::shared_ptr getTargetBufferQueue() = 0; + virtual bool setTargetBuffer(std::shared_ptr buffer) = 0; + virtual std::shared_ptr makeHWCWindow() = 0; + virtual bool addVisibleHWCWindow(std::shared_ptr deviceHWCWindow) = 0; + virtual bool removeVisibleHWCWindow(std::shared_ptr deviceHWCWindow) = 0; + virtual void clearVisibleHWCWindows() = 0; + virtual bool commit() = 0; }; + } #endif diff --git a/tests/DSDisplayDeviceTDMImpl-test.cpp b/tests/DSDisplayDeviceTDMImpl-test.cpp index eb6875c..b8cf18e 100644 --- a/tests/DSDisplayDeviceTDMImpl-test.cpp +++ b/tests/DSDisplayDeviceTDMImpl-test.cpp @@ -223,7 +223,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_registerCallbackOutputResolution // DSDisplayDeviceTDMHWC -TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) +TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_makeHWCWindow) { std::unique_ptr displayDevice = std::make_unique(); std::list> outputList = displayDevice->getOutputList(); @@ -232,7 +232,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; std::shared_ptr deviceHWC; - IDSDisplayDeviceHWCWindow *deviceHWCWindow; + std::shared_ptr deviceHWCWindow; for (std::shared_ptr output : outputList) { connType = output->getConnectType(); @@ -244,10 +244,8 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceOutput_createHWCWindow) deviceHWC = output->getHWC(); EXPECT_TRUE(deviceHWC != nullptr); - deviceHWCWindow = deviceHWC->createHWCWindow(); + deviceHWCWindow = deviceHWC->makeHWCWindow(); EXPECT_TRUE(deviceHWC != nullptr); - - deviceHWC->destroyHWCWindow(deviceHWCWindow); } } @@ -260,7 +258,7 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) IDSDisplayDeviceOutput::ConnectorType connType; IDSDisplayDeviceOutput::ConnectState connState; std::shared_ptr deviceHWC; - IDSDisplayDeviceHWCWindow *deviceHWCWindow; + std::shared_ptr deviceHWCWindow; for (std::shared_ptr output : outputList) { connType = output->getConnectType(); @@ -269,15 +267,38 @@ TEST_F(DSDisplayDeviceTDMImplTest, DeviceHWC_commit) EXPECT_TRUE(connState <= IDSDisplayDeviceOutput::STATE_MODESET); if (connState == IDSDisplayDeviceOutput::STATE_DISCONNECTED) continue; + DSDisplayDeviceOutputMode *bestMode = nullptr; + for (DSDisplayDeviceOutputMode *mode : output->getAvailableModes()) { + if (bestMode == nullptr) { + bestMode = mode; + continue; + } + + int resSize = mode->hdisplay * mode->vdisplay; + int resSizeBest = bestMode->hdisplay *bestMode->vdisplay; + if (resSize > resSizeBest) { + bestMode = mode; + } + } + EXPECT_TRUE(output->setMode(bestMode) == true); + EXPECT_TRUE(output->getMode() == bestMode); + deviceHWC = output->getHWC(); EXPECT_TRUE(deviceHWC != nullptr); - deviceHWCWindow = deviceHWC->createHWCWindow(); + auto bufferQueue = deviceHWC->getTargetBufferQueue(); EXPECT_TRUE(deviceHWC != nullptr); - // commit - deviceHWC->commit(); + deviceHWCWindow = deviceHWC->makeHWCWindow(); + EXPECT_TRUE(deviceHWC != nullptr); + EXPECT_TRUE(deviceHWC->addVisibleHWCWindow(deviceHWCWindow)); + + auto buffer = bufferQueue->dequeueBuffer(); + EXPECT_TRUE(buffer != nullptr); - deviceHWC->destroyHWCWindow(deviceHWCWindow); + EXPECT_TRUE(deviceHWC->setTargetBuffer(buffer)); + + // commit + EXPECT_TRUE(deviceHWC->commit()); } } \ No newline at end of file -- 2.7.4