Android-x86
Fork

  • R/O
  • HTTP
  • SSH
  • HTTPS

external-drm_gralloc: コミット

external/drm_gralloc


コミットメタ情報

リビジョンb65a3f83ccf8d17cea46fe5af1bc348ad5d4467f (tree)
日時2011-10-27 19:40:45
作者Chia-I Wu <olvaffe@gmai...>
コミッターChia-I Wu

ログメッセージ

add support for YUV formats

変更サマリ

差分

--- a/gralloc_drm.h
+++ b/gralloc_drm.h
@@ -61,8 +61,15 @@ static inline int gralloc_drm_get_bpp(int format)
6161 case HAL_PIXEL_FORMAT_RGB_565:
6262 case HAL_PIXEL_FORMAT_RGBA_5551:
6363 case HAL_PIXEL_FORMAT_RGBA_4444:
64+ case HAL_PIXEL_FORMAT_YCbCr_422_I:
6465 bpp = 2;
6566 break;
67+ /* planar; only Y is considered */
68+ case HAL_PIXEL_FORMAT_YV12:
69+ case HAL_PIXEL_FORMAT_YCbCr_422_SP:
70+ case HAL_PIXEL_FORMAT_YCrCb_420_SP:
71+ bpp = 1;
72+ break;
6673 default:
6774 bpp = 0;
6875 break;
@@ -71,6 +78,37 @@ static inline int gralloc_drm_get_bpp(int format)
7178 return bpp;
7279 }
7380
81+static inline void gralloc_drm_align_geometry(int format, int *width, int *height)
82+{
83+ int align_w = 1, align_h = 1, extra_height_div = 0;
84+
85+ switch (format) {
86+ case HAL_PIXEL_FORMAT_YV12:
87+ align_w = 32;
88+ align_h = 2;
89+ extra_height_div = 2;
90+ break;
91+ case HAL_PIXEL_FORMAT_YCbCr_422_SP:
92+ align_w = 2;
93+ extra_height_div = 1;
94+ break;
95+ case HAL_PIXEL_FORMAT_YCrCb_420_SP:
96+ align_w = 2;
97+ align_h = 2;
98+ extra_height_div = 2;
99+ break;
100+ case HAL_PIXEL_FORMAT_YCbCr_422_I:
101+ align_w = 2;
102+ break;
103+ }
104+
105+ *width = (*width + align_w - 1) & ~(align_w - 1);
106+ *height = (*height + align_h - 1) & ~(align_h - 1);
107+
108+ if (extra_height_div)
109+ *height += *height / extra_height_div;
110+}
111+
74112 int gralloc_drm_handle_register(buffer_handle_t handle, struct gralloc_drm_t *drm);
75113 int gralloc_drm_handle_unregister(buffer_handle_t handle);
76114
--- a/gralloc_drm_intel.c
+++ b/gralloc_drm_intel.c
@@ -309,6 +309,11 @@ static drm_intel_bo *alloc_ibo(struct intel_info *info,
309309 return NULL;
310310 }
311311
312+ aligned_width = handle->width;
313+ aligned_height = handle->height;
314+ gralloc_drm_align_geometry(handle->format,
315+ &aligned_width, &aligned_height);
316+
312317 if (handle->usage & GRALLOC_USAGE_HW_FB) {
313318 unsigned long max_stride;
314319
@@ -319,8 +324,7 @@ static drm_intel_bo *alloc_ibo(struct intel_info *info,
319324 max_stride /= 2;
320325
321326 name = "gralloc-fb";
322- aligned_width = (handle->width + 63) & ~63;
323- aligned_height = handle->height;
327+ aligned_width = (aligned_width + 63) & ~63;
324328 flags = BO_ALLOC_FOR_RENDER;
325329
326330 *tiling = I915_TILING_X;
@@ -368,13 +372,11 @@ static drm_intel_bo *alloc_ibo(struct intel_info *info,
368372 if (handle->usage & GRALLOC_USAGE_HW_TEXTURE) {
369373 name = "gralloc-texture";
370374 /* see 2D texture layout of DRI drivers */
371- aligned_width = (handle->width + 3) & ~3;
372- aligned_height = (handle->height + 1) & ~1;
375+ aligned_width = (aligned_width + 3) & ~3;
376+ aligned_height = (aligned_height + 1) & ~1;
373377 }
374378 else {
375379 name = "gralloc-buffer";
376- aligned_width = handle->width;
377- aligned_height = handle->height;
378380 }
379381
380382 if (handle->usage & GRALLOC_USAGE_HW_RENDER)
--- a/gralloc_drm_nouveau.c
+++ b/gralloc_drm_nouveau.c
@@ -198,9 +198,13 @@ nouveau_alloc(struct gralloc_drm_drv_t *drv, struct gralloc_drm_handle_t *handle
198198 }
199199 }
200200 else {
201- int pitch;
201+ int width, height, pitch;
202202
203- nb->bo = alloc_bo(info, handle->width, handle->height,
203+ width = handle->width;
204+ height = handle->height;
205+ gralloc_drm_align_geometry(handle->format, &width, &height);
206+
207+ nb->bo = alloc_bo(info, width, height,
204208 cpp, handle->usage, &pitch);
205209 if (!nb->bo) {
206210 LOGE("failed to allocate nouveau bo %dx%dx%d",
--- a/gralloc_drm_pipe.c
+++ b/gralloc_drm_pipe.c
@@ -76,6 +76,9 @@ static enum pipe_format get_pipe_format(int format)
7676 break;
7777 case HAL_PIXEL_FORMAT_RGBA_5551:
7878 case HAL_PIXEL_FORMAT_RGBA_4444:
79+ case HAL_PIXEL_FORMAT_YV12:
80+ case HAL_PIXEL_FORMAT_YCbCr_422_SP:
81+ case HAL_PIXEL_FORMAT_YCrCb_420_SP:
7982 default:
8083 fmt = PIPE_FORMAT_NONE;
8184 break;
--- a/gralloc_drm_radeon.c
+++ b/gralloc_drm_radeon.c
@@ -201,16 +201,17 @@ static struct radeon_bo *radeon_alloc(struct radeon_info *info,
201201 tiling = radeon_get_tiling(info, handle);
202202 domain = RADEON_GEM_DOMAIN_VRAM;
203203
204+ aligned_width = handle->width;
205+ aligned_height = handle->height;
206+ gralloc_drm_align_geometry(handle->format,
207+ &aligned_width, &aligned_height);
208+
204209 if (handle->usage & (GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_TEXTURE)) {
205- aligned_width = ALIGN(handle->width,
210+ aligned_width = ALIGN(aligned_width,
206211 radeon_get_pitch_align(info, cpp, tiling));
207- aligned_height = ALIGN(handle->height,
212+ aligned_height = ALIGN(aligned_height,
208213 radeon_get_height_align(info, tiling));
209214 }
210- else {
211- aligned_width = handle->width;
212- aligned_height = handle->height;
213- }
214215
215216 if (!(handle->usage & (GRALLOC_USAGE_HW_FB |
216217 GRALLOC_USAGE_HW_RENDER)) &&
旧リポジトリブラウザで表示