Home | History | Annotate | Download | only in legacy
      1 #pragma once
      2 /*
      3  * Copyright (C) 2016 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 #include <stdint.h>
     18 #include <limits.h>
     19 #include <sys/cdefs.h>
     20 #include <sys/mman.h>
     21 #include <hardware/gralloc.h>
     22 #include <errno.h>
     23 #include <unistd.h>
     24 #include <string.h>
     25 
     26 #include <cutils/native_handle.h>
     27 #include <cutils/log.h>
     28 
     29 #include <linux/fb.h>
     30 
     31 #include "common/vsoc/lib/screen_region_view.h"
     32 #include "guest/libs/platform_support/api_level_fixes.h"
     33 
     34 #ifndef GRALLOC_MODULE_API_VERSION_0_2
     35 // This structure will be defined in later releases of Android. Declare it
     36 // here to allow us to structure the code well.
     37 struct android_ycbcr {
     38   void* y;
     39   void* cb;
     40   void* cr;
     41   size_t ystride;
     42   size_t cstride;
     43   size_t chroma_step;
     44   uint32_t reserved[8];
     45 };
     46 #endif
     47 
     48 /*****************************************************************************/
     49 
     50 struct private_handle_t;
     51 
     52 struct private_module_t {
     53   gralloc_module_t base;
     54 };
     55 
     56 /*****************************************************************************/
     57 
     58 struct priv_alloc_device_t {
     59   alloc_device_t  device;
     60 };
     61 
     62 /*****************************************************************************/
     63 
     64 struct private_handle_t : public native_handle {
     65   // file-descriptors
     66   int     fd;
     67   // ints
     68   int     magic;
     69   int     flags;
     70   int     format;
     71   int     x_res;
     72   int     y_res;
     73   int     stride_in_pixels;
     74   // Use to indicate which frame we're using.
     75   int     frame_offset;
     76   int     total_size;
     77   int     lock_level;
     78 
     79   static inline int sNumInts() {
     80     return (((sizeof(private_handle_t) - sizeof(native_handle_t))/sizeof(int)) - sNumFds);
     81   }
     82   static const int sNumFds = 1;
     83   static const int sMagic = 0x3141592;
     84 
     85   private_handle_t(int fd, int size, int format, int x_res, int y_res,
     86                    int stride_in_pixels, int flags, int frame_offset = 0)
     87       : fd(fd),
     88         magic(sMagic),
     89         flags(flags),
     90         format(format),
     91         x_res(x_res),
     92         y_res(y_res),
     93         stride_in_pixels(stride_in_pixels),
     94         frame_offset(frame_offset),
     95         total_size(size),
     96         lock_level(0) {
     97     version = sizeof(native_handle);
     98     numInts = sNumInts();
     99     numFds = sNumFds;
    100   }
    101 
    102   ~private_handle_t() {
    103     magic = 0;
    104   }
    105 
    106   static int validate(const native_handle* h) {
    107     const private_handle_t* hnd = (const private_handle_t*)h;
    108     if (!h) {
    109       ALOGE("invalid gralloc handle (at %p): NULL pointer", h);
    110       return -EINVAL;
    111     }
    112     if (h->version != sizeof(native_handle)) {
    113       ALOGE(
    114           "invalid gralloc handle (at %p): Wrong version(observed: %d, "
    115           "expected: %zu)",
    116           h,
    117           h->version,
    118           sizeof(native_handle));
    119       return -EINVAL;
    120     }
    121     if (h->numInts != sNumInts()) {
    122       ALOGE(
    123           "invalid gralloc handle (at %p): Wrong number of ints(observed: %d, "
    124           "expected: %d)",
    125           h,
    126           h->numInts,
    127           sNumInts());
    128       return -EINVAL;
    129     }
    130     if (h->numFds != sNumFds) {
    131       ALOGE(
    132           "invalid gralloc handle (at %p): Wrong number of file "
    133           "descriptors(observed: %d, expected: %d)",
    134           h,
    135           h->numFds,
    136           sNumFds);
    137       return -EINVAL;
    138     }
    139     if (hnd->magic != sMagic) {
    140       ALOGE(
    141           "invalid gralloc handle (at %p): Wrong magic number(observed: %d, "
    142           "expected: %d)",
    143           h,
    144           hnd->magic,
    145           sMagic);
    146       return -EINVAL;
    147     }
    148     return 0;
    149   }
    150 };
    151 
    152 
    153 static inline int formatToBytesPerPixel(int format) {
    154   switch (format) {
    155 #if VSOC_PLATFORM_SDK_AFTER(N_MR1)
    156     case HAL_PIXEL_FORMAT_RGBA_FP16:
    157       return 8;
    158 #endif
    159     case HAL_PIXEL_FORMAT_RGBA_8888:
    160     case HAL_PIXEL_FORMAT_RGBX_8888:
    161     case HAL_PIXEL_FORMAT_BGRA_8888:
    162 #if VSOC_PLATFORM_SDK_AFTER(J)
    163     // The camera 3.0 implementation assumes that IMPLEMENTATION_DEFINED
    164     // means HAL_PIXEL_FORMAT_RGBA_8888
    165     case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
    166 #endif
    167       return 4;
    168     case HAL_PIXEL_FORMAT_RGB_888:
    169       return 3;
    170     case HAL_PIXEL_FORMAT_RGB_565:
    171     case HAL_PIXEL_FORMAT_YV12:
    172 #ifdef GRALLOC_MODULE_API_VERSION_0_2
    173     case HAL_PIXEL_FORMAT_YCbCr_420_888:
    174 #endif
    175       return 2;
    176 #if VSOC_PLATFORM_SDK_AFTER(J)
    177     case HAL_PIXEL_FORMAT_BLOB:
    178       return 1;
    179 #endif
    180     default:
    181       ALOGE("%s: unknown format=%d", __FUNCTION__, format);
    182       return 8;
    183   }
    184 }
    185 
    186 inline const char* pixel_format_to_string(int format) {
    187   switch (format) {
    188     // Formats that are universal across versions
    189     case HAL_PIXEL_FORMAT_RGBA_8888:
    190       return "RGBA_8888";
    191     case HAL_PIXEL_FORMAT_RGBX_8888:
    192       return "RGBX_8888";
    193     case HAL_PIXEL_FORMAT_BGRA_8888:
    194       return "BGRA_8888";
    195     case HAL_PIXEL_FORMAT_RGB_888:
    196       return "RGB_888";
    197     case HAL_PIXEL_FORMAT_RGB_565:
    198       return "RGB_565";
    199     case HAL_PIXEL_FORMAT_YV12:
    200       return "YV12";
    201     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    202       return "YCrCb_420_SP";
    203     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
    204       return "YCbCr_422_SP";
    205     case HAL_PIXEL_FORMAT_YCbCr_422_I:
    206       return "YCbCr_422_I";
    207 
    208 #if VSOC_PLATFORM_SDK_AFTER(J)
    209     // First supported on JBMR1 (API 17)
    210     case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
    211       return "IMPLEMENTATION_DEFINED";
    212     case HAL_PIXEL_FORMAT_BLOB:
    213       return "BLOB";
    214 #endif
    215 #if VSOC_PLATFORM_SDK_AFTER(J_MR1)
    216     // First supported on JBMR2 (API 18)
    217     case HAL_PIXEL_FORMAT_YCbCr_420_888:
    218       return "YCbCr_420_888";
    219     case HAL_PIXEL_FORMAT_Y8:
    220       return "Y8";
    221     case HAL_PIXEL_FORMAT_Y16:
    222       return "Y16";
    223 #endif
    224 #if VSOC_PLATFORM_SDK_AFTER(K)
    225     // Support was added in L (API 21)
    226     case HAL_PIXEL_FORMAT_RAW_OPAQUE:
    227       return "RAW_OPAQUE";
    228     // This is an alias for RAW_SENSOR in L and replaces it in M.
    229     case HAL_PIXEL_FORMAT_RAW16:
    230       return "RAW16";
    231     case HAL_PIXEL_FORMAT_RAW10:
    232       return "RAW10";
    233 #endif
    234 #if VSOC_PLATFORM_SDK_AFTER(L_MR1)
    235     case HAL_PIXEL_FORMAT_YCbCr_444_888:
    236       return "YCbCr_444_888";
    237     case HAL_PIXEL_FORMAT_YCbCr_422_888:
    238       return "YCbCr_422_888";
    239     case HAL_PIXEL_FORMAT_RAW12:
    240       return "RAW12";
    241     case HAL_PIXEL_FORMAT_FLEX_RGBA_8888:
    242       return "FLEX_RGBA_8888";
    243     case HAL_PIXEL_FORMAT_FLEX_RGB_888:
    244       return "FLEX_RGB_888";
    245 #endif
    246 #if VSOC_PLATFORM_SDK_AFTER(N_MR1)
    247     case HAL_PIXEL_FORMAT_RGBA_FP16:
    248       return "RGBA_FP16";
    249 #endif
    250 
    251       // Formats that have been removed
    252 #if VSOC_PLATFORM_SDK_BEFORE(K)
    253     // Support was dropped on K (API 19)
    254     case HAL_PIXEL_FORMAT_RGBA_5551:
    255       return "RGBA_5551";
    256     case HAL_PIXEL_FORMAT_RGBA_4444:
    257       return "RGBA_4444";
    258 #endif
    259 #if VSOC_PLATFORM_SDK_BEFORE(L)
    260     // Renamed to RAW_16 in L. Both were present for L, but it was completely
    261     // removed in M.
    262     case HAL_PIXEL_FORMAT_RAW_SENSOR:
    263       return "RAW_SENSOR";
    264 #endif
    265 #if VSOC_PLATFORM_SDK_AFTER(J_MR2) && VSOC_PLATFORM_SDK_BEFORE(M)
    266     // Supported K, L, and LMR1. Not supported on JBMR0, JBMR1, JBMR2, and M
    267     case HAL_PIXEL_FORMAT_sRGB_X_8888:
    268       return "sRGB_X_8888";
    269     case HAL_PIXEL_FORMAT_sRGB_A_8888:
    270       return "sRGB_A_8888";
    271 #endif
    272   }
    273   return "UNKNOWN";
    274 }
    275 
    276 
    277 static inline void formatToYcbcr(
    278     int format, int width, int height, void* base_v, android_ycbcr* out) {
    279   char* it = static_cast<char*>(base_v);
    280   // Clear reserved fields;
    281   memset(out, 0, sizeof(*out));
    282   switch (format) {
    283     case HAL_PIXEL_FORMAT_YV12:
    284 #ifdef GRALLOC_MODULE_API_VERSION_0_2
    285     case HAL_PIXEL_FORMAT_YCbCr_420_888:
    286 #endif
    287       out->ystride = vsoc::screen::ScreenRegionView::align(width, 16);
    288       out->cstride =
    289           vsoc::screen::ScreenRegionView::align(out->ystride / 2, 16);
    290       out->chroma_step = 1;
    291       out->y = it;
    292       it += out->ystride * height;
    293       out->cr = it;
    294       it += out->cstride * height / 2;
    295       out->cb = it;
    296       break;
    297     default:
    298       ALOGE("%s: can't deal with format=0x%x (%s)",
    299             __FUNCTION__, format, pixel_format_to_string(format));
    300   }
    301 }
    302 
    303 static inline int formatToBytesPerFrame(int format, int w, int h) {
    304   int bytes_per_pixel = formatToBytesPerPixel(format);
    305   int w16, h16;
    306   int y_size, c_size;
    307 
    308   switch (format) {
    309 #if VSOC_PLATFORM_SDK_AFTER(J)
    310     // BLOB is used to allocate buffers for JPEG formatted data. Bytes per pixel
    311     // is 1, the desired buffer size is in w, and h should be 1. We refrain from
    312     // adding additional padding, although the caller is likely to round
    313     // up to a page size.
    314     case HAL_PIXEL_FORMAT_BLOB:
    315       return bytes_per_pixel * w * h;
    316 #endif
    317     case HAL_PIXEL_FORMAT_YV12:
    318 #ifdef GRALLOC_MODULE_API_VERSION_0_2
    319     case HAL_PIXEL_FORMAT_YCbCr_420_888:
    320 #endif
    321       android_ycbcr strides;
    322       formatToYcbcr(format, w, h, NULL, &strides);
    323       y_size = strides.ystride * h;
    324       c_size = strides.cstride * h / 2;
    325       return (y_size + 2 * c_size +
    326               vsoc::screen::ScreenRegionView::kSwiftShaderPadding);
    327     /*case HAL_PIXEL_FORMAT_RGBA_8888:
    328     case HAL_PIXEL_FORMAT_RGBX_8888:
    329     case HAL_PIXEL_FORMAT_BGRA_8888:
    330     case HAL_PIXEL_FORMAT_RGB_888:
    331     case HAL_PIXEL_FORMAT_RGB_565:*/
    332     default:
    333       w16 = vsoc::screen::ScreenRegionView::align(w, 16);
    334       h16 = vsoc::screen::ScreenRegionView::align(h, 16);
    335       return bytes_per_pixel * w16 * h16 +
    336              vsoc::screen::ScreenRegionView::kSwiftShaderPadding;
    337   }
    338 }
    339 
    340 int fb_device_open(
    341     const hw_module_t* module, const char* name, hw_device_t** device);
    342 
    343 int gralloc_lock(
    344     gralloc_module_t const* module,
    345     buffer_handle_t handle, int usage,
    346     int l, int t, int w, int h,
    347     void** vaddr);
    348 
    349 int gralloc_unlock(
    350     gralloc_module_t const* module, buffer_handle_t handle);
    351 
    352 int gralloc_register_buffer(
    353     gralloc_module_t const* module, buffer_handle_t handle);
    354 
    355 int gralloc_unregister_buffer(
    356     gralloc_module_t const* module, buffer_handle_t handle);
    357 
    358 int gralloc_lock_ycbcr(
    359     struct gralloc_module_t const* module,
    360     buffer_handle_t handle, int usage,
    361     int l, int t, int w, int h,
    362     struct android_ycbcr *ycbcr);
    363