From: Changyeon Lee Date: Fri, 31 Jul 2020 07:42:26 +0000 (+0900) Subject: DSBuffer: add DSBufferRef class X-Git-Tag: accepted/tizen/unified/20200820.213435~170 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F05%2F241705%2F1;p=platform%2Fcore%2Fuifw%2Flibds.git DSBuffer: add DSBufferRef class DSBufferRef can reference of DSBuffer. if reference of DSBuffer is zero, release event of wl_buffer is sent to client. Change-Id: Icf3fb96433ef3234533feaec77c0bb6735bd3aee --- diff --git a/src/DSBuffer/DSBufferRef.cpp b/src/DSBuffer/DSBufferRef.cpp new file mode 100644 index 0000000..2f8e7ac --- /dev/null +++ b/src/DSBuffer/DSBufferRef.cpp @@ -0,0 +1,41 @@ +#include "DSBufferRef.h" +#include "DSBufferRefPrivate.h" +#include "DSDebugLog.h" + +namespace display_server +{ + +DSBufferRef::DSBufferRef(std::shared_ptr dsBuffer) + : DSObject(std::make_unique(this, dsBuffer)) +{} + +DSBufferRef::~DSBufferRef() +{} + +std::shared_ptr DSBufferRef::refDSBufferGet() +{ + DS_GET_PRIV(DSBufferRef); + + return priv->refDSBufferGet(); +} + +DSBufferRefPrivate::DSBufferRefPrivate(DSBufferRef *p_ptr, std::shared_ptr dsBuffer) + : DSObjectPrivate(p_ptr), + __p_ptr(p_ptr), + __dsBuffer(dsBuffer) +{ + __dsBuffer->ref(); +} + +DSBufferRefPrivate::~DSBufferRefPrivate() +{ + if (__dsBuffer) + __dsBuffer->unref(); +} + +std::shared_ptr DSBufferRefPrivate::refDSBufferGet() +{ + return __dsBuffer; +} + +} // namespace display_server diff --git a/src/DSBuffer/DSBufferRef.h b/src/DSBuffer/DSBufferRef.h new file mode 100644 index 0000000..27ab348 --- /dev/null +++ b/src/DSBuffer/DSBufferRef.h @@ -0,0 +1,25 @@ +#ifndef __DS_BUFFER_REF_H__ +#define __DS_BUFFER_REF_H__ + +#include +#include +#include + +namespace display_server +{ + +class DSBufferRefPrivate; + +class DSBufferRef : public DSObject +{ +DS_PIMPL_USE_PRIVATE(DSBufferRef); +public: + explicit DSBufferRef(std::shared_ptr dsBuffer); + virtual ~DSBufferRef(); + + std::shared_ptr refDSBufferGet(); +}; + +} + +#endif diff --git a/src/DSBuffer/DSBufferRefPrivate.h b/src/DSBuffer/DSBufferRefPrivate.h new file mode 100644 index 0000000..a429880 --- /dev/null +++ b/src/DSBuffer/DSBufferRefPrivate.h @@ -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 dsBuffer); + + ~DSBufferRefPrivate(); + + std::shared_ptr refDSBufferGet(); + +private: + std::shared_ptr __dsBuffer; +}; + +} + +#endif diff --git a/src/DSWaylandServer/DSWaylandSurface.cpp b/src/DSWaylandServer/DSWaylandSurface.cpp index 1832bdc..b2da42a 100644 --- a/src/DSWaylandServer/DSWaylandSurface.cpp +++ b/src/DSWaylandServer/DSWaylandSurface.cpp @@ -32,14 +32,16 @@ DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr) : DSObjectPrivate(p_ptr), __p_ptr(p_ptr), __commitInfoPending{std::make_unique()}, - __commitInfo{std::make_shared()} + __commitInfo{std::make_shared()}, + __bufferManager{DSBufferManager::getInstance()} {} DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr, DSWaylandClient *waylandClient, uint32_t id) : DSObjectPrivate(p_ptr), __p_ptr(p_ptr), __commitInfoPending{std::make_unique()}, - __commitInfo{std::make_shared()} + __commitInfo{std::make_shared()}, + __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 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(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); diff --git a/src/DSWaylandServer/DSWaylandSurfacePrivate.h b/src/DSWaylandServer/DSWaylandSurfacePrivate.h index f5bbbd9..7ec1267 100644 --- a/src/DSWaylandServer/DSWaylandSurfacePrivate.h +++ b/src/DSWaylandServer/DSWaylandSurfacePrivate.h @@ -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 bufferRef; struct attach attach; struct damageSurface { @@ -79,6 +82,7 @@ protected: private: std::unique_ptr __commitInfoPending; std::shared_ptr __commitInfo; + DSBufferManager *__bufferManager; }; } /*namespace display_server */ diff --git a/src/meson.build b/src/meson.build index 9c7c9ce..cd97d4a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -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 index 0000000..45a8a5f --- /dev/null +++ b/tests/DSBufferRef-test.cpp @@ -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 buffer = std::make_unique(100, 100, IDSBuffer::FORMAT_ARGB8888); + EXPECT_TRUE(buffer.get() != nullptr); + + std::shared_ptr bufferRef = std::make_shared(buffer); + EXPECT_TRUE(bufferRef.get() != nullptr); +} diff --git a/tests/meson.build b/tests/meson.build index 8285f19..3edee89 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -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',