Commit 40cbe6a3 authored by Cyril Deguet's avatar Cyril Deguet

* all: just a basic OpenGL scope at the moment

parent ca048633
SOURCES_galaktos = plugin.c \ SOURCES_galaktos = plugin.c \
plugin.h \ plugin.h \
glx.c \ glx.c \
glx.h glx.h \
main.c \
main.h
...@@ -27,16 +27,19 @@ ...@@ -27,16 +27,19 @@
#include <GL/glx.h> #include <GL/glx.h>
/* Local prototypes */ /* Local prototypes */
static int CreateWindow( galaktos_thread_t *p_thread, int i_width, static int CreateWindow( galaktos_thread_t *p_thread, XVisualInfo *p_vi,
int i_height ); int i_width, int i_height );
typedef struct typedef struct
{ {
Display *p_display; Display *p_display;
GLXFBConfig fbconf; GLXContext gwctx;
Window wnd; Window wnd;
GLXWindow gwnd; GLXWindow gwnd;
GLXPbuffer gpbuf;
GLXContext gpctx;
Atom wm_delete;
} }
glx_data_t; glx_data_t;
#define OS_DATA ((glx_data_t*)(p_thread->p_os_data)) #define OS_DATA ((glx_data_t*)(p_thread->p_os_data))
...@@ -49,7 +52,11 @@ int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height ) ...@@ -49,7 +52,11 @@ int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height )
int i_maj, i_min; int i_maj, i_min;
int i_nbelem; int i_nbelem;
GLXFBConfig *p_fbconfs, fbconf; GLXFBConfig *p_fbconfs, fbconf;
static const int p_attr[] = { GLX_RED_SIZE, 5, GLX_GREEN_SIZE, 5, XVisualInfo *p_vi;
GLXContext gwctx;
int i;
GLXPbuffer gpbuf;
int p_attr[] = { GLX_RED_SIZE, 5, GLX_GREEN_SIZE, 5,
GLX_BLUE_SIZE, 5, GLX_DOUBLEBUFFER, True, GLX_BLUE_SIZE, 5, GLX_DOUBLEBUFFER, True,
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, 0 }; GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, 0 };
...@@ -99,50 +106,180 @@ int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height ) ...@@ -99,50 +106,180 @@ int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height )
} }
return -1; return -1;
} }
OS_DATA->fbconf = fbconf = p_fbconfs[0]; fbconf = p_fbconfs[0];
/* Get the X11 visual */
p_vi = glXGetVisualFromFBConfig( p_display, fbconf );
if( !p_vi )
{
msg_Err( p_thread, "Cannot get X11 visual" );
XFree( p_fbconfs );
return -1;
}
/* Create the window */
if( CreateWindow( p_thread, p_vi, i_width, i_height ) == -1 )
{
XFree( p_fbconfs );
XFree( p_vi );
return -1;
}
XFree( p_vi );
/* Create the GLX window */
OS_DATA->gwnd = glXCreateWindow( p_display, fbconf, OS_DATA->wnd, NULL );
if( OS_DATA->gwnd == None )
{
msg_Err( p_thread, "Cannot create GLX window" );
return -1;
}
/* Create an OpenGL context */
OS_DATA->gwctx = gwctx = glXCreateNewContext( p_display, fbconf,
GLX_RGBA_TYPE, NULL, True );
if( !gwctx )
{
msg_Err( p_thread, "Cannot create OpenGL context");
XFree( p_fbconfs );
return -1;
}
XFree( p_fbconfs );
/* Get a FB config for the pbuffer */
p_attr[1] = 8; // RED_SIZE
p_attr[3] = 8; // GREEN_SIZE
p_attr[5] = 8; // BLUE_SIZE
p_attr[7] = False; // DOUBLEBUFFER
p_attr[9] = GLX_PBUFFER_BIT; // DRAWABLE_TYPE
p_fbconfs = glXChooseFBConfig( p_display, 0, p_attr, &i_nbelem );
if( (i_nbelem <= 0) || !p_fbconfs )
{
msg_Err( p_thread, "Cannot get FB configurations for pbuffer");
if( p_fbconfs )
{
XFree( p_fbconfs );
}
return -1;
}
fbconf = p_fbconfs[0];
if( CreateWindow( p_thread, i_width, i_height ) == -1 ) /* Create a pbuffer */
i = 0;
p_attr[i++] = GLX_PBUFFER_WIDTH;
p_attr[i++] = 512;
p_attr[i++] = GLX_PBUFFER_HEIGHT;
p_attr[i++] = 512;
p_attr[i++] = GLX_PRESERVED_CONTENTS;
p_attr[i++] = True;
p_attr[i++] = 0;
OS_DATA->gpbuf = gpbuf = glXCreatePbuffer( p_display, fbconf, p_attr );
if( !gpbuf )
{ {
msg_Err( p_thread, "Failed to create GLX pbuffer" );
XFree( p_fbconfs ); XFree( p_fbconfs );
return -1; return -1;
} }
msg_Err( p_thread, "NOT IMPLEMENTED YET ;)" ); /* Create the pbuffer context */
OS_DATA->gpctx = glXCreateNewContext( p_display, fbconf, GLX_RGBA_TYPE,
gwctx, True );
if( !OS_DATA->gpctx )
{
msg_Err( p_thread, "Failed to create pbuffer context" );
XFree( p_fbconfs );
return -1;
}
XFree( p_fbconfs );
XMapWindow( p_display, OS_DATA->wnd );
XFlush( p_display );
glXMakeContextCurrent( p_display, OS_DATA->gwnd, OS_DATA->gwnd, gwctx );
return 0; return 0;
} }
int CreateWindow( galaktos_thread_t *p_thread, int i_width, int i_height ) int galaktos_glx_handle_events( galaktos_thread_t *p_thread )
{ {
Display *p_display; Display *p_display;
XVisualInfo *p_vi;
XSetWindowAttributes xattr;
Window wnd;
p_display = OS_DATA->p_display; p_display = OS_DATA->p_display;
/* Get the X11 visual */
p_vi = glXGetVisualFromFBConfig( p_display, OS_DATA->fbconf ); /* loop on X11 events */
if( !p_vi ) while( XPending( p_display ) > 0 )
{ {
msg_Err( p_thread, "Cannot get X11 visual" ); XEvent evt;
return -1; XNextEvent( p_display, &evt );
switch( evt.type )
{
case ClientMessage:
{
/* Delete notification */
if( (evt.xclient.format == 32) &&
((Atom)evt.xclient.data.l[0] == OS_DATA->wm_delete) )
{
return 1;
}
break;
}
} }
}
return 0;
}
void galaktos_glx_swap( galaktos_thread_t *p_thread )
{
glXSwapBuffers( OS_DATA->p_display, OS_DATA->gwnd );
}
void galaktos_glx_done( galaktos_thread_t *p_thread )
{
Display *p_display;
p_display = OS_DATA->p_display;
glXDestroyContext( p_display, OS_DATA->gpctx );
glXDestroyPbuffer( p_display, OS_DATA->gpbuf );
glXDestroyContext( p_display, OS_DATA->gwctx );
glXDestroyWindow( p_display, OS_DATA->gwnd );
XDestroyWindow( p_display, OS_DATA->wnd );
XCloseDisplay( p_display );
}
int CreateWindow( galaktos_thread_t *p_thread, XVisualInfo *p_vi,
int i_width, int i_height )
{
Display *p_display;
XSetWindowAttributes xattr;
Window wnd;
XSizeHints* p_size_hints;
p_display = OS_DATA->p_display;
/* Create the window */ /* Create the window */
xattr.background_pixel = BlackPixel( p_display, DefaultScreen(p_display) ); xattr.background_pixel = BlackPixel( p_display, DefaultScreen(p_display) );
xattr.border_pixel = 0; xattr.border_pixel = 0;
OS_DATA->wnd = wnd = XCreateWindow( p_display, DefaultRootWindow(p_display), OS_DATA->wnd = wnd = XCreateWindow( p_display, DefaultRootWindow(p_display),
0, 0, i_width, i_height, 0, p_vi->depth, InputOutput, p_vi->visual, 0, 0, i_width, i_height, 0, p_vi->depth, InputOutput, p_vi->visual,
CWBackPixel | CWBorderPixel, &xattr); CWBackPixel | CWBorderPixel, &xattr);
XFree( p_vi );
/* Create the GLX window */ /* Allow the window to be deleted by the window manager */
OS_DATA->gwnd = glXCreateWindow( p_display, OS_DATA->fbconf, wnd, NULL ); OS_DATA->wm_delete = XInternAtom( p_display, "WM_DELETE_WINDOW", False );
if( OS_DATA->gwnd == None ) XSetWMProtocols( p_display, wnd, &OS_DATA->wm_delete, 1 );
{
msg_Err( p_thread, "Cannot create GLX window" ); /* Prevent the window from being resized */
return -1; p_size_hints = XAllocSizeHints();
} p_size_hints->flags = PMinSize | PMaxSize;
p_size_hints->min_width = i_width;
p_size_hints->min_height = i_height;
p_size_hints->max_width = i_width;
p_size_hints->max_height = i_height;
XSetWMNormalHints( p_display, wnd, p_size_hints );
XFree( p_size_hints );
XSelectInput( p_display, wnd, KeyPressMask );
return 0; return 0;
} }
...@@ -27,5 +27,8 @@ ...@@ -27,5 +27,8 @@
#include "plugin.h" #include "plugin.h"
int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height ); int galaktos_glx_init( galaktos_thread_t *p_thread, int i_width, int i_height );
void galaktos_glx_done( galaktos_thread_t *p_thread );
int galaktos_glx_handle_events( galaktos_thread_t *p_thread );
void galaktos_glx_swap( galaktos_thread_t *p_thread );
#endif #endif
/*****************************************************************************
* main.c:
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id$
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include "glx.h"
#include <GL/gl.h>
#include <unistd.h>
#include <math.h>
int galaktos_update( galaktos_thread_t *p_thread, int16_t p_data[2][512] )
{
int j;
/* Process X11 events */
if( galaktos_glx_handle_events( p_thread ) == 1 )
{
return 1;
}
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_STRIP);
glColor3f( 0.5f, 0.0f, 0.0f);
glVertex2f( -1.0f, 1.0f);
glColor3f( 0.2f, 0.2f, 0.0f);
glVertex2f( 1.0f, 1.0f);
glColor3f( 0.0f, 0.2f, 0.2f);
glVertex2f( -1.0f, -1.0f);
glColor3f( 0.0f, 0.0f, 0.5f);
glVertex2f( 1.0f, -1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glColor3f( 1.0f, 1.0f, 1.0f);
glVertex2f( -1.0f, 0.0f);
for(j=0; j<512; j++)
{
glVertex2f( (float)j/256-1.0f, (float)p_data[0][j]/32000);
}
glEnd();
galaktos_glx_swap( p_thread );
return 0;
}
/*****************************************************************************
* main.h:
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id$
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifndef _GALAKTOS_MAIN_H_
#define _GALAKTOS_MAIN_H_
int galaktos_update( galaktos_thread_t *p_thread, int16_t p_data[2][512] );
#endif
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
*****************************************************************************/ *****************************************************************************/
#include "plugin.h" #include "plugin.h"
#include "glx.h" #include "glx.h"
#include "main.h"
#include <vlc/input.h> #include <vlc/input.h>
#include <vlc/vout.h> #include <vlc/vout.h>
...@@ -93,7 +94,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -93,7 +94,6 @@ static int Open( vlc_object_t *p_this )
vlc_object_create( p_filter, sizeof( galaktos_thread_t ) ); vlc_object_create( p_filter, sizeof( galaktos_thread_t ) );
vlc_object_attach( p_thread, p_this ); vlc_object_attach( p_thread, p_this );
galaktos_glx_init( p_thread, 512, 512 );
/* /*
var_Create( p_thread, "galaktos-width", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); var_Create( p_thread, "galaktos-width", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
var_Get( p_thread, "galaktos-width", &width ); var_Get( p_thread, "galaktos-width", &width );
...@@ -240,11 +240,34 @@ static void Thread( vlc_object_t *p_this ) ...@@ -240,11 +240,34 @@ static void Thread( vlc_object_t *p_this )
audio_date_t i_pts; audio_date_t i_pts;
int16_t p_data[2][512]; int16_t p_data[2][512];
int i_data = 0, i_count = 0; int i_data = 0, i_count = 0;
int i;
galaktos_glx_init( p_thread, 512, 512 );
while( !p_thread->b_die ) while( !p_thread->b_die )
{ {
/* goom_update is damn slow, so just copy data and release the lock */
vlc_mutex_lock( &p_thread->lock );
if( FillBuffer( (int16_t *)p_data, &i_data, &i_pts,
&p_thread->date, p_thread ) != VLC_SUCCESS )
vlc_cond_wait( &p_thread->wait, &p_thread->lock );
vlc_mutex_unlock( &p_thread->lock );
if( galaktos_update( p_thread, p_data ) == 1 )
{
p_thread->b_die = 1;
}
if( p_thread->psz_title )
{
free( p_thread->psz_title );
p_thread->psz_title = NULL;
}
msleep( VOUT_OUTMEM_SLEEP ); msleep( VOUT_OUTMEM_SLEEP );
} }
galaktos_glx_done( p_thread );
} }
/***************************************************************************** /*****************************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment