DSBufferRef can reference of DSBuffer.
if reference of DSBuffer is zero, release event of wl_buffer is sent
to client.
Change-Id: Icf3fb96433ef3234533feaec77c0bb6735bd3aee
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
: 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);
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)
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);
#include "dswayland-server-wayland.h"
#include "DSWaylandSurface.h"
+#include "DSBufferManager.h"
+#include "DSBufferRef.h"
namespace display_server
{
int32_t y;
struct ::wl_resource *buffer;
};
+ std::unique_ptr<DSBufferRef> bufferRef;
struct attach attach;
struct damageSurface {
private:
std::unique_ptr<DSWaylandSurfaceCommitInfo> __commitInfoPending;
std::shared_ptr<DSWaylandSurfaceCommitInfo> __commitInfo;
+ DSBufferManager *__bufferManager;
};
} /*namespace display_server */
'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',
--- /dev/null
+#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);
+}
'DSRefBase-test.cpp',
'DSProperty-test.cpp',
'DSBufferTBMImpl-test.cpp',
+ 'DSBufferRef-test.cpp',
'DSBufferManager-test.cpp',
'DSRenderEngineEcoreEvasImpl-test.cpp',
'DSRenderEngineDaliImpl-test.cpp',