Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
23d3f63c
Commit
23d3f63c
authored
Jul 22, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/video_output/x11/glx.c: improvements.
parent
031cb39a
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
91 additions
and
135 deletions
+91
-135
modules/video_output/x11/glx.c
modules/video_output/x11/glx.c
+91
-135
No files found.
modules/video_output/x11/glx.c
View file @
23d3f63c
...
...
@@ -39,7 +39,6 @@
#include <X11/Xutil.h>
#include <GL/glx.h>
/* Data common to vout and opengl provider structures */
typedef
struct
glx_t
{
...
...
@@ -52,8 +51,21 @@ typedef struct glx_t
Window
wnd
;
GLXWindow
gwnd
;
Atom
wm_delete
;
}
glx_t
;
/* RV16 */
//#define VLCGL_RGB_FORMAT GL_RGB
//#define VLCGL_RGB_TYPE GL_UNSIGNED_SHORT_5_6_5
/* RV24 */
//#define VLCGL_RGB_FORMAT GL_RGB
//#define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE
/* RV32 */
#define VLCGL_RGB_FORMAT GL_RGBA
#define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE
/*****************************************************************************
* Vout interface
...
...
@@ -103,7 +115,6 @@ vlc_module_begin();
set_callbacks
(
CreateOpenGL
,
DestroyOpenGL
);
vlc_module_end
();
/*****************************************************************************
* vout_sys_t: GLX video output method descriptor
*****************************************************************************
...
...
@@ -160,10 +171,8 @@ static int CreateVout( vlc_object_t *p_this )
//XXX set to 0 to disable the cube effect
p_vout
->
p_sys
->
i_effect
=
1
;
/* p_vout->p_sys->glx.i_width = p_vout->i_window_width;
p_vout->p_sys->glx.i_height = p_vout->i_window_height; */
p_vout
->
p_sys
->
glx
.
i_width
=
700
;
p_vout
->
p_sys
->
glx
.
i_height
=
700
;
p_vout
->
p_sys
->
glx
.
i_width
=
p_vout
->
i_window_width
;
p_vout
->
p_sys
->
glx
.
i_height
=
p_vout
->
i_window_height
;
p_vout
->
p_sys
->
glx
.
b_fullscreen
=
0
;
/* A texture must have a size aligned on a power of 2 */
...
...
@@ -195,76 +204,74 @@ static int CreateVout( vlc_object_t *p_this )
*****************************************************************************/
static
int
Init
(
vout_thread_t
*
p_vout
)
{
int
i_index
;
picture_t
*
p_pic
;
int
i_pixel_pitch
;
/* No YUV textures :( */
#if VLCGL_RGB_FORMAT == GL_RGB
# if VLCGL_RGB_TYPE == GL_UNSIGNED_BYTE
p_vout
->
output
.
i_chroma
=
VLC_FOURCC
(
'R'
,
'V'
,
'2'
,
'4'
);
p_vout
->
output
.
i_rmask
=
0x000000ff
;
p_vout
->
output
.
i_gmask
=
0x0000ff00
;
p_vout
->
output
.
i_bmask
=
0x00ff0000
;
i_pixel_pitch
=
3
;
# else
p_vout
->
output
.
i_chroma
=
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
);
p_vout
->
output
.
i_rmask
=
0xf800
;
p_vout
->
output
.
i_gmask
=
0x07e0
;
p_vout
->
output
.
i_bmask
=
0x001f
;
i_pixel_pitch
=
2
;
# endif
#else
p_vout
->
output
.
i_chroma
=
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
);
p_vout
->
output
.
i_rmask
=
0x000000ff
;
p_vout
->
output
.
i_gmask
=
0x0000ff00
;
p_vout
->
output
.
i_bmask
=
0x00ff0000
;
i_pixel_pitch
=
4
;
#endif
/* Since OpenGL can do rescaling for us, stick to the default
* coordinates and aspect. */
p_vout
->
output
.
i_width
=
p_vout
->
render
.
i_width
;
p_vout
->
output
.
i_height
=
p_vout
->
render
.
i_height
;
p_vout
->
output
.
i_aspect
=
p_vout
->
render
.
i_aspect
;
I_OUTPUTPICTURES
=
0
;
p_pic
=
NULL
;
/* Find an empty picture slot */
for
(
i_index
=
0
;
i_index
<
VOUT_MAX_PICTURES
;
i_index
++
)
{
if
(
p_vout
->
p_picture
[
i_index
].
i_status
==
FREE_PICTURE
)
{
p_pic
=
p_vout
->
p_picture
+
i_index
;
break
;
}
}
if
(
p_pic
==
NULL
)
{
return
-
1
;
}
/* We know the chroma, allocate a buffer which will be used
* directly by the decoder */
p_pic
->
i_planes
=
1
;
p_vout
->
p_picture
[
0
].
i_planes
=
1
;
p_vout
->
p_sys
->
p_buffer
=
malloc
(
p_vout
->
p_sys
->
i_tex_width
*
p_vout
->
p_sys
->
i_tex_height
*
4
);
malloc
(
p_vout
->
p_sys
->
i_tex_width
*
p_vout
->
p_sys
->
i_tex_height
*
i_pixel_pitch
);
if
(
!
p_vout
->
p_sys
->
p_buffer
)
{
msg_Err
(
p_vout
,
"Out of memory"
);
return
-
1
;
}
p_pic
->
p
->
p_pixels
=
p_vout
->
p_sys
->
p_buffer
+
2
*
p_vout
->
p_sys
->
i_tex_width
*
(
p_vout
->
p_sys
->
i_tex_height
-
p_vout
->
output
.
i_height
)
+
2
*
(
p_vout
->
p_sys
->
i_tex_width
-
p_vout
->
output
.
i_width
);
p_pic
->
p
->
i_lines
=
p_vout
->
output
.
i_height
;
p_pic
->
p
->
i_pitch
=
p_vout
->
p_sys
->
i_tex_width
*
4
;
p_pic
->
p
->
i_pixel_pitch
=
4
;
p_pic
->
p
->
i_visible_pitch
=
p_vout
->
output
.
i_width
*
4
;
p_pic
->
i_status
=
DESTROYED_PICTURE
;
p_pic
->
i_type
=
DIRECT_PICTURE
;
p_vout
->
p_picture
[
0
].
p
->
p_pixels
=
p_vout
->
p_sys
->
p_buffer
;
p_vout
->
p_picture
[
0
].
p
->
i_lines
=
p_vout
->
output
.
i_height
;
p_vout
->
p_picture
[
0
].
p
->
i_pixel_pitch
=
i_pixel_pitch
;
p_vout
->
p_picture
[
0
].
p
->
i_pitch
=
p_vout
->
p_sys
->
i_tex_width
*
p_vout
->
p_picture
[
0
].
p
->
i_pixel_pitch
;
p_vout
->
p_picture
[
0
].
p
->
i_visible_pitch
=
p_vout
->
output
.
i_width
*
p_vout
->
p_picture
[
0
].
p
->
i_pixel_pitch
;
PP_OUTPUTPICTURE
[
0
]
=
p_pic
;
p_vout
->
p_picture
[
0
].
i_status
=
DESTROYED_PICTURE
;
p_vout
->
p_picture
[
0
].
i_type
=
DIRECT_PICTURE
;
PP_OUTPUTPICTURE
[
0
]
=
&
p_vout
->
p_picture
[
0
];
I_OUTPUTPICTURES
=
1
;
SwitchContext
(
&
p_vout
->
p_sys
->
glx
);
/* Set the texture parameters */
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MAG_FILTER
,
GL_LINEAR
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_
NEAREST
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_
LINEAR
);
if
(
p_vout
->
p_sys
->
i_effect
)
{
glEnable
(
GL_CULL_FACE
);
/*
glDisable( GL_DEPTH_TEST );
/*
glDisable( GL_DEPTH_TEST );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE );*/
...
...
@@ -308,7 +315,6 @@ static void DestroyVout( vlc_object_t *p_this )
free
(
p_vout
->
p_sys
);
}
/*****************************************************************************
* CreateOpenGL: initialize an OpenGL provider
*****************************************************************************/
...
...
@@ -329,7 +335,6 @@ static int CreateOpenGL( vlc_object_t *p_this )
return
VLC_SUCCESS
;
}
/*****************************************************************************
* DestroyOpenGL: destroys an OpenGL provider
*****************************************************************************/
...
...
@@ -362,7 +367,6 @@ static int InitOpenGL( opengl_t *p_opengl, int i_width, int i_height )
return
VLC_SUCCESS
;
}
/*****************************************************************************
* SwapBuffers: swap front/back buffers
*****************************************************************************/
...
...
@@ -380,7 +384,6 @@ static void SwapBuffers( opengl_t *p_opengl )
}
}
/*****************************************************************************
* HandleEvents: handle window events
*****************************************************************************/
...
...
@@ -396,7 +399,6 @@ static int HandleEvents( opengl_t *p_opengl )
return
i_ret
;
}
/*****************************************************************************
* Manage: handle X11 events
*****************************************************************************
...
...
@@ -420,7 +422,6 @@ static int Manage( vout_thread_t *p_vout )
return
0
;
}
static
int
HandleX11Events
(
vlc_object_t
*
p_thread
,
glx_t
*
p_glx
)
{
Display
*
p_display
;
...
...
@@ -450,119 +451,80 @@ static int HandleX11Events( vlc_object_t *p_thread, glx_t *p_glx )
return
0
;
}
/*****************************************************************************
* Render: render previously calculated output
*****************************************************************************/
static
void
Render
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vout_sys_t
*
p_sys
=
p_vout
->
p_sys
;
float
f_width
=
(
float
)
p_vout
->
output
.
i_width
/
p_sys
->
i_tex_width
;
float
f_height
=
(
float
)
p_vout
->
output
.
i_height
/
p_sys
->
i_tex_height
;
glClear
(
GL_COLOR_BUFFER_BIT
);
/*glTexImage2D (GL_TEXTURE_2D, 0, 3, p_vout->output.i_width,
p_vout->output.i_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
p_vout->p_sys->p_buffer);*/
glTexImage2D
(
GL_TEXTURE_2D
,
0
,
3
,
p_vout
->
p_sys
->
i_tex_width
,
p_vout
->
p_sys
->
i_tex_height
,
0
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
p_vout
->
p_sys
->
i_tex_height
,
0
,
VLCGL_RGB_FORMAT
,
VLCGL_RGB_TYPE
,
p_vout
->
p_sys
->
p_buffer
);
if
(
!
p_vout
->
p_sys
->
i_effect
)
{
glEnable
(
GL_TEXTURE_2D
);
glBegin
(
GL_POLYGON
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
,
0
.
0
);
glVertex2f
(
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
,
1
.
0
);
glVertex2f
(
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
.
0
,
1
.
0
);
glVertex2f
(
-
1
.
0
,
-
1
.
0
);
glEnable
(
GL_TEXTURE_2D
);
glBegin
(
GL_POLYGON
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
0
.
0
);
glVertex2f
(
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex2f
(
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
.
0
,
f_height
);
glVertex2f
(
-
1
.
0
,
-
1
.
0
);
glEnd
();
}
else
{
glRotatef
(
1
.
0
,
0
.
3
,
0
.
5
,
0
.
7
);
glEnable
(
GL_TEXTURE_2D
);
glEnable
(
GL_TEXTURE_2D
);
glBegin
(
GL_QUADS
);
float
f_width
=
p_vout
->
output
.
i_width
;
float
f_height
=
p_vout
->
output
.
i_height
;
/* Correct the aspect ratio */
/* float f_aspect = (float)p_vout->output.i_aspect / VOUT_ASPECT_FACTOR;
if( f_aspect > 1.0 )
{
f_height *= f_aspect;
}
else
{
f_width *= f_aspect;
}*/
float
f_offset_x
=
(
1
.
0
-
f_width
/
p_vout
->
p_sys
->
i_tex_width
)
/
2
.
0
;
float
f_offset_y
=
(
1
.
0
-
f_height
/
p_vout
->
p_sys
->
i_tex_height
)
/
2
.
0
;
/* Front */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
/* Left */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
/* Back */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
/* Right */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
/* Top */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
-
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
1
.
0
,
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
1
.
0
,
1
.
0
,
-
1
.
0
);
/* Bottom */
glTexCoord2f
(
f_offset_x
,
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
1
.
0
-
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
1
.
0
-
f_offset_x
,
f_offset_y
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
0
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
1
.
0
);
glTexCoord2f
(
0
,
f_height
);
glVertex3f
(
-
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
f_height
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
-
1
.
0
);
glTexCoord2f
(
f_width
,
0
);
glVertex3f
(
1
.
0
,
-
1
.
0
,
1
.
0
);
glEnd
();
}
glDisable
(
GL_TEXTURE_2D
);
}
/*****************************************************************************
* DisplayVideo: displays previously rendered output
*****************************************************************************/
...
...
@@ -580,7 +542,6 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
}
}
/*****************************************************************************
* OpenDisplay: open and initialize OpenGL device
*****************************************************************************/
...
...
@@ -672,7 +633,6 @@ static void CloseDisplay( glx_t *p_glx )
p_glx
->
wnd
=
None
;
}
int
InitGLX12
(
vlc_object_t
*
p_thread
,
glx_t
*
p_glx
)
{
Display
*
p_display
;
...
...
@@ -707,7 +667,6 @@ int InitGLX12( vlc_object_t *p_thread, glx_t *p_glx )
return
0
;
}
int
InitGLX13
(
vlc_object_t
*
p_thread
,
glx_t
*
p_glx
)
{
Display
*
p_display
;
...
...
@@ -770,7 +729,6 @@ int InitGLX13( vlc_object_t *p_thread, glx_t *p_glx )
return
0
;
}
void
CreateWindow
(
vlc_object_t
*
p_thread
,
glx_t
*
p_glx
,
XVisualInfo
*
p_vi
)
{
Display
*
p_display
;
...
...
@@ -824,7 +782,6 @@ void CreateWindow( vlc_object_t *p_thread, glx_t *p_glx, XVisualInfo *p_vi )
XSelectInput
(
p_display
,
wnd
,
KeyPressMask
);
}
void
SwitchContext
(
glx_t
*
p_glx
)
{
/* Change the current OpenGL context */
...
...
@@ -840,7 +797,6 @@ void SwitchContext( glx_t *p_glx )
}
}
int
GetAlignedSize
(
int
i_size
)
{
/* Return the nearest power of 2 */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment