Skip to content

Commit

Permalink
WIP: Rockchip: use gbm wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
Kwiboo committed Sep 8, 2018
1 parent 9f04b0e commit 578fc3a
Show file tree
Hide file tree
Showing 6 changed files with 617 additions and 4 deletions.
34 changes: 34 additions & 0 deletions packages/graphics/gbm-rockchip/package.mk
@@ -0,0 +1,34 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)

PKG_NAME="gbm-rockchip"
PKG_VERSION="master"
PKG_SHA256=""
PKG_ARCH="any"
PKG_LICENSE="MIT"
PKG_SITE=""
PKG_URL=""
PKG_DEPENDS_TARGET="toolchain mali-rockchip libdrm"
PKG_SECTION="graphics"
PKG_LONGDESC="Wrapper that adds missing gbm functions not found in libmali"
PKG_TOOLCHAIN="manual"
PKG_BUILD_FLAGS="-gold -lto"

make_target() {
echo "$CC $CFLAGS $LDFLAGS -I$SYSROOT_PREFIX/usr/include/libdrm -shared -fPIC gbm.c -o libgbm.so -lmali -ldrm"
$CC $CFLAGS $LDFLAGS -I$SYSROOT_PREFIX/usr/include/libdrm -shared -fPIC gbm.c -o libgbm.so -lmali -ldrm
}

makeinstall_target() {
cd $PKG_BUILD

mkdir -p $SYSROOT_PREFIX/usr/include
cp -fv gbm.h $SYSROOT_PREFIX/usr/include

mkdir -p $SYSROOT_PREFIX/usr/lib/pkgconfig
cp -fv $PKG_DIR/pkgconfig/*.pc $SYSROOT_PREFIX/usr/lib/pkgconfig
cp -v --remove-destination libgbm.so $SYSROOT_PREFIX/usr/lib

mkdir -p $INSTALL/usr/lib
cp -v libgbm.so $INSTALL/usr/lib
}
12 changes: 12 additions & 0 deletions packages/graphics/gbm-rockchip/pkgconfig/gbm.pc
@@ -0,0 +1,12 @@
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include

Name: gbm
Description: Mali GBM library
Requires.private:
Version: 17.3.0
Libs: -L${libdir} -lmali -lgbm
Libs.private:
Cflags: -I${includedir}
155 changes: 155 additions & 0 deletions packages/graphics/gbm-rockchip/sources/gbm.c
@@ -0,0 +1,155 @@

/* Enable 64-bit mmap also when compiling for 32 bit */
#define _FILE_OFFSET_BITS 64

#include <stddef.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <xf86drm.h>
#include "gbm.h"

void *
gbm_bo_map(struct gbm_bo *bo,
uint32_t x, uint32_t y, uint32_t width, uint32_t height,
uint32_t flags, uint32_t *stride, void **map_data)
{
struct drm_mode_map_dumb mreq = {};
struct gbm_device *device = gbm_bo_get_device(bo);
int fd = gbm_device_get_fd(device);

mreq.handle = gbm_bo_get_handle(bo).u32;
int ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
if (ret)
return MAP_FAILED;

void *map = mmap(NULL, gbm_bo_get_stride(bo) * gbm_bo_get_height(bo), PROT_READ | PROT_WRITE, MAP_SHARED, fd, mreq.offset);
if (map != MAP_FAILED) {
*map_data = map;
*stride = gbm_bo_get_stride(bo);
}

return map;
}

void
gbm_bo_unmap(struct gbm_bo *bo, void *map_data)
{
if (map_data)
munmap(map_data, gbm_bo_get_stride(bo) * gbm_bo_get_height(bo));
}

int
gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm,
uint32_t format,
uint64_t modifier)
{
return 1;
}

struct gbm_bo *
gbm_bo_create_with_modifiers(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format,
const uint64_t *modifiers,
const unsigned int count)
{
return gbm_bo_create(gbm, width, height, format, GBM_BO_USE_LINEAR);
}

uint32_t
gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane)
{
return gbm_bo_get_stride(bo);
}

uint32_t
gbm_bo_get_offset(struct gbm_bo *bo, int plane)
{
return 0;
}

uint64_t
gbm_bo_get_modifier(struct gbm_bo *bo)
{
return 0;
}

int
gbm_bo_get_plane_count(struct gbm_bo *bo)
{
return 1;
}

union gbm_bo_handle
gbm_bo_get_handle_for_plane(struct gbm_bo *bo, int plane)
{
return gbm_bo_get_handle(bo);
}

struct gbm_surface *
gbm_surface_create_with_modifiers(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format,
const uint64_t *modifiers,
const unsigned int count)

{
return gbm_surface_create(gbm, width, height, format, GBM_BO_USE_LINEAR);
}

uint32_t
gbm_bo_get_bpp(struct gbm_bo *bo)
{
switch (gbm_bo_get_format(bo)) {
default:
return 0;
case GBM_FORMAT_C8:
case GBM_FORMAT_R8:
case GBM_FORMAT_RGB332:
case GBM_FORMAT_BGR233:
return 8;
case GBM_FORMAT_GR88:
case GBM_FORMAT_XRGB4444:
case GBM_FORMAT_XBGR4444:
case GBM_FORMAT_RGBX4444:
case GBM_FORMAT_BGRX4444:
case GBM_FORMAT_ARGB4444:
case GBM_FORMAT_ABGR4444:
case GBM_FORMAT_RGBA4444:
case GBM_FORMAT_BGRA4444:
case GBM_FORMAT_XRGB1555:
case GBM_FORMAT_XBGR1555:
case GBM_FORMAT_RGBX5551:
case GBM_FORMAT_BGRX5551:
case GBM_FORMAT_ARGB1555:
case GBM_FORMAT_ABGR1555:
case GBM_FORMAT_RGBA5551:
case GBM_FORMAT_BGRA5551:
case GBM_FORMAT_RGB565:
case GBM_FORMAT_BGR565:
return 16;
case GBM_FORMAT_RGB888:
case GBM_FORMAT_BGR888:
return 24;
case GBM_FORMAT_XRGB8888:
case GBM_FORMAT_XBGR8888:
case GBM_FORMAT_RGBX8888:
case GBM_FORMAT_BGRX8888:
case GBM_FORMAT_ARGB8888:
case GBM_FORMAT_ABGR8888:
case GBM_FORMAT_RGBA8888:
case GBM_FORMAT_BGRA8888:
case GBM_FORMAT_XRGB2101010:
case GBM_FORMAT_XBGR2101010:
case GBM_FORMAT_RGBX1010102:
case GBM_FORMAT_BGRX1010102:
case GBM_FORMAT_ARGB2101010:
case GBM_FORMAT_ABGR2101010:
case GBM_FORMAT_RGBA1010102:
case GBM_FORMAT_BGRA1010102:
return 32;
}
}

0 comments on commit 578fc3a

Please sign in to comment.