Skip to content
  • Alexandru Gheorghe's avatar
    drm/fourcc: Add char_per_block, block_w and block_h in drm_format_info · 042bf753
    Alexandru Gheorghe authored
    
    
    For some pixel formats .cpp structure in drm_format info it's not
    enough to describe the peculiarities of the pixel layout, for example
    tiled formats or packed formats at bit level.
    
    What's implemented here is to add three new members to drm_format_info
    that could describe such formats:
    
    - char_per_block[3]
    - block_w[3]
    - block_h[3]
    
    char_per_block will be put in a union alongside cpp, for transparent
    compatibility  with the existing format descriptions.
    
    Regarding, block_w and block_h they are intended to be used through
    their equivalent getters drm_format_info_block_width /
    drm_format_info_block_height, the reason of the getters is to abstract
    the fact that for normal formats block_w and block_h will be unset/0,
    but the methods will be returning 1.
    
    Additionally, convenience function drm_format_info_min_pitch had been
    added that computes the minimum required pitch for a given pixel
    format and buffer width.
    
    Using that the following drm core functions had been updated to
    generically handle both block and non-block formats:
    
    - drm_fb_cma_get_gem_addr: for block formats it will just return the
      beginning of the block.
    - framebuffer_check: Use the newly added drm_format_info_min_pitch.
    - drm_gem_fb_create_with_funcs: Use the newly added
      drm_format_info_min_pitch.
    - In places where is not expecting to handle block formats, like fbdev
      helpers I just added some warnings in case the block width/height
      are greater than 1.
    
    Changes since v3:
     - Add helper function for computing the minimum required pitch.
     - Improve/cleanup documentation
    
    Changes since v8:
     - Fixed build on 32bits arm architectures, with:
    
    -       return DIV_ROUND_UP((u64)buffer_width * info->char_per_block[plane],
    +       return DIV_ROUND_UP_ULL((u64)buffer_width * info->char_per_block[plane],
    
    Reviewed-by: default avatarBrian Starkey <brian.starkey@arm.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: default avatarAlexandru Gheorghe <alexandru-cosmin.gheorghe@arm.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181101170055.5433-1-alexandru-cosmin.gheorghe@arm.com
    042bf753