#include <libudev.h>
+#include <system_info.h>
+
#include "tbm_bufmgr_tgl.h"
#define DEBUG
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#ifdef ALIGN_EIGHT
-#define TBM_SURFACE_ALIGNMENT_PLANE (8)
-#define TBM_SURFACE_ALIGNMENT_PITCH_RGB (8)
-#else
-#define TBM_SURFACE_ALIGNMENT_PLANE (64)
-#define TBM_SURFACE_ALIGNMENT_PITCH_RGB (64)
-#endif
+static unsigned int g_tbm_surface_alignment_plane;
+static unsigned int g_tbm_surface_alignment_pitch_rgb;
#define TBM_SURFACE_ALIGNMENT_PLANE_NV12 (4096)
#define TBM_SURFACE_ALIGNMENT_PITCH_YUV (16)
case TBM_FORMAT_RGB565:
bpp = 16;
_offset = 0;
- _pitch = SIZE_ALIGN((width * bpp) >> 3, TBM_SURFACE_ALIGNMENT_PITCH_RGB);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _pitch = SIZE_ALIGN((width * bpp) >> 3, g_tbm_surface_alignment_pitch_rgb);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
break;
/* 24 bpp RGB */
case TBM_FORMAT_BGR888:
bpp = 24;
_offset = 0;
- _pitch = SIZE_ALIGN((width * bpp) >> 3, TBM_SURFACE_ALIGNMENT_PITCH_RGB);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _pitch = SIZE_ALIGN((width * bpp) >> 3, g_tbm_surface_alignment_pitch_rgb);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
break;
/* 32 bpp RGB */
case TBM_FORMAT_BGRA8888:
bpp = 32;
_offset = 0;
- _pitch = SIZE_ALIGN((width * bpp) >> 3, TBM_SURFACE_ALIGNMENT_PITCH_RGB);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _pitch = SIZE_ALIGN((width * bpp) >> 3, g_tbm_surface_alignment_pitch_rgb);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
break;
bpp = 32;
_offset = 0;
_pitch = SIZE_ALIGN((width * bpp) >> 3, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
break;
if (plane_idx == 0) {
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
} else if (plane_idx == 1) {
_offset = width * height;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * (height / 2), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height / 2), g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
{
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 0)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
{
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 0)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 4, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 4);
- _size = SIZE_ALIGN(_pitch * (height / 4), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height / 4), g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 1)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 4, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 4);
- _size = SIZE_ALIGN(_pitch * (height / 4), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height / 4), g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
{
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 0)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 2, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * (height / 2), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height / 2), g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 1)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 2, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * (height / 2), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height / 2), g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
{
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 0)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 2, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * (height), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height), g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 1)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width / 2, TBM_SURFACE_ALIGNMENT_PITCH_YUV / 2);
- _size = SIZE_ALIGN(_pitch * (height), TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * (height), g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
{
_offset = 0;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 0)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
if (plane_idx == 1)
break;
{
_offset += _size;
_pitch = SIZE_ALIGN(width, TBM_SURFACE_ALIGNMENT_PITCH_YUV);
- _size = SIZE_ALIGN(_pitch * height, TBM_SURFACE_ALIGNMENT_PLANE);
+ _size = SIZE_ALIGN(_pitch * height, g_tbm_surface_alignment_plane);
_bo_idx = 0;
}
break;
goto fail_init_backend;
}
+ /* get the model name from the capi-system-info.
+ * The alignment_plane and alignment_pitch_rgb is different accoring to the target.
+ * There will be the stride issue when the right alignment_plane and alignment_pitch_rgb
+ * is not set to the backend.
+ */
+ char *value = NULL;
+ if (system_info_get_platform_string("http://tizen.org/system/model_name", &value) != SYSTEM_INFO_ERROR_NONE) {
+ TBM_EXYNOS_ERROR("Cannot get the \"http://tizen.org/system/model_name\" key value from system-info.\n");
+ TBM_EXYNOS_ERROR("May not set the right value on libtbm-exynos backend.\n");
+ } else {
+ if (!strncmp(value, "TW1", 4)) {
+ g_tbm_surface_alignment_plane = 8;
+ g_tbm_surface_alignment_pitch_rgb = 8;
+ } else {
+ g_tbm_surface_alignment_plane = 64;
+ g_tbm_surface_alignment_pitch_rgb = 64;
+ }
+ }
+
+ free(value);
+
#ifdef DEBUG
{
char *env;