empty implementation for drm video engine

This commit is contained in:
Vincent Wei
2019-06-05 15:32:58 +08:00
parent 924c1ecd79
commit 4fd4dfa561
4 changed files with 283 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
## Makefile.am for the drm video driver
AM_CPPFLAGS = -I$(abs_top_srcdir)/src/include -I$(abs_top_srcdir)/include -I$(abs_top_srcdir)/src/newgal/
noinst_LTLIBRARIES = libvideo_drm.la
# The drm video driver sources
SRC_FILES = \
drmvideo.c
HDR_FILES= \
drmvideo.h
libvideo_drm_la_SOURCES = $(SRC_FILES) $(HDR_FILES)
EXTRA_DIST=makefile.ng
LIB_NAME=libvideo_drm

211
src/newgal/drm/drmvideo.c Normal file
View File

@@ -0,0 +1,211 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* and Graphics User Interface (GUI) support system for embedded systems
* and smart IoT devices.
*
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
* Copyright (C) 1998~2002, WEI Yongming
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Or,
*
* As this program is a library, any link to this program must follow
* GNU General Public License version 3 (GPLv3). If you cannot accept
* GPLv3, you need to be licensed from FMSoft.
*
* If you have got a commercial license of this program, please use it
* under the terms and conditions of the commercial license.
*
* For more information about the commercial license, please refer to
* <http://www.minigui.com/en/about/licensing-policy/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "newgal.h"
#include "sysvideo.h"
#include "pixels_c.h"
#ifdef _MGGAL_DRM
#include "drmvideo.h"
#define DRMVID_DRIVER_NAME "drm"
/* Initialization/Query functions */
static int DRM_VideoInit(_THIS, GAL_PixelFormat *vformat);
static GAL_Rect **DRM_ListModes(_THIS, GAL_PixelFormat *format, Uint32 flags);
static GAL_Surface *DRM_SetVideoMode(_THIS, GAL_Surface *current, int width, int height, int bpp, Uint32 flags);
static int DRM_SetColors(_THIS, int firstcolor, int ncolors, GAL_Color *colors);
static void DRM_VideoQuit(_THIS);
/* Hardware surface functions */
static int DRM_AllocHWSurface(_THIS, GAL_Surface *surface);
static void DRM_FreeHWSurface(_THIS, GAL_Surface *surface);
/* DRM driver bootstrap functions */
static int DRM_Available(void)
{
return(1);
}
static void DRM_DeleteDevice(GAL_VideoDevice *device)
{
free(device->hidden);
free(device);
}
static GAL_VideoDevice *DRM_CreateDevice(int devindex)
{
GAL_VideoDevice *device;
/* Initialize all variables that we clean on shutdown */
device = (GAL_VideoDevice *)malloc(sizeof(GAL_VideoDevice));
if ( device ) {
memset(device, 0, (sizeof *device));
device->hidden = (struct GAL_PrivateVideoData *)
malloc((sizeof *device->hidden));
}
if ( (device == NULL) || (device->hidden == NULL) ) {
GAL_OutOfMemory();
if ( device ) {
free(device);
}
return(0);
}
memset(device->hidden, 0, (sizeof *device->hidden));
/* Set the function pointers */
device->VideoInit = DRM_VideoInit;
device->ListModes = DRM_ListModes;
device->SetVideoMode = DRM_SetVideoMode;
device->SetColors = DRM_SetColors;
device->VideoQuit = DRM_VideoQuit;
#ifndef _MGRM_THREADS
device->RequestHWSurface = NULL;
#endif
device->AllocHWSurface = DRM_AllocHWSurface;
device->CheckHWBlit = NULL;
device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = DRM_FreeHWSurface;
device->free = DRM_DeleteDevice;
return device;
}
VideoBootStrap DRM_bootstrap = {
DRMVID_DRIVER_NAME, "Dummy video driver",
DRM_Available, DRM_CreateDevice
};
static int DRM_VideoInit(_THIS, GAL_PixelFormat *vformat)
{
fprintf (stderr, "NEWGAL>DRM: Calling init method!\n");
/* Determine the screen depth (use default 8-bit depth) */
/* we change this during the GAL_SetVideoMode implementation... */
vformat->BitsPerPixel = 8;
vformat->BytesPerPixel = 1;
/* We're done! */
return(0);
}
static GAL_Rect **DRM_ListModes(_THIS, GAL_PixelFormat *format, Uint32 flags)
{
if (format->BitsPerPixel < 8) {
return NULL;
}
return (GAL_Rect**) -1;
}
static GAL_Surface *DRM_SetVideoMode(_THIS, GAL_Surface *current,
int width, int height, int bpp, Uint32 flags)
{
int pitch;
if (this->hidden->buffer) {
free (this->hidden->buffer);
}
pitch = width * ((bpp + 7) / 8);
pitch = (pitch + 3) & ~3;
this->hidden->buffer = malloc (pitch * height);
if (!this->hidden->buffer) {
fprintf (stderr, "NEWGAL>DRM: "
"Couldn't allocate buffer for requested mode\n");
return NULL;
}
memset (this->hidden->buffer, 0, pitch * height);
/* Allocate the new pixel format for the screen */
if (!GAL_ReallocFormat (current, bpp, 0, 0, 0, 0)) {
free(this->hidden->buffer);
this->hidden->buffer = NULL;
fprintf (stderr, "NEWGAL>DRM: "
"Couldn't allocate new pixel format for requested mode\n");
return(NULL);
}
/* Set up the new mode framebuffer */
current->flags = flags & GAL_FULLSCREEN;
this->hidden->w = current->w = width;
this->hidden->h = current->h = height;
current->pitch = pitch;
current->pixels = this->hidden->buffer;
/* We're done */
return(current);
}
/* We don't actually allow hardware surfaces other than the main one */
static int DRM_AllocHWSurface(_THIS, GAL_Surface *surface)
{
return(-1);
}
static void DRM_FreeHWSurface(_THIS, GAL_Surface *surface)
{
surface->pixels = NULL;
}
static int DRM_SetColors(_THIS, int firstcolor, int ncolors, GAL_Color *colors)
{
/* do nothing of note. */
return(1);
}
/* Note: If we are terminated, this could be called in the middle of
another video routine -- notably UpdateRects.
*/
static void DRM_VideoQuit(_THIS)
{
if (this->screen->pixels != NULL) {
free(this->screen->pixels);
this->screen->pixels = NULL;
}
}
#endif /* _MGGAL_DRM */

49
src/newgal/drm/drmvideo.h Normal file
View File

@@ -0,0 +1,49 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* and Graphics User Interface (GUI) support system for embedded systems
* and smart IoT devices.
*
* Copyright (C) 2019, Beijing FMSoft Technologies Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Or,
*
* As this program is a library, any link to this program must follow
* GNU General Public License version 3 (GPLv3). If you cannot accept
* GPLv3, you need to be licensed from FMSoft.
*
* If you have got a commercial license of this program, please use it
* under the terms and conditions of the commercial license.
*
* For more information about the commercial license, please refer to
* <http://www.minigui.com/en/about/licensing-policy/>.
*/
#ifndef _NEWGAL_DRMVIDEO_H
#define _NEWGAL_DRMVIDEO_H
#include "sysvideo.h"
/* Hidden "this" pointer for the video functions */
#define _THIS GAL_VideoDevice *this
/* Private display data */
struct GAL_PrivateVideoData {
int w, h;
void *buffer;
};
#endif /* _NEWGAL_DRMVIDEO_H */

View File

@@ -0,0 +1,5 @@
abs_top_srcdir=../../..
include Makefile.am
include ../../../rules.make