2 * Copyright (C) 2004-2007 Claudio Ciccani <klan@directfb.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * Based on glfbdev.c, written by Brian Paul.
30 #include <directfb_version.h>
32 #include <directfbgl.h>
34 #include <direct/mem.h>
35 #include <direct/messages.h>
36 #include <direct/interface.h>
42 #include "extensions.h"
43 #include "framebuffer.h"
44 #include "renderbuffer.h"
46 #include "texformat.h"
50 #include "swrast/swrast.h"
51 #include "swrast_setup/swrast_setup.h"
53 #include "tnl/t_context.h"
54 #include "tnl/t_pipeline.h"
55 #include "drivers/common/driverfuncs.h"
58 #define VERSION_CODE( M, m, r ) (((M) * 1000) + ((m) * 100) + ((r)))
59 #define DIRECTFB_VERSION_CODE VERSION_CODE( DIRECTFB_MAJOR_VERSION, \
60 DIRECTFB_MINOR_VERSION, \
61 DIRECTFB_MICRO_VERSION )
68 Construct( IDirectFBGL
*thiz
,
69 IDirectFBSurface
*surface
);
71 #include <direct/interface_implementation.h>
73 DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBGL
, Mesa
)
76 * private data struct of IDirectFBGL
79 int ref
; /* reference counter */
83 IDirectFBSurface
*surface
;
84 DFBSurfacePixelFormat format
;
95 GLframebuffer framebuffer
;
97 struct gl_renderbuffer render
;
100 /******************************************************************************/
102 static pthread_mutex_t global_lock
= PTHREAD_MUTEX_INITIALIZER
;
103 static unsigned int global_ref
= 0;
105 static inline int directfbgl_init( void )
107 pthread_mutexattr_t attr
;
113 pthread_mutexattr_init( &attr
);
114 pthread_mutexattr_settype( &attr
, PTHREAD_MUTEX_ERRORCHECK
);
115 ret
= pthread_mutex_init( &global_lock
, &attr
);
116 pthread_mutexattr_destroy( &attr
);
121 static inline void directfbgl_finish( void )
123 if (--global_ref
== 0)
124 pthread_mutex_destroy( &global_lock
);
127 #define directfbgl_lock() pthread_mutex_lock( &global_lock )
128 #define directfbgl_unlock() pthread_mutex_unlock( &global_lock )
130 /******************************************************************************/
132 static bool directfbgl_init_visual ( GLvisual
*visual
,
133 DFBSurfacePixelFormat format
);
134 static bool directfbgl_create_context ( GLcontext
*context
,
135 GLframebuffer
*framebuffer
,
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
,
344 &data
->visual
, data
)) {
345 D_ERROR( "DirectFBGL/Mesa: failed to create context.\n" );
346 IDirectFBGL_Mesa_Destruct( thiz
);
347 return DFB_UNSUPPORTED
;
350 /* Assign interface pointers. */
351 thiz
->AddRef
= IDirectFBGL_Mesa_AddRef
;
352 thiz
->Release
= IDirectFBGL_Mesa_Release
;
353 thiz
->Lock
= IDirectFBGL_Mesa_Lock
;
354 thiz
->Unlock
= IDirectFBGL_Mesa_Unlock
;
355 thiz
->GetAttributes
= IDirectFBGL_Mesa_GetAttributes
;
356 #if DIRECTFBGL_INTERFACE_VERSION >= 1
357 thiz
->GetProcAddress
= IDirectFBGL_Mesa_GetProcAddress
;
364 /***************************** Driver functions ******************************/
366 static const GLubyte
*
367 dfbGetString( GLcontext
*ctx
, GLenum pname
)
373 dfbUpdateState( GLcontext
*ctx
, GLuint new_state
)
375 _swrast_InvalidateState( ctx
, new_state
);
376 _swsetup_InvalidateState( ctx
, new_state
);
377 _vbo_InvalidateState( ctx
, new_state
);
378 _tnl_InvalidateState( ctx
, new_state
);
382 dfbGetBufferSize( GLframebuffer
*buffer
, GLuint
*width
, GLuint
*height
)
384 GLcontext
*ctx
= _mesa_get_current_context();
385 IDirectFBGL_data
*data
= (IDirectFBGL_data
*) ctx
->DriverCtx
;
387 *width
= (GLuint
) data
->width
;
388 *height
= (GLuint
) data
->height
;
392 * We only implement this function as a mechanism to check if the
393 * framebuffer size has changed (and update corresponding state).
396 dfbSetViewport( GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
)
398 /* Nothing to do (the surface can't be resized while it's locked). */
403 dfbClear( GLcontext
*ctx
, GLbitfield mask
)
405 IDirectFBGL_data
*data
= (IDirectFBGL_data
*) ctx
->DriverCtx
;
407 #define BUFFER_BIT_MASK (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT | \
408 BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT )
409 if (mask
& BUFFER_BIT_MASK
&&
410 ctx
->Color
.ColorMask
[0] &&
411 ctx
->Color
.ColorMask
[1] &&
412 ctx
->Color
.ColorMask
[2] &&
413 ctx
->Color
.ColorMask
[3])
418 UNCLAMPED_FLOAT_TO_UBYTE( a
, ctx
->Color
.ClearColor
[ACOMP
] );
419 UNCLAMPED_FLOAT_TO_UBYTE( r
, ctx
->Color
.ClearColor
[RCOMP
] );
420 UNCLAMPED_FLOAT_TO_UBYTE( g
, ctx
->Color
.ClearColor
[GCOMP
] );
421 UNCLAMPED_FLOAT_TO_UBYTE( b
, ctx
->Color
.ClearColor
[BCOMP
] );
423 clip
.x1
= ctx
->DrawBuffer
->_Xmin
;
424 clip
.y1
= ctx
->DrawBuffer
->_Ymin
;
425 clip
.x2
= ctx
->DrawBuffer
->_Xmax
- 1;
426 clip
.y2
= ctx
->DrawBuffer
->_Ymax
- 1;
427 data
->surface
->SetClip( data
->surface
, &clip
);
429 data
->surface
->Unlock( data
->surface
);
431 data
->surface
->Clear( data
->surface
, r
, g
, b
, a
);
433 data
->surface
->Lock( data
->surface
, DSLF_READ
| DSLF_WRITE
,
434 (void*)&data
->video
.start
, &data
->video
.pitch
);
435 data
->video
.end
= data
->video
.start
+ (data
->height
-1) * data
->video
.pitch
;
436 data
->render
.Data
= data
->video
.start
;
438 mask
&= ~BUFFER_BIT_MASK
;
440 #undef BUFFER_BIT_MASK
443 _swrast_Clear( ctx
, mask
);
447 /************************ RenderBuffer functions *****************************/
450 dfbDeleteRenderbuffer( struct gl_renderbuffer
*render
)
456 dfbRenderbufferStorage( GLcontext
*ctx
, struct gl_renderbuffer
*render
,
457 GLenum internalFormat
, GLuint width
, GLuint height
)
463 /***************************** Span functions ********************************/
466 #define NAME(PREFIX) PREFIX##_RGB332
467 #define FORMAT GL_RGBA8
468 #define RB_TYPE GLubyte
470 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
471 #define INIT_PIXEL_PTR(P, X, Y) \
472 GLubyte *P = data->video.end - (Y) * data->video.pitch + (X);
473 #define INC_PIXEL_PTR(P) P += 1
474 #define STORE_PIXEL(P, X, Y, S) \
475 *P = ( (((S[RCOMP]) & 0xe0) ) | \
476 (((S[GCOMP]) & 0xe0) >> 3) | \
477 (((S[BCOMP]) ) >> 6) )
478 #define FETCH_PIXEL(D, P) \
479 D[RCOMP] = ((*P & 0xe0) ); \
480 D[GCOMP] = ((*P & 0x1c) << 3); \
481 D[BCOMP] = ((*P & 0x03) << 6); \
484 #include "swrast/s_spantemp.h"
487 #define NAME(PREFIX) PREFIX##_ARGB4444
488 #define FORMAT GL_RGBA8
489 #define RB_TYPE GLubyte
491 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
492 #define INIT_PIXEL_PTR(P, X, Y) \
493 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
494 #define INC_PIXEL_PTR(P) P += 1
495 #define STORE_PIXEL_RGB(P, X, Y, S) \
497 (((S[RCOMP]) & 0xf0) << 4) | \
498 (((S[GCOMP]) & 0xf0) ) | \
499 (((S[BCOMP]) & 0xf0) >> 4) )
500 #define STORE_PIXEL(P, X, Y, S) \
501 *P = ( (((S[ACOMP]) & 0xf0) << 8) | \
502 (((S[RCOMP]) & 0xf0) << 4) | \
503 (((S[GCOMP]) & 0xf0) ) | \
504 (((S[BCOMP]) & 0xf0) >> 4) )
505 #define FETCH_PIXEL(D, P) \
506 D[RCOMP] = ((*P & 0x0f00) >> 4); \
507 D[GCOMP] = ((*P & 0x00f0) ); \
508 D[BCOMP] = ((*P & 0x000f) << 4); \
509 D[ACOMP] = ((*P & 0xf000) >> 8)
511 #include "swrast/s_spantemp.h"
514 #define NAME(PREFIX) PREFIX##_ARGB2554
515 #define FORMAT GL_RGBA8
516 #define RB_TYPE GLubyte
518 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
519 #define INIT_PIXEL_PTR(P, X, Y) \
520 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
521 #define INC_PIXEL_PTR(P) P += 1
522 #define STORE_PIXEL_RGB(P, X, Y, S) \
524 (((S[RCOMP]) & 0xf8) << 6) | \
525 (((S[GCOMP]) & 0xf8) << 1) | \
526 (((S[BCOMP]) & 0xf0) >> 4) )
527 #define STORE_PIXEL(P, X, Y, S) \
528 *P = ( (((S[ACOMP]) & 0xc0) << 8) | \
529 (((S[RCOMP]) & 0xf8) << 6) | \
530 (((S[GCOMP]) & 0xf8) << 1) | \
531 (((S[BCOMP]) & 0xf0) >> 4) )
532 #define FETCH_PIXEL(D, P) \
533 D[RCOMP] = ((*P & 0x3e00) >> 9); \
534 D[GCOMP] = ((*P & 0x01f0) >> 4); \
535 D[BCOMP] = ((*P & 0x000f) << 4); \
536 D[ACOMP] = ((*P & 0xc000) >> 14)
538 #include "swrast/s_spantemp.h"
541 #define NAME(PREFIX) PREFIX##_ARGB1555
542 #define FORMAT GL_RGBA8
543 #define RB_TYPE GLubyte
545 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
546 #define INIT_PIXEL_PTR(P, X, Y) \
547 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
548 #define INC_PIXEL_PTR(P) P += 1
549 #define STORE_PIXEL_RGB(P, X, Y, S) \
551 (((S[RCOMP]) & 0xf8) << 7) | \
552 (((S[GCOMP]) & 0xf8) << 2) | \
553 (((S[BCOMP]) ) >> 3) )
554 #define STORE_PIXEL(P, X, Y, S) \
555 *P = ( (((S[ACOMP]) & 0x80) << 16) | \
556 (((S[RCOMP]) & 0xf8) << 7) | \
557 (((S[GCOMP]) & 0xf8) << 2) | \
558 (((S[BCOMP]) ) >> 3) )
559 #define FETCH_PIXEL(D, P) \
560 D[RCOMP] = ((*P & 0x7c00) >> 7); \
561 D[GCOMP] = ((*P & 0x03e0) >> 2); \
562 D[BCOMP] = ((*P & 0x001f) << 3); \
563 D[ACOMP] = ((*P & 0x8000) ? 0xff : 0)
565 #include "swrast/s_spantemp.h"
568 #define NAME(PREFIX) PREFIX##_RGB16
569 #define FORMAT GL_RGBA8
570 #define RB_TYPE GLubyte
572 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
573 #define INIT_PIXEL_PTR(P, X, Y) \
574 GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);
575 #define INC_PIXEL_PTR(P) P += 1
576 #define STORE_PIXEL(P, X, Y, S) \
577 *P = ( (((S[RCOMP]) & 0xf8) << 8) | \
578 (((S[GCOMP]) & 0xfc) << 3) | \
579 (((S[BCOMP]) ) >> 3) )
580 #define FETCH_PIXEL(D, P) \
581 D[RCOMP] = ((*P & 0xf800) >> 8); \
582 D[GCOMP] = ((*P & 0x07e0) >> 3); \
583 D[BCOMP] = ((*P & 0x001f) << 3); \
586 #include "swrast/s_spantemp.h"
589 #define NAME(PREFIX) PREFIX##_RGB24
590 #define FORMAT GL_RGBA8
591 #define RB_TYPE GLubyte
593 IDirectFBGL_data *data = ctx->DriverCtx;
594 #define INIT_PIXEL_PTR(P, X, Y) \
595 GLubyte *P = data->video.end - (Y) * data->video.pitch + (X) * 3;
596 #define INC_PIXEL_PTR(P) P += 3
597 #define STORE_PIXEL(P, X, Y, S) \
598 P[0] = S[BCOMP]; P[1] = S[GCOMP]; P[2] = S[BCOMP]
599 #define FETCH_PIXEL(D, P) \
600 D[RCOMP] = P[2]; D[GCOMP] = P[1]; D[BCOMP] = P[0]; D[ACOMP] = 0xff
602 #include "swrast/s_spantemp.h"
605 #define NAME(PREFIX) PREFIX##_RGB32
606 #define FORMAT GL_RGBA8
607 #define RB_TYPE GLubyte
609 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
610 #define INIT_PIXEL_PTR(P, X, Y) \
611 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
612 #define INC_PIXEL_PTR(P) P += 1
613 #define STORE_PIXEL(P, X, Y, S) \
614 *P = ( ((S[RCOMP]) << 16) | \
615 ((S[GCOMP]) << 8) | \
617 #define FETCH_PIXEL(D, P) \
618 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
619 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
620 D[BCOMP] = ((*P & 0x000000ff) ); \
623 #include "swrast/s_spantemp.h"
626 #define NAME(PREFIX) PREFIX##_ARGB
627 #define FORMAT GL_RGBA8
628 #define RB_TYPE GLubyte
630 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
631 #define INIT_PIXEL_PTR(P, X, Y) \
632 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
633 #define INC_PIXEL_PTR(P) P += 1
634 #define STORE_PIXEL_RGB(P, X, Y, S) \
635 *P = ( 0xff000000 | \
636 ((S[RCOMP]) << 16) | \
637 ((S[GCOMP]) << 8) | \
639 #define STORE_PIXEL(P, X, Y, S) \
640 *P = ( ((S[ACOMP]) << 24) | \
641 ((S[RCOMP]) << 16) | \
642 ((S[GCOMP]) << 8) | \
644 #define FETCH_PIXEL(D, P) \
645 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
646 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
647 D[BCOMP] = ((*P & 0x000000ff) ); \
648 D[ACOMP] = ((*P & 0xff000000) >> 24)
650 #include "swrast/s_spantemp.h"
653 #define NAME(PREFIX) PREFIX##_AiRGB
654 #define FORMAT GL_RGBA8
655 #define RB_TYPE GLubyte
657 IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;
658 #define INIT_PIXEL_PTR(P, X, Y) \
659 GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);
660 #define INC_PIXEL_PTR(P) P += 1
661 #define STORE_PIXEL_RGB(P, X, Y, S) \
662 *P = ( ((S[RCOMP]) << 16) | \
663 ((S[GCOMP]) << 8) | \
665 #define STORE_PIXEL(P, X, Y, S) \
666 *P = ( (((S[ACOMP]) ^ 0xff) << 24) | \
667 (((S[RCOMP]) ) << 16) | \
668 (((S[GCOMP]) ) << 8) | \
670 #define FETCH_PIXEL(D, P) \
671 D[RCOMP] = ((*P & 0x00ff0000) >> 16); \
672 D[GCOMP] = ((*P & 0x0000ff00) >> 8); \
673 D[BCOMP] = ((*P & 0x000000ff) ); \
674 D[ACOMP] = (((*P & 0xff000000) >> 24) ^ 0xff)
676 #include "swrast/s_spantemp.h"
679 /*****************************************************************************/
682 directfbgl_init_visual( GLvisual
*visual
,
683 DFBSurfacePixelFormat format
)
685 GLboolean rgbFlag
= GL_TRUE
;
686 GLboolean dbFlag
= GL_FALSE
;
687 GLboolean stereoFlag
= GL_FALSE
;
694 GLint stencilBits
= 0;
695 GLint accumRedBits
= 0;
696 GLint accumGreenBits
= 0;
697 GLint accumBlueBits
= 0;
698 GLint accumAlphaBits
= 0;
699 GLint numSamples
= 0;
701 /* FIXME: LUT8 support. */
741 D_WARN( "unsupported pixelformat" );
746 accumRedBits
= redBits
;
747 accumGreenBits
= greenBits
;
748 accumBlueBits
= blueBits
;
749 accumAlphaBits
= alphaBits
;
750 depthBits
= redBits
+ greenBits
+ blueBits
;
751 stencilBits
= alphaBits
;
755 return _mesa_initialize_visual( visual
,
756 rgbFlag
, dbFlag
, stereoFlag
,
757 redBits
, greenBits
, blueBits
, alphaBits
,
758 indexBits
, depthBits
, stencilBits
,
759 accumRedBits
, accumGreenBits
,
760 accumBlueBits
, accumAlphaBits
,
765 directfbgl_create_context( GLcontext
*context
,
766 GLframebuffer
*framebuffer
,
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 _vbo_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
;
802 switch (data
->format
) {
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 data
->render
.Width
= data
->width
;
890 data
->render
.Height
= data
->height
;
892 _mesa_add_renderbuffer( framebuffer
, BUFFER_FRONT_LEFT
, &data
->render
);
894 _mesa_add_soft_renderbuffers( framebuffer
,
896 visual
->haveDepthBuffer
,
897 visual
->haveStencilBuffer
,
898 visual
->haveAccumBuffer
,
902 TNL_CONTEXT( context
)->Driver
.RunPipeline
= _tnl_run_pipeline
;
904 _mesa_enable_sw_extensions( context
);
910 directfbgl_destroy_context( GLcontext
*context
,
911 GLframebuffer
*framebuffer
)
913 _swsetup_DestroyContext( context
);
914 _swrast_DestroyContext( context
);
915 _tnl_DestroyContext( context
);
916 _vbo_DestroyContext( context
);
917 //_mesa_free_framebuffer_data( framebuffer );
918 _mesa_free_context_data( context
);