DSBuffer: add DSBufferRef class 05/241705/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 31 Jul 2020 07:42:26 +0000 (16:42 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 20 Aug 2020 10:05:05 +0000 (19:05 +0900)
DSBufferRef can reference of DSBuffer.
if reference of DSBuffer is zero, release event of wl_buffer is sent
to client.

Change-Id: Icf3fb96433ef3234533feaec77c0bb6735bd3aee

src/DSBuffer/DSBufferRef.cpp [new file with mode: 0644]
src/DSBuffer/DSBufferRef.h [new file with mode: 0644]
src/DSBuffer/DSBufferRefPrivate.h [new file with mode: 0644]
src/DSWaylandServer/DSWaylandSurface.cpp
src/DSWaylandServer/DSWaylandSurfacePrivate.h
src/meson.build
tests/DSBufferRef-test.cpp [new file with mode: 0644]
tests/meson.build

diff --git a/src/DSBuffer/DSBufferRef.cpp b/src/DSBuffer/DSBufferRef.cpp
new file mode 100644 (file)
index 0000000..2f8e7ac
--- /dev/null
@@ -0,0 +1,41 @@
+#include "DSBufferRef.h"
+#include "DSBufferRefPrivate.h"
+#include "DSDebugLog.h"
+
+namespace display_server
+{
+
+DSBufferRef::DSBufferRef(std::shared_ptr<IDSBuffer> dsBuffer)
+       : DSObject(std::make_unique<DSBufferRefPrivate>(this, dsBuffer))
+{}
+
+DSBufferRef::~DSBufferRef()
+{}
+
+std::shared_ptr<IDSBuffer> DSBufferRef::refDSBufferGet()
+{
+       DS_GET_PRIV(DSBufferRef);
+
+       return priv->refDSBufferGet();
+}
+
+DSBufferRefPrivate::DSBufferRefPrivate(DSBufferRef *p_ptr, std::shared_ptr<IDSBuffer> dsBuffer)
+       : DSObjectPrivate(p_ptr),
+         __p_ptr(p_ptr),
+         __dsBuffer(dsBuffer)
+{
+       __dsBuffer->ref();
+}
+
+DSBufferRefPrivate::~DSBufferRefPrivate()
+{
+       if (__dsBuffer)
+               __dsBuffer->unref();
+}
+
+std::shared_ptr<IDSBuffer> DSBufferRefPrivate::refDSBufferGet()
+{
+       return __dsBuffer;
+}
+
+} // namespace display_server
diff --git a/src/DSBuffer/DSBufferRef.h b/src/DSBuffer/DSBufferRef.h
new file mode 100644 (file)
index 0000000..27ab348
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef __DS_BUFFER_REF_H__
+#define __DS_BUFFER_REF_H__
+
+#include <DSCore.h>
+#include <DSObject.h>
+#include <IDSBuffer.h>
+
+namespace display_server
+{
+
+class DSBufferRefPrivate;
+
+class DSBufferRef : public DSObject
+{
+DS_PIMPL_USE_PRIVATE(DSBufferRef);
+public:
+       explicit DSBufferRef(std::shared_ptr<IDSBuffer> dsBuffer);
+       virtual ~DSBufferRef();
+
+       std::shared_ptr<IDSBuffer> refDSBufferGet();
+};
+
+}
+
+#endif
diff --git a/src/DSBuffer/DSBufferRefPrivate.h b/src/DSBuffer/DSBufferRefPrivate.h
new file mode 100644 (file)
index 0000000..a429880
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef __DS_BUFFER_REF_PRIVATE_H__
+#define __DS_BUFFER_REF_PRIVATE_H__
+
+#include "DSBufferRef.h"
+
+namespace display_server
+{
+
+class DSBufferRefPrivate : public DSObjectPrivate
+{
+       DS_PIMPL_USE_PUBLIC(DSBufferRef);
+public:
+       DSBufferRefPrivate() = delete;
+       DSBufferRefPrivate(DSBufferRef *p_ptr, std::shared_ptr<IDSBuffer> dsBuffer);
+
+       ~DSBufferRefPrivate();
+
+       std::shared_ptr<IDSBuffer> refDSBufferGet();
+
+private:
+       std::shared_ptr<IDSBuffer> __dsBuffer;
+};
+
+}
+
+#endif
index 1832bdc..b2da42a 100644 (file)
@@ -32,14 +32,16 @@ DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr)
        : DSObjectPrivate(p_ptr),
          __p_ptr(p_ptr),
          __commitInfoPending{std::make_unique<DSWaylandSurfaceCommitInfo>()},
-         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()}
+         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()},
+         __bufferManager{DSBufferManager::getInstance()}
 {}
 
 DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr, DSWaylandClient *waylandClient, uint32_t id)
        : DSObjectPrivate(p_ptr),
          __p_ptr(p_ptr),
          __commitInfoPending{std::make_unique<DSWaylandSurfaceCommitInfo>()},
-         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()}
+         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()},
+         __bufferManager{DSBufferManager::getInstance()}
 {
        if (id > 0) {
                wl_surface::init(waylandClient->wlClient(), (int)id, 4);
@@ -64,10 +66,14 @@ void DSWaylandSurfacePrivate::surface_destroy(Resource *resource)
 void DSWaylandSurfacePrivate::surface_attach(Resource *resource, struct ::wl_resource *buffer, int32_t x, int32_t y)
 {
        DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+       std::shared_ptr<IDSBuffer> dsBuffer = __bufferManager->getDSBuffer(buffer);
 
        commitInfoPendingPriv->attach.x = x;
        commitInfoPendingPriv->attach.y = y;
        commitInfoPendingPriv->attach.buffer = buffer;
+
+       commitInfoPendingPriv->bufferRef.reset(nullptr);
+       commitInfoPendingPriv->bufferRef = std::make_unique<DSBufferRef>(dsBuffer);
 }
 
 void DSWaylandSurfacePrivate::surface_damage(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
@@ -108,6 +114,7 @@ void DSWaylandSurfacePrivate::surface_commit(Resource *resource)
        commitInfoPriv->transform = commitInfoPendingPriv->transform;
        commitInfoPriv->scale = commitInfoPendingPriv->scale;
        commitInfoPriv->damageBuffer = commitInfoPendingPriv->damageBuffer;
+       commitInfoPriv->bufferRef = std::move(commitInfoPendingPriv->bufferRef);
 
        // emit a signal of the surface committed
        pub->__surfaceCommittedSignal.emit(__commitInfo);
index f5bbbd9..7ec1267 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "dswayland-server-wayland.h"
 #include "DSWaylandSurface.h"
+#include "DSBufferManager.h"
+#include "DSBufferRef.h"
 
 namespace display_server
 {
@@ -28,6 +30,7 @@ public:
                int32_t y;
                struct ::wl_resource *buffer;
        };
+       std::unique_ptr<DSBufferRef> bufferRef;
        struct attach attach;
 
        struct damageSurface {
@@ -79,6 +82,7 @@ protected:
 private:
        std::unique_ptr<DSWaylandSurfaceCommitInfo> __commitInfoPending;
        std::shared_ptr<DSWaylandSurfaceCommitInfo> __commitInfo;
+       DSBufferManager *__bufferManager;
 };
 
 } /*namespace display_server */
index 9c7c9ce..cd97d4a 100644 (file)
@@ -7,6 +7,9 @@ libds_srcs = [
        'DSBuffer/DSBufferManager.cpp',
        'DSBuffer/DSBufferManager.h',
        'DSBuffer/DSBufferManagerPrivate.h',
+       'DSBuffer/DSBufferRef.cpp',
+       'DSBuffer/DSBufferRef.h',
+       'DSBuffer/DSBufferRefPrivate.h',
        'DSCallback/DSCallback.h',
        'DSCanvas/DSCanvas.cpp',
        'DSCompositor/DSCompositor.cpp',
diff --git a/tests/DSBufferRef-test.cpp b/tests/DSBufferRef-test.cpp
new file mode 100644 (file)
index 0000000..45a8a5f
--- /dev/null
@@ -0,0 +1,24 @@
+#include "libds-tests.h"
+#include "IDSBuffer.h"
+#include "DSBufferRef.h"
+#include "DSBufferTBMImpl.h"
+
+using namespace display_server;
+
+class DSBufferRefTest : public ::testing::Test
+{
+public:
+       void SetUp(void) override
+       {}
+       void TearDown(void) override
+       {}
+};
+
+TEST_F(DSBufferRefTest, CreateBufferRef)
+{
+       std::shared_ptr<IDSBuffer> buffer = std::make_unique<DSBufferTBMImpl>(100, 100, IDSBuffer::FORMAT_ARGB8888);
+       EXPECT_TRUE(buffer.get() != nullptr);
+
+       std::shared_ptr<DSBufferRef> bufferRef = std::make_shared<DSBufferRef>(buffer);
+       EXPECT_TRUE(bufferRef.get() != nullptr);
+}
index 8285f19..3edee89 100644 (file)
@@ -3,6 +3,7 @@ libds_tests_srcs = [
        'DSRefBase-test.cpp',
        'DSProperty-test.cpp',
        'DSBufferTBMImpl-test.cpp',
+       'DSBufferRef-test.cpp',
        'DSBufferManager-test.cpp',
        'DSRenderEngineEcoreEvasImpl-test.cpp',
        'DSRenderEngineDaliImpl-test.cpp',