From dac233bfa75fd37c087c0bceeee371be4cbd5b3d Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Thu, 6 May 2021 10:40:21 +0100 Subject: [PATCH] Mali FB Toolkit --- README.mb | 1 + libmalifb.so | Bin 0 -> 22092 bytes malifb.h | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 README.mb create mode 100755 libmalifb.so create mode 100644 malifb.h diff --git a/README.mb b/README.mb new file mode 100644 index 0000000..ce426dd --- /dev/null +++ b/README.mb @@ -0,0 +1 @@ +MaliFB - Mali FB Toolkit diff --git a/libmalifb.so b/libmalifb.so new file mode 100755 index 0000000000000000000000000000000000000000..84b574249e996b377d6d44338ded77c28dbbfd4f GIT binary patch literal 22092 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 literal 0 HcmV?d00001 diff --git a/malifb.h b/malifb.h new file mode 100644 index 0000000..c4f69e5 --- /dev/null +++ b/malifb.h @@ -0,0 +1,137 @@ +// -------------------------------------------- +// __ __ _ _ ___ ___ +// | \/ |__ _| (_) __| _ ) +// | |\/| / _` | | | _|| _ \ +// |_| |_\__,_|_|_|_| |___/ +// +// The simple Mali Frame Buffer Surface toolkit +// +// (C) COPYRIGHT 2020 Retro Games Ltd, and portions +// (C) COPYRIGHT 2015 ARM Limited +// +// ALL RIGHTS RESERVED +// -------------------------------------------- +#ifndef MALIFB_CL_H +#define MALIFB_CL_H + +#define EGL_FBDEV 1 + +#if defined(__arm__) +# define EGL_EGLEXT_PROTOTYPES +# define GL_GLEXT_PROTOTYPES +#endif + +#if defined(__arm__) && !defined( FORCE_OPENGL ) +# define USE_MALI +#endif + +#if defined PLATFORM_AMD64 || defined __x86_64__ +# define TIDLEN 4 +# define SIDLEN 3 +#else +# define TIDLEN 2 +# define SIDLEN 3 +#endif + +#include +#include + +#if defined(__arm__) +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// Data values ---------------------------------------------------------------- + +typedef enum { + MFB_Surface_None = 0, + MFB_Surface_Transparent = 1<<0, + MFB_Surface_Opaque = 1<<2, // use to make sure even RGBA images are rendered opaque + MFB_Surface_Hidden = 1<<3, +} _MFB_Surface_Flags; + +typedef int MFB_Surface_Flags; + +typedef enum { + MFB_Display_Unknown = -1, + MFB_Display_50Hz = 1<<0, + MFB_Display_60Hz = 1<<1, +} MFB_Display_Flags; + +typedef enum { + MFB_LUMINANCE = 1, + MFB_RGB = 2, + MFB_RGB565 = 3, + + MFB_ALPHA = 256, // Bit field + MFB_LUMINANCE_ALPHA = MFB_LUMINANCE | MFB_ALPHA, + MFB_RGBA = MFB_RGB | MFB_ALPHA, +} MFB_Image_Type; + +typedef enum { + MFB_Texture_Flag_None = 0, + MFB_Texture_Flag_Linear = 1<<0, + MFB_Texture_Flag_Nearest = 1<<1, + MFB_Texture_Flag_CRT = 1<<2, + MFB_Texture_Flag_CRT_Blend = MFB_Texture_Flag_Linear | MFB_Texture_Flag_CRT, +} MFB_Texture_Flag; + +// Data structures ------------------------------------------------------------ + +typedef void MFB_Screen; +typedef struct _mfb_surface MFB_Surface; + +typedef struct { + int _id[TIDLEN]; + int width; + int height; +} MFB_Texture; + +struct _mfb_surface { + int _id[SIDLEN]; + int width; + int height; +}; + +typedef void (*MFB_VSyncCallbackHandler)( MFB_Screen *s ); + +// Prototypes ----------------------------------------------------------------- + +MFB_Display_Flags MFB_GetDisplayMode(); + +MFB_Screen * MFB_ScreenCreate ( const char *name, MFB_Display_Flags dflags ); +MFB_Screen * MFB_ScreenCreateFromExisting( NativeWindowType native_window, MFB_Display_Flags dflags ); +void MFB_ScreenDestroy( MFB_Screen **s ); + +MFB_Surface * MFB_SurfaceCreate( MFB_Screen *s, int x, int y, int w, int h, int layer, MFB_Surface_Flags f ); + +// Coords and dimenstions define rectangle on screen that surface occupies +int MFB_SurfaceSize( MFB_Surface *, int x, int y, int w, int h ); +int MFB_SurfaceHide( MFB_Surface * ); +int MFB_SurfaceReveal( MFB_Surface * ); + +// Coords and dimensions define rectangle within texture to map onto surface +int MFB_SurfaceUpdate ( MFB_Surface *, int x, int y, int w, int h, MFB_Texture * ); +void MFB_SurfaceAlpha ( MFB_Surface *, unsigned int ); +void MFB_SurfaceDestroy( MFB_Surface ** ); + +int MFB_ScreenRender( MFB_Screen * ); +void MFB_Display( MFB_Screen *s ); +#if defined( PLATFORM_SUN50IW6 ) || defined (__x86_64__) || defined (__i386__) +int MFB_VSyncCallback( MFB_Screen *s, MFB_VSyncCallbackHandler cb ); +#endif + +MFB_Texture * MFB_TextureCreate( int w, int h, MFB_Image_Type color_format ); +int MFB_TextureRegister( MFB_Screen *s, MFB_Texture *t ); +int MFB_TextureDeregister( MFB_Screen *s, MFB_Texture *t ); +int MFB_TextureUpdate( MFB_Texture *t, int x, int y, int w, int h, uint8_t *src_data, MFB_Texture_Flag flags ); // x and w not used +void MFB_TextureDestroy( MFB_Texture **t ); + +#ifdef __cplusplus +} +#endif + +#endif