Fix dump code
authorHeeJu Kang <mobum.kang@samsung.com>
Mon, 20 May 2013 06:48:59 +0000 (15:48 +0900)
committerHeeJu Kang <mobum.kang@samsung.com>
Mon, 20 May 2013 06:48:59 +0000 (15:48 +0900)
Change-Id: Ic6c428e6a99d8285c04bdaef42ee7c915d8094a5
Signed-off-by: HeeJu Kang <mobum.kang@samsung.com>
src/FShell_AppWidgetBuffer.cpp
src/FShell_AppWidgetBuffer.h
src/FShell_AppWidgetLayer.cpp
src/FShell_AppWidgetViewManager.cpp
src/FShell_AppWidgetViewManager.h

index 8b38a84..4b5fdd1 100644 (file)
@@ -202,11 +202,28 @@ _AppWidgetBuffer::GetXImage(void) const
        return __pBuffer->GetXImage();
 }
 
+Pixmap
+_AppWidgetBuffer::GetPixmap(void) const
+{
+       SysTryReturn(NID_SHELL, __pBuffer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+
+       return __pBuffer->GetPixmap();
+}
+
+void
+_AppWidgetBuffer::Dump(void)
+{
+       SysTryReturnVoidResult(NID_SHELL, __pBuffer, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+
+       return __pBuffer->Dump();
+}
+
 _AppWidgetBuffer::_Buffer::_Buffer(_AppWidgetBuffer* pAppWidgetBuffer)
        : __locked(false)
        , __pixmap(0)
        , __depth(sizeof(int))
        , __pAppWidgetBuffer(pAppWidgetBuffer)
+       , __dumpFileIndex(0)
        , __gc(null)
        , __pXImage(null)
 {
@@ -266,6 +283,59 @@ _AppWidgetBuffer::_Buffer::GetXImage(void) const
        return __pXImage;
 }
 
+Pixmap
+_AppWidgetBuffer::_Buffer::GetPixmap(void) const
+{
+       return __pixmap;
+}
+
+void
+_AppWidgetBuffer::_Buffer::Dump(void)
+{
+       void* pBuffer = null;
+       bool lock = false;
+       if (__locked)
+       {
+               pBuffer = GetBuffer();
+       }
+       else
+       {
+               lock = true;
+               pBuffer = LockBuffer();
+       }
+
+       SysTryReturnVoidResult(NID_SHELL, pBuffer, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+
+       int size = static_cast<int>(__size.width) * static_cast<int>(__size.height) * __depth;
+
+       char fileName[1024];
+       memset(fileName, 0, sizeof(fileName));
+       snprintf(fileName, sizeof(fileName), "./dump%d.raw", __dumpFileIndex++);
+
+       FILE* pFile = fopen(fileName, "w+b");
+       if (pFile)
+       {
+               fwrite(pBuffer, size, 1, pFile);
+               fclose(pFile);
+               SysSecureLog(NID_SHELL, "buffer (0x%x) size (%d) pixmapId (%d)", pBuffer, size, __pixmap);
+       }
+       else
+       {
+               SysSecureLog(NID_SHELL, "File open failed: (%s) buffer (0x%x) size (%d) pixmapId (%d)", strerror(errno), pBuffer, size, __pixmap);
+       }
+
+       if (lock)
+       {
+               UnlockBuffer(); 
+       }
+}
+
+void*
+_AppWidgetBuffer::_Buffer::GetBuffer(void)
+{
+       return OnLockBuffer();
+}
+
 void
 _AppWidgetBuffer::_Buffer::DeleteBuffer(void)
 {
@@ -365,6 +435,12 @@ _AppWidgetBuffer::_Buffer::OnUnlockBuffer(void)
 //     DeleteBuffer();
 }
 
+void*
+_AppWidgetBuffer::_Buffer::OnGetBuffer(void)
+{
+       return __xShmSegmentInfo.shmaddr;
+}
+
 _AppWidgetBuffer::_GemBuffer::_GemBuffer(_AppWidgetBuffer* pAppWidgetBuffer)
        : _Buffer(pAppWidgetBuffer)
        , __pDri2Buffer(null)
@@ -482,4 +558,10 @@ _AppWidgetBuffer::_GemBuffer::OnUnlockBuffer(void)
        __pGemBuffer = null;
 }
 
+void*
+_AppWidgetBuffer::_GemBuffer::OnGetBuffer(void)
+{
+       return __pGemBuffer;
+}
+
 }} // Tizen::Shell
index 07be602..9880fdb 100644 (file)
@@ -68,6 +68,8 @@ public:
        Display* GetDisplay(void) const;
        GC GetGc(void) const;
        XImage* GetXImage(void) const;
+       Pixmap GetPixmap(void) const;
+       void Dump(void);
 
 private:
        _AppWidgetBuffer(const _AppWidgetBuffer& rhs);
@@ -85,15 +87,19 @@ private:
                void UnlockBuffer(void);
                GC GetGc(void) const;
                XImage* GetXImage(void) const;
+               Pixmap GetPixmap(void) const;
+               void Dump(void);
 
        private:
                _Buffer(const _Buffer& rhs);
                _Buffer& operator =(const _Buffer& rhs);
+               void* GetBuffer(void);
                void DeleteBuffer(void);
                virtual void OnCreateBuffer(void);
                virtual void OnDeleteBuffer(void);
                virtual void* OnLockBuffer(void);
                virtual void OnUnlockBuffer(void);
+               virtual void* OnGetBuffer(void);
 
        protected:
                bool __locked;
@@ -103,6 +109,7 @@ private:
                _AppWidgetBuffer* __pAppWidgetBuffer;
 
        private:
+               int __dumpFileIndex;
                GC __gc;
                XImage* __pXImage;
                XShmSegmentInfo __xShmSegmentInfo;
@@ -123,6 +130,7 @@ private:
                virtual void OnDeleteBuffer(void);
                virtual void* OnLockBuffer(void);
                virtual void OnUnlockBuffer(void);
+               virtual void* OnGetBuffer(void);
 
        private:
                DRI2Buffer* __pDri2Buffer;
index ec3b421..daf982d 100644 (file)
@@ -282,6 +282,8 @@ _AppWidgetLayer::OnRendered(void)
                SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
        }
 
+       SysLog(NID_SHELL, "ENTER");
+
        r = Sync(__size);
        SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 }
@@ -375,7 +377,7 @@ _AppWidgetLayer::OnTouchEventRecevied(int eventType, double timestamp, double x,
 void
 _AppWidgetLayer::Flush(void)
 {
-       SysLog(NID_SHELL, "ENTER");
+//     SysLog(NID_SHELL, "ENTER");
 
        bool needed = IsFlushNeeded();
 
@@ -392,10 +394,10 @@ _AppWidgetLayer::Flush(void)
        _EflLayer::Flush();
 
        if (needed)
-       {\r
-               void* pBuffer = const_cast<void*>(ecore_evas_buffer_pixels_get(__pEcoreEvas.get()));\r
-               SysTryReturnVoidResult(NID_SHELL, pBuffer, E_OUT_OF_MEMORY, "[%s] Propagating.", GetErrorMessage(E_OUT_OF_MEMORY));\r
-\r
+       {
+               void* pBuffer = const_cast<void*>(ecore_evas_buffer_pixels_get(__pEcoreEvas.get()));
+               SysTryReturnVoidResult(NID_SHELL, pBuffer, E_OUT_OF_MEMORY, "[%s] Propagating.", GetErrorMessage(E_OUT_OF_MEMORY));
+
                evas_data_argb_unpremul(static_cast<unsigned int*>(pBuffer), __size.width * __size.height);
 
                OnRendered();
index a0c4bda..02f6c2b 100644 (file)
  */
 
 #include <new>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <Ecore_X.h>
 #include <Evas.h>
+#include <Ecore.h>
 extern "C"
 {
-#include <X11/Xproto.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dri2.h>
-#include <tbm_bufmgr.h>
-#include <xf86drm.h>
 #include <elm_config.h>
 }
+
 #include <livebox-service.h>
 #include <livebox.h>
 #include <FBaseColHashMapT.h>
@@ -55,12 +46,12 @@ extern "C"
 #include <FUi_ControlManager.h>
 #include <FUiCtrl_Frame.h>
 #include <FUiCtrl_IFrameEventListener.h>
+#include "FShell_AppWidgetBuffer.h"
 #include "FShell_AppWidgetViewManager.h"
 #include "FShell_AppWidgetView.h"
 #include "FShell_AppWidgetPopupView.h"
 
-//#define _PIXMAP_TEST
-//#define _BUFFER_TEST
+//#define _DUMP_BUFFER
 
 using namespace std;
 using namespace Tizen::Base;
@@ -70,246 +61,6 @@ using namespace Tizen::Media;
 using namespace Tizen::Ui;
 using namespace Tizen::Ui::Controls;
 
-namespace
-{
-
-tbm_bufmgr __pTbmBufmgr = null;
-int __fileCount = 0;
-int __drmFileDescriptor = -1;
-
-void
-dump_bmp(const char* pFileName, const void* pData, int width, int height)
-{
-       FILE* pFile = null;
-
-       struct
-       {
-               unsigned char magic[2];
-       } bmpfile_magic = { {'B', 'M'} };
-
-       struct
-       {
-               unsigned int filesz;
-               unsigned short creator1;
-               unsigned short creator2;
-               unsigned int bmp_offset;
-       } bmpfile_header = { 0, 0, 0, 0x36 };
-
-       struct
-       {
-               unsigned int header_sz;
-               unsigned int width;
-               unsigned int height;
-               unsigned short nplanes;
-               unsigned short bitspp;
-               unsigned int compress_type;
-               unsigned int bmp_bytesz;
-               unsigned int hres;
-               unsigned int vres;
-               unsigned int ncolors;
-               unsigned int nimpcolors;
-       } bmp_dib_v3_header_t = { 0x28, 0, 0, 1, 24, 0, 0, 0, 0, 0, 0 };
-
-       if (pFileName != null)
-       {
-               pFile = fopen(pFileName, "w+");
-       }
-
-       if (pFile == null)
-       {
-               SysSecureLog(NID_UI_CTRL,"Failed to open %s", pFileName);
-               return;
-       }
-
-       bmpfile_header.filesz = sizeof(bmpfile_magic) + sizeof(bmpfile_header) + sizeof(bmp_dib_v3_header_t) + width * height * 3;
-       bmp_dib_v3_header_t.header_sz = sizeof(bmp_dib_v3_header_t);
-       bmp_dib_v3_header_t.width = width;
-       bmp_dib_v3_header_t.height = -height;
-       bmp_dib_v3_header_t.nplanes = 1;
-       bmp_dib_v3_header_t.bmp_bytesz = width * height * 3;
-
-       fwrite(&bmpfile_magic, sizeof(bmpfile_magic), 1, pFile);
-       fwrite(&bmpfile_header, sizeof(bmpfile_header), 1, pFile);
-       fwrite(&bmp_dib_v3_header_t, sizeof(bmp_dib_v3_header_t), 1, pFile);
-
-       unsigned int* pBlocks = (unsigned int*)pData;
-
-       for (int i = 0; i < (height * width); i++)
-       {
-               fwrite(&pBlocks[i], 3, 1, pFile);
-       }
-       
-       fclose(pFile);
-}
-
-struct _Deleter
-{
-       void operator()(char* pStr)
-       {
-               free(pStr);
-       }
-};
-
-tbm_bufmgr
-bufmgr_get(Display* pDisplay, Pixmap pixmap)
-{
-       int screen = DefaultScreen(pDisplay);
-
-       // DRI2
-       int eventBase = 0;
-       int errorBase = 0;
-       if (!DRI2QueryExtension(pDisplay, &eventBase, &errorBase))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryExtension.");
-               return null;
-       }
-
-       int dri2Major = 0;
-       int dri2Minor = 0;
-       if (!DRI2QueryVersion(pDisplay, &dri2Major, &dri2Minor))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryVersion.");
-               return null;
-       }
-
-       char* pDriverNameTemp = null;
-       char* pDeviceNameTemp = null;
-       if (!DRI2Connect(pDisplay, RootWindow(pDisplay, screen), &pDriverNameTemp, &pDeviceNameTemp))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Connect.");
-               return null;
-       }
-
-       unique_ptr<char, _Deleter> pDriverName(pDriverNameTemp);
-       unique_ptr<char, _Deleter> pDeviceName(pDeviceNameTemp);
-
-       // Get the drm_fd though opening the deviceName
-       __drmFileDescriptor = open(pDeviceName.get(), O_RDWR);
-       if (__drmFileDescriptor < 0)
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to open drm device (%s)", pDeviceName.get());
-               return null;
-       }
-
-       // Get the drm magic
-       drm_magic_t magic;
-       drmGetMagic(__drmFileDescriptor, &magic);
-       if (!DRI2Authenticate(pDisplay, RootWindow(pDisplay, screen), magic))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Authenticate.");
-               close(__drmFileDescriptor);
-               __drmFileDescriptor = -1;
-               return null;
-       }
-
-       // tbm buffer manager init
-       tbm_bufmgr bufmgr = tbm_bufmgr_init(__drmFileDescriptor);
-       if (!bufmgr)
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to initialize buffer manager.");
-               close(__drmFileDescriptor);
-               __drmFileDescriptor = -1;
-               return null;
-       }
-
-       DRI2CreateDrawable(pDisplay, pixmap);
-
-       return bufmgr;
-}
-
-static void
-pixmap_update(Display* pDisplay, tbm_bufmgr bufmgr, Pixmap pixmap, int x, int y, int width, int height)
-{
-       int dri2_width = 0;
-       int dri2_height = 0;
-       unsigned int attachments[1] = { DRI2BufferFrontLeft };
-       int dri2_count = 1;
-       int dri2_out_count = 0;
-
-       int opt = TBM_OPTION_READ|TBM_OPTION_WRITE;
-       char imgFile[100] = {0,};
-
-       tbm_bo bo = null;
-       tbm_bo_handle bo_handle;
-       bo_handle.ptr = null;
-
-       DRI2Buffer* pDri2_buffers = DRI2GetBuffers (pDisplay, pixmap, &dri2_width, &dri2_height, attachments, dri2_count, &dri2_out_count);
-       SysTryReturnVoidResult(NID_SHELL, pDri2_buffers != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
-       SysTryLogCatch(NID_UI_CTRL, pDri2_buffers->name != null, , "[E_OUT_OF_MEMORY] Memory is insufficient.");
-
-       bo = tbm_bo_import(bufmgr, pDri2_buffers->name);
-       SysTryLogCatch(NID_UI_CTRL, bo != null, , "Failed to import bo (key : %d).", pDri2_buffers->name);
-
-       bo_handle = tbm_bo_map(bo, TBM_DEVICE_CPU, opt);
-       SysTryLogCatch(NID_UI_CTRL, bo_handle.ptr != null, , "Failed to get map.");
-
-       memset(imgFile, 0, sizeof(imgFile));
-       sprintf(imgFile,"./dump%d.bmp", __fileCount++);
-
-       if (__fileCount == 5 || __fileCount == 20)
-       {
-               dump_bmp(imgFile, bo_handle.ptr, dri2_width, dri2_height);
-       }
-
-CATCH:
-       if (bo_handle.ptr)
-       {
-               tbm_bo_unmap(bo);
-       }
-
-       if (bo)
-       {
-               tbm_bo_unref(bo);
-       }
-
-       if (pDri2_buffers)
-       {
-               free(pDri2_buffers);
-       }
-}
-
-void
-DumpPixmap(int pixmap)
-{
-       int x = 0;
-       int y = 0;
-       int width = 0;
-       int height = 0;
-
-       ecore_x_pixmap_geometry_get(pixmap, &x, &y, &width, &height);
-       SysTryReturnVoidResult(NID_SHELL, (width > 0) && (height > 0), E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid [0x%x %d %d].", pixmap, width , height);
-
-       if (__drmFileDescriptor > -1)
-       {
-               close(__drmFileDescriptor);
-               __drmFileDescriptor = -1;
-       }
-
-       if (__pTbmBufmgr)
-       {
-               tbm_bufmgr_deinit(__pTbmBufmgr);
-               __pTbmBufmgr = null;
-       }
-
-       if (__pTbmBufmgr == null)
-       {
-               __pTbmBufmgr = bufmgr_get((Display*)ecore_x_display_get(), pixmap);
-       }
-
-       if (__pTbmBufmgr != null)
-       {
-               pixmap_update((Display*)ecore_x_display_get(), __pTbmBufmgr, pixmap, 0, 0, width, height);
-       }
-       else
-       {
-               SysSecureLog(NID_UI_CTRL, "can't get pixmap gBufmgr");
-       }
-
-       SysSecureLog(NID_UI_CTRL, "dump pixmap[%d]", pixmap);
-}
-
-}
-
 namespace Tizen { namespace Graphics
 {
 //result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*&, _LogicalResolution, _BaseScreenSize, _PhysicalResolution, _BaseScreenSize);
@@ -485,10 +236,15 @@ _AppWidgetViewManager::GetAppWidgetSizeType(const Tizen::Graphics::FloatDimensio
 
 _AppWidgetViewManager::_AppWidgetViewManager(void)
        : __glMode(false)
+       , __pAppWidgetBuffer(new (std::nothrow) _AppWidgetBuffer)
 {
 //     _LogicalResolution sourceResolution = RESOLUTION_LOGICAL_720;
 //     _PhysicalResolution destResolution = _CoordinateSystem::GetInstance()->GetPhysicalResolution();
 
+#if defined(_DUMP_BUFFER)
+       __pAppWidgetBuffer->Initialize();
+#endif // _DUMP_BUFFER
+
        livebox_init(ecore_x_display_get());
        livebox_subscribe_group("*", "*");
 
@@ -580,26 +336,6 @@ _AppWidgetViewManager::GetBitmapN(void* pBuffer, const FloatDimension& size) con
        const int BITS_PER_PIXEL = 32;
        int length = size.width * size.height * BITS_PER_PIXEL / 8;
 
-#if defined(_BUFFER_TEST)
-       {
-               FILE* pFile = null;
-               static int idx = 0;
-               char filename[1024];
-               snprintf(filename, sizeof(filename), "/tmp/view%d.raw", idx++);
-               pFile = fopen(filename, "w+b");
-               if (pFile)
-               {
-                       fwrite(pBuffer, length, 1, pFile);
-                       fclose(pFile);
-                       SysLog(NID_SHELL, "_BUFFER_TEST: buffer (0x%x) size (%d) width(%f) height(%f)", pBuffer, length, size.width, size.height);
-               }
-               else
-               {
-                       SysLog(NID_SHELL, "File open failed: (%s) buffer (0x%x) size (%d)", strerror(errno), pBuffer, length);
-               }
-       }
-#endif // _BUFFER_TEST
-
        unique_ptr<ByteBuffer> pByteBuffer(new (std::nothrow) ByteBuffer());
        SysTryReturn(NID_SHELL, pByteBuffer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
 
@@ -644,6 +380,32 @@ _AppWidgetViewManager::IsGlMode(void) const
 }
 
 void
+_AppWidgetViewManager::DumpBuffer(unsigned int pixmap)
+{
+       if (__pAppWidgetBuffer->GetPixmap() != pixmap)
+       {
+               int x = 0;
+               int y = 0;
+               int width = 0;
+               int height = 0;
+
+               ecore_x_pixmap_geometry_get(pixmap, &x, &y, &width, &height);
+               SysTryReturnVoidResult(NID_SHELL, (width > 0) && (height > 0), E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid [0x%x %d %d].", pixmap, width , height);
+
+               __pAppWidgetBuffer->DeallocBuffer();
+               __pAppWidgetBuffer->AllocBuffer(pixmap, FloatDimension(width, height));
+               __pAppWidgetBuffer->Dump();
+               __pAppWidgetBuffer->UnlockBuffer();
+       }
+       else
+       {
+               __pAppWidgetBuffer->LockBuffer();
+               __pAppWidgetBuffer->Dump();
+               __pAppWidgetBuffer->UnlockBuffer();
+       }
+}
+
+void
 _AppWidgetViewManager::OnAppWidgetCreated(livebox* pAppWidget)
 {
 }
@@ -690,11 +452,12 @@ _AppWidgetViewManager::OnAppWidgetUpdated(livebox* pAppWidget)
        case LB_TYPE_PIXMAP:
                if (__glMode)
                {
-                       pAppWidgetView->OnAppWidgetUpdated(livebox_lb_pixmap(pAppWidget));
+                       Pixmap pixmap = livebox_lb_pixmap(pAppWidget);
+                       pAppWidgetView->OnAppWidgetUpdated(pixmap);
 
-#if defined(_PIXMAP_TEST)
-                       DumpPixmap(livebox_lb_pixmap(pAppWidget));
-#endif // _PIXMAP_TEST
+#if defined(_DUMP_BUFFER)
+                       DumpBuffer(pixmap);
+#endif // _DUMP_BUFFER
                }
                else
                {
@@ -765,10 +528,11 @@ _AppWidgetViewManager::OnAppWidgetPopupUpdated(livebox* pAppWidget)
        case PD_TYPE_PIXMAP:
                if (__glMode)
                {
-                       pAppWidgetPopupView->OnAppWidgetUpdated(livebox_pd_pixmap(pAppWidget));
-#if defined(_PIXMAP_TEST)
-                       DumpPixmap(livebox_pd_pixmap(pAppWidget));
-#endif // _PIXMAP_TEST
+                       Pixmap pixmap = livebox_pd_pixmap(pAppWidget);
+                       pAppWidgetPopupView->OnAppWidgetUpdated(pixmap);
+#if defined(_DUMP_BUFFER)
+                       DumpBuffer(pixmap);
+#endif // _DUMP_BUFFER
                }
                else
                {
index dc36d43..41b1e77 100644 (file)
@@ -48,6 +48,7 @@ class _ICoordinateSystemTransformer;
 namespace Tizen { namespace Shell
 {
 class _AppWidgetView;
+class _AppWidgetBuffer;
 
 /**
  * @class _AppWidgetViewManager
@@ -77,6 +78,7 @@ private:
        Tizen::Graphics::Bitmap* GetBitmapN(const Tizen::Base::String& fileName) const;
        Tizen::Graphics::Bitmap* GetBitmapN(void* pBuffer, const Tizen::Graphics::FloatDimension& size) const;
        bool IsGlMode(void) const;
+       void DumpBuffer(unsigned int pixmap);
 
        void OnAppWidgetCreated(livebox* pAppWidget);
        void OnAppWidgetUpdated(livebox* pAppWidget);
@@ -128,6 +130,7 @@ private:
        std::unique_ptr<int, _FaultEventHandlerDeleter> __faultEventHandler;
        std::unique_ptr<_FrameEventListener> __pFrameEventListener;
        bool __glMode;
+       std::unique_ptr<_AppWidgetBuffer> __pAppWidgetBuffer;
 };
 
 }} // Tizen::Shell