2 * Copyright (C) 2004-2006 Claudio Ciccani <klan@users.sf.net>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Based on glfbdev.c, written by Brian Paul.
29 #include <directfb_version.h>
31 #include <directfbgl.h>
33 #include <direct/mem.h>
34 #include <direct/messages.h>
35 #include <direct/interface.h>
41 #include "extensions.h"
42 #include "framebuffer.h"
43 #include "renderbuffer.h"
45 #include "texformat.h"
48 #include "array_cache/acache.h"
49 #include "swrast/swrast.h"
50 #include "swrast_setup/swrast_setup.h"
52 #include "tnl/t_context.h"
53 #include "tnl/t_pipeline.h"
54 #include "drivers/common/driverfuncs.h"
57 #define VERSION_CODE( M, m, r ) (((M) * 1000) + ((m) * 100) + ((r)))
58 #define DIRECTFB_VERSION_CODE VERSION_CODE( DIRECTFB_MAJOR_VERSION, \
59 DIRECTFB_MINOR_VERSION, \
60 DIRECTFB_MICRO_VERSION )
67 Construct( IDirectFBGL
*thiz
,
68 IDirectFBSurface
*surface
);
70 #include <direct/interface_implementation.h>
72 DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBGL
, Mesa
)
75 * private data struct of IDirectFBGL
78 int ref
; /* reference counter */
82 IDirectFBSurface
*surface
;
83 DFBSurfacePixelFormat format
;
94 GLframebuffer framebuffer
;
96 struct gl_renderbuffer render
;
99 /******************************************************************************/
101 static pthread_mutex_t global_lock
= PTHREAD_MUTEX_INITIALIZER
;
102 static unsigned int global_ref
= 0;
104 static inline int directfbgl_init( void )
106 pthread_mutexattr_t attr
;
112 pthread_mutexattr_init( &attr
);
113 pthread_mutexattr_settype( &attr
, PTHREAD_MUTEX_ERRORCHECK
);
114 ret
= pthread_mutex_init( &global_lock
, &attr
);
115 pthread_mutexattr_destroy( &attr
);
120 static inline void directfbgl_finish( void )
122 if (--global_ref
== 0)
123 pthread_mutex_destroy( &global_lock
);
126 #define directfbgl_lock() pthread_mutex_lock( &global_lock )
127 #define directfbgl_unlock() pthread_mutex_unlock( &global_lock )
129 /******************************************************************************/
131 static bool directfbgl_init_visual ( GLvisual
*visual
,
132 DFBSurfacePixelFormat format
);
133 static bool directfbgl_create_context ( GLcontext
*context
,
134 GLframebuffer
*framebuffer
,
136 DFBSurfacePixelFormat format
,
137 IDirectFBGL_data
*data
);
138 static void directfbgl_destroy_context( GLcontext
*context
,
139 GLframebuffer
*framebuffer
);
141 /******************************************************************************/
145 IDirectFBGL_Mesa_Destruct( IDirectFBGL
*thiz
)
147 IDirectFBGL_data
*data
= (IDirectFBGL_data
*) thiz
->priv
;
149 directfbgl_destroy_context( &data
->context
, &data
->framebuffer
);
152 data
->surface
->Release( data
->surface
);
154 DIRECT_DEALLOCATE_INTERFACE( thiz
);
160 IDirectFBGL_Mesa_AddRef( IDirectFBGL
*thiz
)
162 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
);
170 IDirectFBGL_Mesa_Release( IDirectFBGL
*thiz
)
172 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
)
174 if (--data
->ref
== 0)
175 IDirectFBGL_Mesa_Destruct( thiz
);
181 IDirectFBGL_Mesa_Lock( IDirectFBGL
*thiz
)
183 IDirectFBSurface
*surface
;
188 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
);
195 if (directfbgl_lock())
198 surface
= data
->surface
;
199 surface
->GetSize( surface
, &width
, &height
);
201 ret
= surface
->Lock( surface
, DSLF_READ
| DSLF_WRITE
,
202 (void*)&data
->video
.start
, &data
->video
.pitch
);
204 D_ERROR( "DirectFBGL/Mesa: couldn't lock surface.\n" );
208 data
->video
.end
= data
->video
.start
+ (height
-1) * data
->video
.pitch
;
210 data
->render
.Data
= data
->video
.start
;
212 _mesa_make_current( &data
->context
,
213 &data
->framebuffer
, &data
->framebuffer
);
215 if (data
->width
!= width
|| data
->height
!= height
) {
216 _mesa_resize_framebuffer( &data
->context
,
217 &data
->framebuffer
, width
, height
);
219 data
->height
= height
;
228 IDirectFBGL_Mesa_Unlock( IDirectFBGL
*thiz
)
230 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
);
235 if (--data
->locked
== 0) {
236 _mesa_make_current( NULL
, NULL
, NULL
);
238 data
->surface
->Unlock( data
->surface
);
247 IDirectFBGL_Mesa_GetAttributes( IDirectFBGL
*thiz
,
248 DFBGLAttributes
*attributes
)
250 DFBSurfaceCapabilities caps
;
253 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
);
258 data
->surface
->GetCapabilities( data
->surface
, &caps
);
260 visual
= &data
->visual
;
262 attributes
->buffer_size
= visual
->rgbBits
? : visual
->indexBits
;
263 attributes
->depth_size
= visual
->depthBits
;
264 attributes
->stencil_size
= visual
->stencilBits
;
265 attributes
->aux_buffers
= visual
->numAuxBuffers
;
266 attributes
->red_size
= visual
->redBits
;
267 attributes
->green_size
= visual
->greenBits
;
268 attributes
->blue_size
= visual
->blueBits
;
269 attributes
->alpha_size
= visual
->alphaBits
;
270 attributes
->accum_red_size
= visual
->accumRedBits
;
271 attributes
->accum_green_size
= visual
->accumGreenBits
;
272 attributes
->accum_blue_size
= visual
->accumBlueBits
;
273 attributes
->accum_alpha_size
= visual
->accumAlphaBits
;
274 attributes
->double_buffer
= ((caps
& DSCAPS_FLIPPING
) != 0);
275 attributes
->stereo
= (visual
->stereoMode
!= 0);
280 #if DIRECTFBGL_INTERFACE_VERSION >= 1
282 IDirectFBGL_Mesa_GetProcAddress( IDirectFBGL
*thiz
,
286 DIRECT_INTERFACE_GET_DATA( IDirectFBGL
);
294 *ret_address
= _glapi_get_proc_address( name
);
296 return (*ret_address
) ? DFB_OK
: DFB_UNSUPPORTED
;
301 /* exported symbols */
310 Construct( IDirectFBGL
*thiz
, IDirectFBSurface
*surface
)
314 /* Initialize global resources. */
315 if (directfbgl_init())
318 /* Allocate interface data. */
319 DIRECT_ALLOCATE_INTERFACE_DATA( thiz
, IDirectFBGL
);
321 /* Initialize interface data. */
324 /* Duplicate destination surface. */
325 ret
= surface
->GetSubSurface( surface
, NULL
, &data
->surface
);
327 IDirectFBGL_Mesa_Destruct( thiz
);
331 data
->surface
->GetPixelFormat( data
->surface
, &data
->format
);
332 data
->surface
->GetSize( data
->surface
, &data
->width
, &data
->height
);
334 /* Configure visual. */
335 if (!directfbgl_init_visual( &data
->visual
, data
->format
)) {
336 D_ERROR( "DirectFBGL/Mesa: failed to initialize visual.\n" );
337 IDirectFBGL_Mesa_Destruct( thiz
);
338 return DFB_UNSUPPORTED
;
341 /* Create context. */
342 if (!directfbgl_create_context( &data
->context
, &data
->framebuffer
,
343 &data
->visual
, data
->format
, data
)) {
344 D_ERROR( "DirectFBGL/Mesa: failed to create context.\n" );
345 IDirectFBGL_Mesa_Destruct( thiz
);
346 return DFB_UNSUPPORTED
;
349 /* Assign interface pointers. */
350 thiz
->AddRef
= IDirectFBGL_Mesa_AddRef
;
351 thiz
->Release
= IDirectFBGL_Mesa_Release
;
352 thiz
->Lock
= IDirectFBGL_Mesa_Lock
;
353 thiz
->Unlock
= IDirectFBGL_Mesa_Unlock
;
354 thiz
->GetAttributes
= IDirectFBGL_Mesa_GetAttributes
;
355 #if DIRECTFBGL_INTERFACE_VERSION >= 1
356 thiz
->GetProcAddress
= IDirectFBGL_Mesa_GetProcAddress
;
363 /***************************** Driver functions ******************************/
365 static const GLubyte
*
366 dfbGetString( GLcontext
*ctx
, GLenum pname
)
372 dfbUpdateState( GLcontext
*ctx
, GLuint new_state
)
374 _swrast_InvalidateState( ctx
, new_state
);
375 _swsetup_InvalidateState( ctx
, new_state
);
376 _ac_InvalidateState( ctx
, new_state
);
377 _tnl_InvalidateState( ctx
, new_state
);
381 dfbGetBufferSize( GLframebuffer
*buffer
, GLuint
*width
, GLuint
*height
)
383 GLcontext
*ctx
= _mesa_get_current_context();
384 IDirectFBGL_data
*data
= (IDirectFBGL_data
*) ctx
->DriverCtx
;
386 *width
= (GLuint
) data
->width
;
387 *height
= (GLuint
) data
->height
;
391 * We only implement this function as a mechanism to check if the
392 * framebuffer size has changed (and update corresponding state).
395 dfbSetViewport( GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
)
397 /* Nothing to do (the surface can't be resized while it's locked). */
402 dfbClear( GLcontext
*ctx
, GLbitfield mask
)
404 IDirectFBGL_data
*data
= (IDirectFBGL_data
*) ctx
->DriverCtx
;
406 #define BUFFER_BIT_MASK (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT | \
407 BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT )
408 if (mask
& BUFFER_BIT_MASK
&&
409 ctx
->Color
.ColorMask
[0] &&
410 ctx
->Color
.ColorMask
[1] &&
411 ctx
->Color
.ColorMask
[2] &&
412 ctx
->Color
.ColorMask
[3])
417 UNCLAMPED_FLOAT_TO_UBYTE( a
, ctx
->Color
.ClearColor
[ACOMP
] );
418 UNCLAMPED_FLOAT_TO_UBYTE( r
, ctx
->Color
.ClearColor
[RCOMP
] );
419 UNCLAMPED_FLOAT_TO_UBYTE( g
, ctx
->Color
.ClearColor
[GCOMP
] );
420 UNCLAMPED_FLOAT_TO_UBYTE( b
, ctx
->Color
.ClearColor
[BCOMP
] );
422 clip
.x1
= ctx
->DrawBuffer
->_Xmin
;
423 clip
.y1
= ctx
->DrawBuffer
->_Ymin
;
424 clip
.x2
= ctx
->DrawBuffer
->_Xmax
- 1;
425 clip
.y2
= ctx
->DrawBuffer
->_Ymax
- 1;
426 data
->surface
->SetClip( data
->surface
, &clip
);
428 data
->surface
->Unlock( data
->surface
);
430 data
->surface
->Clear( data
->surface
, r
, g
, b
, a
);
432 data
->surface
->Lock( data
->surface
, DSLF_READ
| DSLF_WRITE
,
433 (void*)&data
->video
.start
, &data
->video
.pitch
);
434 data
->video
.end
= data
->video
.start
+ (data
->height
-1) * data
->video
.pitch
;
435 data
->render
.Data
= data
->video
.start
;
437 mask
&= ~BUFFER_BIT_MASK
;
439 #undef BUFFER_BIT_MASK
442 _swrast_Clear( ctx
, mask
);
446 /************************ RenderBuffer functions *****************************/
449 dfbDeleteRenderbuffer( struct gl_renderbuffer
*render
)
455 dfbRenderbufferStorage( GLcontext
*ctx
, struct gl_renderbuffer
*render
,
456 GLenum internalFormat
, GLuint width
, GLuint height
)
462 /***************************** Span functions ********************************/
465 #define NAME(PREFIX) PREFIX##_RGB332
466 #define FORMAT GL_RGBA8
467 #define RB_TYPE GLubyte
469 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
470 #define INIT_PIXEL_PTR(P, X, Y) \
471 GLubyte *P = data->video.end - (Y) * data->video.pitch + (X);
472 #define INC_PIXEL_PTR(P) P += 1
473 #define STORE_PIXEL(P, X, Y, S) \
474 *P = ( (((S[RCOMP]) & 0xe0) ) | \
475 (((S[GCOMP]) & 0xe0) >> 3) | \
476 (((S[BCOMP]) ) >> 6) )
477 #define FETCH_PIXEL(D, P) \
478 D[RCOMP] = ((*P & 0xe0) ); \
479 D[GCOMP] = ((*P & 0x1c) << 3); \
480 D[BCOMP] = ((*P & 0x03) << 6); \
483 #include "swrast/s_spantemp.h"
486 #define NAME(PREFIX) PREFIX##_ARGB4444
487 #define FORMAT GL_RGBA8
488 #define RB_TYPE GLubyte
490 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
491 #define INIT_PIXEL_PTR(P, X, Y) \
492 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
493 #define INC_PIXEL_PTR(P) P += 1
494 #define STORE_PIXEL_RGB(P, X, Y, S) \
496 (((S[RCOMP]) & 0xf0) << 4) | \
497 (((S[GCOMP]) & 0xf0) ) | \
498 (((S[BCOMP]) & 0xf0) >> 4) )
499 #define STORE_PIXEL(P, X, Y, S) \
500 *P = ( (((S[ACOMP]) & 0xf0) << 8) | \
501 (((S[RCOMP]) & 0xf0) << 4) | \
502 (((S[GCOMP]) & 0xf0) ) | \
503 (((S[BCOMP]) & 0xf0) >> 4) )
504 #define FETCH_PIXEL(D, P) \
505 D[RCOMP] = ((*P & 0x0f00) >> 4); \
506 D[GCOMP] = ((*P & 0x00f0) ); \
507 D[BCOMP] = ((*P & 0x000f) << 4); \
508 D[ACOMP] = ((*P & 0xf000) >> 8)
510 #include "swrast/s_spantemp.h"
513 #define NAME(PREFIX) PREFIX##_ARGB2554
514 #define FORMAT GL_RGBA8
515 #define RB_TYPE GLubyte
517 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
518 #define INIT_PIXEL_PTR(P, X, Y) \
519 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
520 #define INC_PIXEL_PTR(P) P += 1
521 #define STORE_PIXEL_RGB(P, X, Y, S) \
523 (((S[RCOMP]) & 0xf8) << 6) | \
524 (((S[GCOMP]) & 0xf8) << 1) | \
525 (((S[BCOMP]) & 0xf0) >> 4) )
526 #define STORE_PIXEL(P, X, Y, S) \
527 *P = ( (((S[ACOMP]) & 0xc0) << 8) | \
528 (((S[RCOMP]) & 0xf8) << 6) | \
529 (((S[GCOMP]) & 0xf8) << 1) | \
530 (((S[BCOMP]) & 0xf0) >> 4) )
531 #define FETCH_PIXEL(D, P) \
532 D[RCOMP] = ((*P & 0x3e00) >> 9); \
533 D[GCOMP] = ((*P & 0x01f0) >> 4); \
534 D[BCOMP] = ((*P & 0x000f) << 4); \
535 D[ACOMP] = ((*P & 0xc000) >> 14)
537 #include "swrast/s_spantemp.h"
540 #define NAME(PREFIX) PREFIX##_ARGB1555
541 #define FORMAT GL_RGBA8
542 #define RB_TYPE GLubyte
544 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
545 #define INIT_PIXEL_PTR(P, X, Y) \
546 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
547 #define INC_PIXEL_PTR(P) P += 1
548 #define STORE_PIXEL_RGB(P, X, Y, S) \
550 (((S[RCOMP]) & 0xf8) << 7) | \
551 (((S[GCOMP]) & 0xf8) << 2) | \
552 (((S[BCOMP]) ) >> 3) )
553 #define STORE_PIXEL(P, X, Y, S) \
554 *P = ( (((S[ACOMP]) & 0x80) << 16) | \
555 (((S[RCOMP]) & 0xf8) << 7) | \
556 (((S[GCOMP]) & 0xf8) << 2) | \
557 (((S[BCOMP]) ) >> 3) )
558 #define FETCH_PIXEL(D, P) \
559 D[RCOMP] = ((*P & 0x7c00) >> 7); \
560 D[GCOMP] = ((*P & 0x03e0) >> 2); \
561 D[BCOMP] = ((*P & 0x001f) << 3); \
562 D[ACOMP] = ((*P & 0x8000) ? 0xff : 0)
564 #include "swrast/s_spantemp.h"
567 #define NAME(PREFIX) PREFIX##_RGB16
568 #define FORMAT GL_RGBA8
569 #define RB_TYPE GLubyte
571 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
572 #define INIT_PIXEL_PTR(P, X, Y) \
573 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
574 #define INC_PIXEL_PTR(P) P += 1
575 #define STORE_PIXEL(P, X, Y, S) \
576 *P = ( (((S[RCOMP]) & 0xf8) << 8) | \
577 (((S[GCOMP]) & 0xfc) << 3) | \
578 (((S[BCOMP]) ) >> 3) )
579 #define FETCH_PIXEL(D, P) \
580 D[RCOMP] = ((*P & 0xf800) >> 8); \
581 D[GCOMP] = ((*P & 0x07e0) >> 3); \
582 D[BCOMP] = ((*P & 0x001f) << 3); \
585 #include "swrast/s_spantemp.h"
588 #define NAME(PREFIX) PREFIX##_RGB24
589 #define FORMAT GL_RGBA8
590 #define RB_TYPE GLubyte
592 IDirectFBGL_data *data = ctx->DriverCtx;
593 #define INIT_PIXEL_PTR(P, X, Y) \
594 GLubyte *P = data->video.end - (Y) * data->video.pitch + (X) * 3;
595 #define INC_PIXEL_PTR(P) P += 3
596 #define STORE_PIXEL(P, X, Y, S) \
597 P[0] = S[BCOMP]; P[1] = S[GCOMP]; P[2] = S[BCOMP]
598 #define FETCH_PIXEL(D, P) \
599 D[RCOMP] = P[2]; D[GCOMP] = P[1]; D[BCOMP] = P[0]; D[ACOMP] = 0xff
601 #include "swrast/s_spantemp.h"
604 #define NAME(PREFIX) PREFIX##_RGB32
605 #define FORMAT GL_RGBA8
606 #define RB_TYPE GLubyte
608 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
609 #define INIT_PIXEL_PTR(P, X, Y) \
610 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
611 #define INC_PIXEL_PTR(P) P += 1
612 #define STORE_PIXEL(P, X, Y, S) \
613 *P = ( ((S[RCOMP]) << 16) | \
614 ((S[GCOMP]) << 8) | \
616 #define FETCH_PIXEL(D, P) \
617 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
618 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
619 D[BCOMP] = ((*P & 0x000000ff) ); \
622 #include "swrast/s_spantemp.h"
625 #define NAME(PREFIX) PREFIX##_ARGB
626 #define FORMAT GL_RGBA8
627 #define RB_TYPE GLubyte
629 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
630 #define INIT_PIXEL_PTR(P, X, Y) \
631 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
632 #define INC_PIXEL_PTR(P) P += 1
633 #define STORE_PIXEL_RGB(P, X, Y, S) \
634 *P = ( 0xff000000 | \
635 ((S[RCOMP]) << 16) | \
636 ((S[GCOMP]) << 8) | \
638 #define STORE_PIXEL(P, X, Y, S) \
639 *P = ( ((S[ACOMP]) << 24) | \
640 ((S[RCOMP]) << 16) | \
641 ((S[GCOMP]) << 8) | \
643 #define FETCH_PIXEL(D, P) \
644 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
645 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
646 D[BCOMP] = ((*P & 0x000000ff) ); \
647 D[ACOMP] = ((*P & 0xff000000) >> 24)
649 #include "swrast/s_spantemp.h"
652 #define NAME(PREFIX) PREFIX##_AiRGB
653 #define FORMAT GL_RGBA8
654 #define RB_TYPE GLubyte
656 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
657 #define INIT_PIXEL_PTR(P, X, Y) \
658 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
659 #define INC_PIXEL_PTR(P) P += 1
660 #define STORE_PIXEL_RGB(P, X, Y, S) \
661 *P = ( ((S[RCOMP]) << 16) | \
662 ((S[GCOMP]) << 8) | \
664 #define STORE_PIXEL(P, X, Y, S) \
665 *P = ( (((S[ACOMP]) ^ 0xff) << 24) | \
666 (((S[RCOMP]) ) << 16) | \
667 (((S[GCOMP]) ) << 8) | \
669 #define FETCH_PIXEL(D, P) \
670 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
671 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
672 D[BCOMP] = ((*P & 0x000000ff) ); \
673 D[ACOMP] = (((*P & 0xff000000) >> 24) ^ 0xff)
675 #include "swrast/s_spantemp.h"
678 /*****************************************************************************/
681 directfbgl_init_visual( GLvisual
*visual
,
682 DFBSurfacePixelFormat format
)
684 GLboolean rgbFlag
= GL_TRUE
;
685 GLboolean dbFlag
= GL_FALSE
;
686 GLboolean stereoFlag
= GL_FALSE
;
693 GLint stencilBits
= 0;
694 GLint accumRedBits
= 0;
695 GLint accumGreenBits
= 0;
696 GLint accumBlueBits
= 0;
697 GLint accumAlphaBits
= 0;
698 GLint numSamples
= 0;
700 /* FIXME: LUT8 support. */
740 D_WARN( "unsupported pixelformat" );
745 accumRedBits
= redBits
;
746 accumGreenBits
= greenBits
;
747 accumBlueBits
= blueBits
;
748 accumAlphaBits
= alphaBits
;
749 depthBits
= redBits
+ greenBits
+ blueBits
;
750 stencilBits
= alphaBits
;
754 return _mesa_initialize_visual( visual
,
755 rgbFlag
, dbFlag
, stereoFlag
,
756 redBits
, greenBits
, blueBits
, alphaBits
,
757 indexBits
, depthBits
, stencilBits
,
758 accumRedBits
, accumGreenBits
,
759 accumBlueBits
, accumAlphaBits
,
764 directfbgl_create_context( GLcontext
*context
,
765 GLframebuffer
*framebuffer
,
767 DFBSurfacePixelFormat format
,
768 IDirectFBGL_data
*data
)
770 struct dd_function_table functions
;
772 _mesa_initialize_framebuffer( framebuffer
, visual
);
774 _mesa_init_driver_functions( &functions
);
775 functions
.GetString
= dfbGetString
;
776 functions
.UpdateState
= dfbUpdateState
;
777 functions
.GetBufferSize
= dfbGetBufferSize
;
778 functions
.Viewport
= dfbSetViewport
;
779 functions
.Clear
= dfbClear
;
781 if (!_mesa_initialize_context( context
, visual
, NULL
,
782 &functions
, (void*) data
)) {
783 D_DEBUG( "DirectFBGL/Mesa: _mesa_initialize_context() failed.\n" );
784 _mesa_free_framebuffer_data( framebuffer
);
788 _swrast_CreateContext( context
);
789 _ac_CreateContext( context
);
790 _tnl_CreateContext( context
);
791 _swsetup_CreateContext( context
);
792 _swsetup_Wakeup( context
);
794 _mesa_init_renderbuffer( &data
->render
, 0 );
795 data
->render
.InternalFormat
= GL_RGBA
;
796 data
->render
._BaseFormat
= GL_RGBA
;
797 data
->render
.DataType
= GL_UNSIGNED_BYTE
;
798 data
->render
.Data
= data
->video
.start
;
799 data
->render
.Delete
= dfbDeleteRenderbuffer
;
800 data
->render
.AllocStorage
= dfbRenderbufferStorage
;
804 data
->render
.GetRow
= get_row_RGB332
;
805 data
->render
.GetValues
= get_values_RGB332
;
806 data
->render
.PutRow
= put_row_RGB332
;
807 data
->render
.PutRowRGB
= put_row_rgb_RGB332
;
808 data
->render
.PutMonoRow
= put_mono_row_RGB332
;
809 data
->render
.PutValues
= put_values_RGB332
;
810 data
->render
.PutMonoValues
= put_mono_values_RGB332
;
813 data
->render
.GetRow
= get_row_ARGB4444
;
814 data
->render
.GetValues
= get_values_ARGB4444
;
815 data
->render
.PutRow
= put_row_ARGB4444
;
816 data
->render
.PutRowRGB
= put_row_rgb_ARGB4444
;
817 data
->render
.PutMonoRow
= put_mono_row_ARGB4444
;
818 data
->render
.PutValues
= put_values_ARGB4444
;
819 data
->render
.PutMonoValues
= put_mono_values_ARGB4444
;
822 data
->render
.GetRow
= get_row_ARGB2554
;
823 data
->render
.GetValues
= get_values_ARGB2554
;
824 data
->render
.PutRow
= put_row_ARGB2554
;
825 data
->render
.PutRowRGB
= put_row_rgb_ARGB2554
;
826 data
->render
.PutMonoRow
= put_mono_row_ARGB2554
;
827 data
->render
.PutValues
= put_values_ARGB2554
;
828 data
->render
.PutMonoValues
= put_mono_values_ARGB2554
;
831 data
->render
.GetRow
= get_row_ARGB1555
;
832 data
->render
.GetValues
= get_values_ARGB1555
;
833 data
->render
.PutRow
= put_row_ARGB1555
;
834 data
->render
.PutRowRGB
= put_row_rgb_ARGB1555
;
835 data
->render
.PutMonoRow
= put_mono_row_ARGB1555
;
836 data
->render
.PutValues
= put_values_ARGB1555
;
837 data
->render
.PutMonoValues
= put_mono_values_ARGB1555
;
840 data
->render
.GetRow
= get_row_RGB16
;
841 data
->render
.GetValues
= get_values_RGB16
;
842 data
->render
.PutRow
= put_row_RGB16
;
843 data
->render
.PutRowRGB
= put_row_rgb_RGB16
;
844 data
->render
.PutMonoRow
= put_mono_row_RGB16
;
845 data
->render
.PutValues
= put_values_RGB16
;
846 data
->render
.PutMonoValues
= put_mono_values_RGB16
;
849 data
->render
.GetRow
= get_row_RGB24
;
850 data
->render
.GetValues
= get_values_RGB24
;
851 data
->render
.PutRow
= put_row_RGB24
;
852 data
->render
.PutRowRGB
= put_row_rgb_RGB24
;
853 data
->render
.PutMonoRow
= put_mono_row_RGB24
;
854 data
->render
.PutValues
= put_values_RGB24
;
855 data
->render
.PutMonoValues
= put_mono_values_RGB24
;
858 data
->render
.GetRow
= get_row_RGB32
;
859 data
->render
.GetValues
= get_values_RGB32
;
860 data
->render
.PutRow
= put_row_RGB32
;
861 data
->render
.PutRowRGB
= put_row_rgb_RGB32
;
862 data
->render
.PutMonoRow
= put_mono_row_RGB32
;
863 data
->render
.PutValues
= put_values_RGB32
;
864 data
->render
.PutMonoValues
= put_mono_values_RGB32
;
867 data
->render
.GetRow
= get_row_ARGB
;
868 data
->render
.GetValues
= get_values_ARGB
;
869 data
->render
.PutRow
= put_row_ARGB
;
870 data
->render
.PutRowRGB
= put_row_rgb_ARGB
;
871 data
->render
.PutMonoRow
= put_mono_row_ARGB
;
872 data
->render
.PutValues
= put_values_ARGB
;
873 data
->render
.PutMonoValues
= put_mono_values_ARGB
;
876 data
->render
.GetRow
= get_row_AiRGB
;
877 data
->render
.GetValues
= get_values_AiRGB
;
878 data
->render
.PutRow
= put_row_AiRGB
;
879 data
->render
.PutRowRGB
= put_row_rgb_AiRGB
;
880 data
->render
.PutMonoRow
= put_mono_row_AiRGB
;
881 data
->render
.PutValues
= put_values_AiRGB
;
882 data
->render
.PutMonoValues
= put_mono_values_AiRGB
;
885 D_BUG( "unexpected pixelformat" );
889 _mesa_add_renderbuffer( framebuffer
, BUFFER_FRONT_LEFT
, &data
->render
);
891 _mesa_add_soft_renderbuffers( framebuffer
,
893 visual
->haveDepthBuffer
,
894 visual
->haveStencilBuffer
,
895 visual
->haveAccumBuffer
,
899 TNL_CONTEXT( context
)->Driver
.RunPipeline
= _tnl_run_pipeline
;
901 _mesa_enable_sw_extensions( context
);
907 directfbgl_destroy_context( GLcontext
*context
,
908 GLframebuffer
*framebuffer
)
910 _mesa_free_framebuffer_data( framebuffer
);
911 _mesa_notifyDestroy( context
);
912 _mesa_free_context_data( context
);