Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Panfrost
mesa
Commits
81ca616e
Commit
81ca616e
authored
Jan 03, 2005
by
Brian Paul
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DirectFB driver (Claudio Ciccani)
parent
6563c16e
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
849 additions
and
1 deletion
+849
-1
Makefile
Makefile
+8
-1
configs/linux-directfb
configs/linux-directfb
+29
-0
docs/README.directfb
docs/README.directfb
+28
-0
include/GL/directfbgl.h
include/GL/directfbgl.h
+89
-0
src/mesa/drivers/directfb/Makefile
src/mesa/drivers/directfb/Makefile
+53
-0
src/mesa/drivers/directfb/idirectfbgl_mesa.c
src/mesa/drivers/directfb/idirectfbgl_mesa.c
+642
-0
No files found.
Makefile
View file @
81ca616e
...
...
@@ -33,7 +33,11 @@ realclean:
install
:
@
echo
"Installing"
$(TOP)
/bin/installmesa
$(TOP)
/bin/installmesa
# DirectFBGL module installation
linux-directfb-install
:
cd
src/mesa/drivers/directfb
&&
$(MAKE)
install
# If there's no current configuration file
$(TOP)/configs/current
:
...
...
@@ -78,6 +82,7 @@ linux \
linux-alpha
\
linux-alpha-static
\
linux-debug
\
linux-directfb
\
linux-dri
\
linux-dri-x86
\
linux-dri-x86-64
\
...
...
@@ -201,6 +206,8 @@ LIB_FILES = \
$(DIRECTORY)
/src/mesa/drivers/beos/Makefile
\
$(DIRECTORY)
/src/mesa/drivers/common/
*
.[ch]
\
$(DIRECTORY)
/src/mesa/drivers/common/descrip.mms
\
$(DIRECTORY)
/src/mesa/drivers/directfb/
*
.[ch]
\
$(DIRECTORY)
/src/mesa/drivers/directfb/Makefile
\
$(DIRECTORY)
/src/mesa/drivers/dos/
*
.[chS]
\
$(DIRECTORY)
/src/mesa/drivers/dri/common/
*
.[ch]
\
$(DIRECTORY)
/src/mesa/drivers/fbdev/glfbdev.c
\
...
...
configs/linux-directfb
0 → 100644
View file @
81ca616e
# Configuration for DirectFB
include $(TOP)/configs/default
CONFIG_NAME = linux-directfb
# Compiler and flags
CC = gcc
CXX = g++
CFLAGS = -Wall -O3 -ffast-math -fPIC -std=c99 -D_GNU_SOURCE -D_POSIX_SOURCE -D_SVID_SOURCE \
-D_POSIX_C_SOURCE=199309L -D_BSD_SOURCE -DPTHREADS
CXXFLAGS = -Wall -O3 -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE
HAVE_X86 = $(shell uname -m | grep 'i[3-6]86' >/dev/null && echo yes)
ifeq ($(HAVE_X86), yes)
CFLAGS += -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM
CXXFLAGS += -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM
ASM_SOURCES = $(X86_SOURCES) $(X86_API)
endif
# Directories
SRC_DIRS = mesa glu
DRIVER_DIRS = directfb
PROGRAM_DIRS = # disabled
# Library/program dependencies
GL_LIB_DEPS = -lm -lpthread
docs/README.directfb
0 → 100644
View file @
81ca616e
Mesa DirectFB Information
Requirements
============
To build Mesa with DirectFB (DirectFBGL) support you need:
- DirectFB at least 0.9.21 (http://directfb.org)
- pkg-config at least 0.9 (http://pkgconfig.sf.net)
Installation
============
Run
make linux-directfb
to build Mesa and DirectFBGL module,
make install
to install OpenGL libraries and
make linux-directfb-install
to install DirectFBGL module in the proper location.
include/GL/directfbgl.h
0 → 100644
View file @
81ca616e
/*
(c) Copyright 2001 convergence integrated media GmbH.
All rights reserved.
Written by Denis Oliver Kropp <dok@convergence.de> and
Andreas Hundt <andi@convergence.de>.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef __DIRECTFBGL_H__
#define __DIRECTFBGL_H__
#include <directfb.h>
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
struct
{
int
buffer_size
;
int
depth_size
;
int
stencil_size
;
int
aux_buffers
;
int
red_size
;
int
green_size
;
int
blue_size
;
int
alpha_size
;
int
accum_red_size
;
int
accum_green_size
;
int
accum_blue_size
;
int
accum_alpha_size
;
DFBBoolean
double_buffer
;
DFBBoolean
stereo
;
}
DFBGLAttributes
;
DEFINE_INTERFACE
(
IDirectFBGL
,
/** Context handling **/
/*
* Acquire the hardware lock.
*/
DFBResult
(
*
Lock
)
(
IDirectFBGL
*
thiz
);
/*
* Release the lock.
*/
DFBResult
(
*
Unlock
)
(
IDirectFBGL
*
thiz
);
/*
* Query the OpenGL attributes.
*/
DFBResult
(
*
GetAttributes
)
(
IDirectFBGL
*
thiz
,
DFBGLAttributes
*
attributes
);
)
#ifdef __cplusplus
}
#endif
#endif
src/mesa/drivers/directfb/Makefile
0 → 100644
View file @
81ca616e
# src/mesa/drivers/directfb/Makefile
TOP
=
../../../..
include
$(TOP)/configs/current
INCLUDE_DIRS
=
\
-I
$(TOP)
/include
\
-I
$(TOP)
/src/mesa
\
-I
$(TOP)
/src/mesa/main
\
-I
$(TOP)
/src/mesa/glapi
\
-I
$(TOP)
/src/mesa/math
\
-I
$(TOP)
/src/mesa/tnl
\
-I
$(TOP)
/src/mesa/shader
\
-I
$(TOP)
/src/mesa/swrast
\
-I
$(TOP)
/src/mesa/swrast_setup
DFB_CFLAGS
=
$(
shell
pkg-config
--cflags
directfb
)
DFB_MODULEDIR
=
$(
shell
pkg-config
--variable
=
moduledir directfb-internal
)
DIRECTFBGL_MESA_SOURCES
=
../common/driverfuncs.c idirectfbgl_mesa.c
DIRECTFBGL_MESA_OBJECTS
=
$(DIRECTFBGL_MESA_SOURCES:.c=.o)
DIRECTFBGL_MESA
=
libidirectfbgl_mesa.so
.c.o
:
$(CC)
-c
$(INCLUDE_DIRS)
$(CFLAGS)
$(DFB_CFLAGS)
$<
-o
$@
default
:
directfbgl_mesa
# Mesa DirectFBGL module
directfbgl_mesa
:
$(DIRECTFBGL_MESA_OBJECTS)
$(CC)
-shared
$(CFLAGS)
$(DIRECTFBGL_MESA_OBJECTS)
-o
$(DIRECTFBGL_MESA)
\
-Wl
,-soname
-Wl
,
$(DIRECTFBGL_MESA)
-L
$(TOP)
/lib
-lGL
-lm
install
:
@
if
test
-d
$(DFB_MODULEDIR)
;
then
\
echo
"Installing DirectFBGL module."
;
\
else
\
echo
"*** Failed to determine DirectFB module's directory."
;
\
echo
"*** Installation aborted."
;
\
exit
1
;
\
fi
;
install
-m
0755
$(DIRECTFBGL_MESA)
$(DFB_MODULEDIR)
/interfaces/IDirectFBGL/
clean
:
rm
-f
*
.o
*
.so
src/mesa/drivers/directfb/idirectfbgl_mesa.c
0 → 100644
View file @
81ca616e
/*
* Copyright (C) 2004 Claudio Ciccani <klan@users.sf.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
* Based on glfbdev.c, written by Brian Paul.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <directfb.h>
#include <direct/messages.h>
#include <direct/interface.h>
#include <direct/mem.h>
#ifdef CLAMP
# undef CLAMP
#endif
#include "GL/directfbgl.h"
#include "glheader.h"
#include "buffers.h"
#include "context.h"
#include "extensions.h"
#include "imports.h"
#include "texformat.h"
#include "teximage.h"
#include "texstore.h"
#include "array_cache/acache.h"
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#include "tnl/tnl.h"
#include "tnl/t_context.h"
#include "tnl/t_pipeline.h"
#include "drivers/common/driverfuncs.h"
static
DFBResult
Probe
(
void
*
data
);
static
DFBResult
Construct
(
IDirectFBGL
*
thiz
,
IDirectFBSurface
*
surface
);
#include <direct/interface_implementation.h>
DIRECT_INTERFACE_IMPLEMENTATION
(
IDirectFBGL
,
Mesa
)
/*
* private data struct of IDirectFBGL
*/
typedef
struct
{
int
ref
;
/* reference counter */
bool
locked
;
IDirectFBSurface
*
surface
;
DFBSurfacePixelFormat
format
;
int
width
;
int
height
;
struct
{
__u8
*
start
;
__u8
*
end
;
int
pitch
;
}
video
;
GLvisual
visual
;
GLframebuffer
framebuffer
;
GLcontext
context
;
}
IDirectFBGL_data
;
static
bool
dfb_mesa_setup_visual
(
GLvisual
*
visual
,
DFBSurfacePixelFormat
format
);
static
bool
dfb_mesa_create_context
(
GLcontext
*
context
,
GLframebuffer
*
framebuffer
,
GLvisual
*
visual
,
DFBSurfacePixelFormat
format
,
void
*
data
);
static
void
dfb_mesa_destroy_context
(
GLcontext
*
context
,
GLframebuffer
*
framebuffer
);
static
void
IDirectFBGL_Destruct
(
IDirectFBGL
*
thiz
)
{
IDirectFBGL_data
*
data
=
(
IDirectFBGL_data
*
)
thiz
->
priv
;
dfb_mesa_destroy_context
(
&
data
->
context
,
&
data
->
framebuffer
);
data
->
surface
->
Release
(
data
->
surface
);
DIRECT_DEALLOCATE_INTERFACE
(
thiz
);
}
static
DFBResult
IDirectFBGL_AddRef
(
IDirectFBGL
*
thiz
)
{
DIRECT_INTERFACE_GET_DATA
(
IDirectFBGL
);
data
->
ref
++
;
return
DFB_OK
;
}
static
DFBResult
IDirectFBGL_Release
(
IDirectFBGL
*
thiz
)
{
DIRECT_INTERFACE_GET_DATA
(
IDirectFBGL
)
if
(
--
data
->
ref
==
0
)
{
IDirectFBGL_Destruct
(
thiz
);
}
return
DFB_OK
;
}
static
DFBResult
IDirectFBGL_Lock
(
IDirectFBGL
*
thiz
)
{
IDirectFBSurface
*
surface
;
int
width
=
0
;
int
height
=
0
;
DFBResult
err
;
DIRECT_INTERFACE_GET_DATA
(
IDirectFBGL
);
if
(
data
->
locked
)
return
DFB_LOCKED
;
surface
=
data
->
surface
;
surface
->
GetSize
(
surface
,
&
width
,
&
height
);
err
=
surface
->
Lock
(
surface
,
DSLF_READ
|
DSLF_WRITE
,
(
void
**
)
&
data
->
video
.
start
,
&
data
->
video
.
pitch
);
if
(
err
!=
DFB_OK
)
{
D_ERROR
(
"DirectFBGL/Mesa: couldn't lock surface.
\n
"
);
return
err
;
}
data
->
video
.
end
=
data
->
video
.
start
+
(
height
-
1
)
*
data
->
video
.
pitch
;
if
(
data
->
width
!=
width
||
data
->
height
!=
height
)
{
data
->
width
=
width
;
data
->
height
=
height
;
_mesa_ResizeBuffersMESA
();
}
data
->
locked
=
true
;
return
DFB_OK
;
}
static
DFBResult
IDirectFBGL_Unlock
(
IDirectFBGL
*
thiz
)
{
DIRECT_INTERFACE_GET_DATA
(
IDirectFBGL
);
if
(
!
data
->
locked
)
return
DFB_OK
;
data
->
surface
->
Unlock
(
data
->
surface
);
data
->
video
.
start
=
NULL
;
data
->
video
.
end
=
NULL
;
data
->
locked
=
false
;
return
DFB_OK
;
}
static
DFBResult
IDirectFBGL_GetAttributes
(
IDirectFBGL
*
thiz
,
DFBGLAttributes
*
attributes
)
{
GLvisual
*
visual
;
DIRECT_INTERFACE_GET_DATA
(
IDirectFBGL
);
if
(
!
attributes
)
return
DFB_INVARG
;
visual
=
&
data
->
visual
;
attributes
->
buffer_size
=
visual
->
rgbBits
?
:
visual
->
indexBits
;
attributes
->
depth_size
=
visual
->
depthBits
;
attributes
->
stencil_size
=
visual
->
stencilBits
;
attributes
->
aux_buffers
=
visual
->
numAuxBuffers
;
attributes
->
red_size
=
visual
->
redBits
;
attributes
->
green_size
=
visual
->
greenBits
;
attributes
->
blue_size
=
visual
->
blueBits
;
attributes
->
alpha_size
=
visual
->
alphaBits
;
attributes
->
accum_red_size
=
visual
->
accumRedBits
;
attributes
->
accum_green_size
=
visual
->
accumGreenBits
;
attributes
->
accum_blue_size
=
visual
->
accumBlueBits
;
attributes
->
accum_alpha_size
=
visual
->
accumAlphaBits
;
attributes
->
double_buffer
=
(
visual
->
doubleBufferMode
!=
0
);
attributes
->
stereo
=
(
visual
->
stereoMode
!=
0
);
return
DFB_OK
;
}
/* exported symbols */
static
DFBResult
Probe
(
void
*
data
)
{
return
DFB_OK
;
}
static
DFBResult
Construct
(
IDirectFBGL
*
thiz
,
IDirectFBSurface
*
surface
)
{
/* Allocate interface data. */
DIRECT_ALLOCATE_INTERFACE_DATA
(
thiz
,
IDirectFBGL
);
/* Initialize interface data. */
data
->
ref
=
1
;
data
->
surface
=
surface
;
surface
->
AddRef
(
surface
);
surface
->
GetPixelFormat
(
surface
,
&
data
->
format
);
surface
->
GetSize
(
surface
,
&
data
->
width
,
&
data
->
height
);
/* Configure visual. */
if
(
!
dfb_mesa_setup_visual
(
&
data
->
visual
,
data
->
format
))
{
D_ERROR
(
"DirectFBGL/Mesa: failed to initialize visual.
\n
"
);
surface
->
Release
(
surface
);
return
DFB_UNSUPPORTED
;
}
/* Create context. */
if
(
!
dfb_mesa_create_context
(
&
data
->
context
,
&
data
->
framebuffer
,
&
data
->
visual
,
data
->
format
,
(
void
*
)
data
))
{
D_ERROR
(
"DirectFBGL/Mesa: failed to create context.
\n
"
);
surface
->
Release
(
surface
);
return
DFB_UNSUPPORTED
;
}
/* Assign interface pointers. */
thiz
->
AddRef
=
IDirectFBGL_AddRef
;
thiz
->
Release
=
IDirectFBGL_Release
;
thiz
->
Lock
=
IDirectFBGL_Lock
;
thiz
->
Unlock
=
IDirectFBGL_Unlock
;
thiz
->
GetAttributes
=
IDirectFBGL_GetAttributes
;
return
DFB_OK
;
}
/* internal functions */
static
const
GLubyte
*
get_string
(
GLcontext
*
ctx
,
GLenum
pname
)
{
switch
(
pname
)
{
case
GL_VENDOR
:
return
"Claudio Ciccani"
;
case
GL_VERSION
:
return
"1.0"
;
default:
return
NULL
;
}
}
static
void
update_state
(
GLcontext
*
ctx
,
GLuint
new_state
)
{
_swrast_InvalidateState
(
ctx
,
new_state
);
_swsetup_InvalidateState
(
ctx
,
new_state
);
_ac_InvalidateState
(
ctx
,
new_state
);
_tnl_InvalidateState
(
ctx
,
new_state
);
}
static
void
get_buffer_size
(
GLframebuffer
*
buffer
,
GLuint
*
width
,
GLuint
*
height
)
{
GLcontext
*
ctx
=
_mesa_get_current_context
();
IDirectFBGL_data
*
data
=
(
IDirectFBGL_data
*
)
ctx
->
DriverCtx
;
*
width
=
(
GLuint
)
data
->
width
;
*
height
=
(
GLuint
)
data
->
height
;
}
static
void
set_viewport
(
GLcontext
*
ctx
,
GLint
x
,
GLint
y
,
GLsizei
w
,
GLsizei
h
)
{
_mesa_ResizeBuffersMESA
();
}
/* required but not used */
static
void
set_buffer
(
GLcontext
*
ctx
,
GLframebuffer
*
buffer
,
GLuint
bufferBit
)
{
return
;
}
/* RGB332 */
#define NAME(PREFIX) PREFIX##_RGB332
#define SPAN_VARS \
IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
#define INIT_PIXEL_PTR(P, X, Y) \
GLubyte *P = data->video.end - (Y) * data->video.pitch + (X)
#define INC_PIXEL_PTR(P) P += 1
#define STORE_RGB_PIXEL(P, X, Y, R, G, B) \
*P = ( (((R) & 0xe0)) | (((G) & 0xe0) >> 3) | ((B) >> 6) )
#define STORE_RGBA_PIXEL(P, X, Y, R, G, B, A) \
*P = ( (((R) & 0xe0)) | (((G) & 0xe0) >> 3) | ((B) >> 6) )
#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
R = ((*P & 0xe0) ); \
G = ((*P & 0x1c) << 3); \
B = ((*P & 0x03) << 6); \
A = CHAN_MAX
#include "swrast/s_spantemp.h"
/* ARGB1555 */
#define NAME(PREFIX) PREFIX##_ARGB1555
#define SPAN_VARS \
IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
#define INIT_PIXEL_PTR(P, X, Y) \
GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2)
#define INC_PIXEL_PTR(P) P += 1
#define STORE_RGB_PIXEL(P, X, Y, R, G, B) \
*P = ( (((R) & 0xf8) << 7) | (((G) & 0xf8) << 2) | ((B) >> 3) )
#define STORE_RGBA_PIXEL(P, X, Y, R, G, B, A) \
*P = ( (((A) & 0x80) << 8) | (((R) & 0xf8) << 7) | (((G) & 0xf8) << 2) | ((B) >> 3) )
#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
R = ((*P & 0x7c00) >> 7); \
G = ((*P & 0x03e0) >> 2); \
B = ((*P & 0x001f) << 3); \
A = ((*P & 0x8000) ? 0xff : 0)
#include "swrast/s_spantemp.h"
/* RGB16 */
#define NAME(PREFIX) PREFIX##_RGB16
#define SPAN_VARS \
IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
#define INIT_PIXEL_PTR(P, X, Y) \
GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2)
#define INC_PIXEL_PTR(P) P += 1
#define STORE_RGB_PIXEL(P, X, Y, R, G, B) \
*P = ( (((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | ((B) >> 3) )
#define STORE_RGBA_PIXEL(P, X, Y, R, G, B, A) \
*P = ( (((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | ((B) >> 3) )
#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
R = ((*P & 0xf800) >> 8); \
G = ((*P & 0x07e0) >> 3); \
B = ((*P & 0x001f) << 3); \
A = CHAN_MAX
#include "swrast/s_spantemp.h"
/* RGB24 */
#define NAME(PREFIX) PREFIX##_RGB24
#define SPAN_VARS \
IDirectFBGL_data *data = ctx->DriverCtx;
#define INIT_PIXEL_PTR(P, X, Y) \
GLubyte *P = data->video.end - (Y) * data->video.pitch + (X) * 3
#define INC_PIXEL_PTR(P) P += 3
#define STORE_RGB_PIXEL(P, X, Y, R, G, B) \
P[0] = B; P[1] = G; P[2] = R
#define STORE_RGBA_PIXEL(P, X, Y, R, G, B, A) \
P[0] = B; P[1] = G; P[2] = R
#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
R = P[2]; G = P[1]; B = P[0]; A = CHAN_MAX
#include "swrast/s_spantemp.h"
/* RGB32 */
#define NAME(PREFIX) PREFIX##_RGB32
#define SPAN_VARS \
IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
#define INIT_PIXEL_PTR(P, X, Y) \
GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4)
#define INC_PIXEL_PTR(P) P += 1
#define STORE_RGB_PIXEL(P, X, Y, R, G, B)