[vlc-commits] Defined texture format/type at runtime (opengl).
Laurent Aimar
git at videolan.org
Sun May 29 11:09:52 CEST 2011
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu May 26 21:21:47 2011 +0200| [ec3dc4b4f0a1edfb7160ece44373d27e799d9171] | committer: Laurent Aimar
Defined texture format/type at runtime (opengl).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ec3dc4b4f0a1edfb7160ece44373d27e799d9171
---
modules/video_output/opengl.c | 154 +++++++++++++++++------------------------
1 files changed, 64 insertions(+), 90 deletions(-)
diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
index 43113d3..0a33d82 100644
--- a/modules/video_output/opengl.c
+++ b/modules/video_output/opengl.c
@@ -62,37 +62,12 @@
# define GL_CLAMP_TO_EDGE 0x812F
#endif
-
#if USE_OPENGL_ES
-# define VLCGL_TARGET GL_TEXTURE_2D
-
-// Use RGB with OpenGLES
-# define VLCGL_FORMAT GL_RGB
-# define VLCGL_TYPE GL_UNSIGNED_SHORT_5_6_5
-
-# define VLCGL_TEXTURE_COUNT 1
-
+# define VLCGL_TEXTURE_COUNT 1
#elif defined(MACOS_OPENGL)
-
-/* On OS X, use GL_TEXTURE_RECTANGLE_EXT instead of GL_TEXTURE_2D.
- This allows sizes which are not powers of 2 */
-# define VLCGL_TARGET GL_TEXTURE_RECTANGLE_EXT
-
-/* OS X OpenGL supports YUV. Hehe. */
-# define VLCGL_FORMAT GL_YCBCR_422_APPLE
-# define VLCGL_TYPE GL_UNSIGNED_SHORT_8_8_APPLE
-
-# define VLCGL_TEXTURE_COUNT 2
-
+# define VLCGL_TEXTURE_COUNT 2
#else
-
-# define VLCGL_TARGET GL_TEXTURE_2D
-
-/* Use RGB on Win32/GLX */
-# define VLCGL_FORMAT GL_RGBA
-# define VLCGL_TYPE GL_UNSIGNED_BYTE
-
-# define VLCGL_TEXTURE_COUNT 1
+# define VLCGL_TEXTURE_COUNT 1
#endif
struct vout_display_opengl_t {
@@ -101,6 +76,9 @@ struct vout_display_opengl_t {
video_format_t fmt;
const vlc_chroma_description_t *chroma;
+ int tex_target;
+ int tex_format;
+ int tex_type;
int tex_width;
int tex_height;
@@ -159,46 +137,43 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
/* Find the chroma we will use and update fmt */
vgl->fmt = *fmt;
- /* TODO: We use YCbCr on Mac which is Y422, but on OSX it seems to == YUY2. Verify */
-#if defined(WORDS_BIGENDIAN) && VLCGL_FORMAT == GL_YCBCR_422_APPLE
+#if USE_OPENGL_ES
+ vgl->fmt.i_chroma = VLC_CODEC_RGB16;
+# if defined(WORDS_BIGENDIAN)
+ vgl->fmt.i_rmask = 0x001f;
+ vgl->fmt.i_gmask = 0x07e0;
+ vgl->fmt.i_bmask = 0xf800;
+# else
+ vgl->fmt.i_rmask = 0xf800;
+ vgl->fmt.i_gmask = 0x07e0;
+ vgl->fmt.i_bmask = 0x001f;
+# endif
+ vgl->tex_target = GL_TEXTURE_2D;
+ vgl->tex_format = GL_RGB;
+ vgl->tex_type = GL_UNSIGNED_SHORT_5_6_5;
+#elif defined(MACOS_OPENGL)
+# if defined(WORDS_BIGENDIAN)
vgl->fmt.i_chroma = VLC_CODEC_YUYV;
-#elif defined(GL_YCBCR_422_APPLE) && (VLCGL_FORMAT == GL_YCBCR_422_APPLE)
- vgl->fmt.i_chroma = VLC_CODEC_UYVY;
-#elif VLCGL_FORMAT == GL_RGB
-# if VLCGL_TYPE == GL_UNSIGNED_BYTE
- vgl->fmt.i_chroma = VLC_CODEC_RGB24;
-# if defined(WORDS_BIGENDIAN)
- vgl->fmt.i_rmask = 0x00ff0000;
- vgl->fmt.i_gmask = 0x0000ff00;
- vgl->fmt.i_bmask = 0x000000ff;
-# else
- vgl->fmt.i_rmask = 0x000000ff;
- vgl->fmt.i_gmask = 0x0000ff00;
- vgl->fmt.i_bmask = 0x00ff0000;
-# endif
# else
- vgl->fmt.i_chroma = VLC_CODEC_RGB16;
-# if defined(WORDS_BIGENDIAN)
- vgl->fmt.i_rmask = 0x001f;
- vgl->fmt.i_gmask = 0x07e0;
- vgl->fmt.i_bmask = 0xf800;
-# else
- vgl->fmt.i_rmask = 0xf800;
- vgl->fmt.i_gmask = 0x07e0;
- vgl->fmt.i_bmask = 0x001f;
-# endif
+ vgl->fmt.i_chroma = VLC_CODEC_UYVY;
# endif
+ vgl->tex_target = GL_TEXTURE_RECTANGLE_EXT;
+ vgl->tex_format = GL_YCBCR_422_APPLE;
+ vgl->tex_type = GL_UNSIGNED_SHORT_8_8_APPLE;
#else
vgl->fmt.i_chroma = VLC_CODEC_RGB32;
-# if defined(WORDS_BIGENDIAN)
- vgl->fmt.i_rmask = 0xff000000;
- vgl->fmt.i_gmask = 0x00ff0000;
- vgl->fmt.i_bmask = 0x0000ff00;
-# else
- vgl->fmt.i_rmask = 0x000000ff;
- vgl->fmt.i_gmask = 0x0000ff00;
- vgl->fmt.i_bmask = 0x00ff0000;
-# endif
+# if defined(WORDS_BIGENDIAN)
+ vgl->fmt.i_rmask = 0xff000000;
+ vgl->fmt.i_gmask = 0x00ff0000;
+ vgl->fmt.i_bmask = 0x0000ff00;
+# else
+ vgl->fmt.i_rmask = 0x000000ff;
+ vgl->fmt.i_gmask = 0x0000ff00;
+ vgl->fmt.i_bmask = 0x00ff0000;
+# endif
+ vgl->tex_target = GL_TEXTURE_2D;
+ vgl->tex_format = GL_RGBA;
+ vgl->tex_type = GL_UNSIGNED_BYTE;
#endif
vgl->chroma = vlc_fourcc_GetChromaDescription(vgl->fmt.i_chroma);
@@ -314,11 +289,11 @@ static int PictureLock(picture_t *picture)
vout_display_opengl_t *vgl = picture->p_sys->vgl;
if (!vlc_gl_Lock(vgl->gl)) {
- glBindTexture(VLCGL_TARGET, get_texture(picture));
- glTexSubImage2D(VLCGL_TARGET, 0, 0, 0,
+ glBindTexture(vgl->tex_target, get_texture(picture));
+ glTexSubImage2D(vgl->tex_target, 0, 0, 0,
picture->p[0].i_pitch / vgl->chroma->pixel_size,
picture->p[0].i_lines,
- VLCGL_FORMAT, VLCGL_TYPE, picture->p[0].p_pixels);
+ vgl->tex_format, vgl->tex_type, picture->p[0].p_pixels);
vlc_gl_Unlock(vgl->gl);
}
@@ -387,18 +362,18 @@ picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl)
glGenTextures(VLCGL_TEXTURE_COUNT, vgl->texture);
for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
- glBindTexture(VLCGL_TARGET, vgl->texture[i]);
+ glBindTexture(vgl->tex_target, vgl->texture[i]);
#if !USE_OPENGL_ES
/* Set the texture parameters */
- glTexParameterf(VLCGL_TARGET, GL_TEXTURE_PRIORITY, 1.0);
+ glTexParameterf(vgl->tex_target, GL_TEXTURE_PRIORITY, 1.0);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
#endif
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#ifdef MACOS_OPENGL
/* Tell the driver not to make a copy of the texture but to use
@@ -408,19 +383,19 @@ picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl)
#if 0
/* Use VRAM texturing */
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_STORAGE_HINT_APPLE,
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_STORAGE_HINT_APPLE,
GL_STORAGE_CACHED_APPLE);
#else
/* Use AGP texturing */
- glTexParameteri(VLCGL_TARGET, GL_TEXTURE_STORAGE_HINT_APPLE,
+ glTexParameteri(vgl->tex_target, GL_TEXTURE_STORAGE_HINT_APPLE,
GL_STORAGE_SHARED_APPLE);
#endif
#endif
/* Call glTexImage2D only once, and use glTexSubImage2D later */
if (vgl->buffer[i]) {
- glTexImage2D(VLCGL_TARGET, 0, VLCGL_FORMAT, vgl->tex_width,
- vgl->tex_height, 0, VLCGL_FORMAT, VLCGL_TYPE,
+ glTexImage2D(vgl->tex_target, 0, vgl->tex_format, vgl->tex_width,
+ vgl->tex_height, 0, vgl->tex_format, vgl->tex_type,
vgl->buffer[i]);
}
}
@@ -461,13 +436,13 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
#ifdef MACOS_OPENGL
/* Bind to the texture for drawing */
- glBindTexture(VLCGL_TARGET, get_texture(picture));
+ glBindTexture(vgl->tex_target, get_texture(picture));
#else
/* Update the texture */
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
picture->p[0].i_pitch / vgl->chroma->pixel_size,
picture->p[0].i_lines,
- VLCGL_FORMAT, VLCGL_TYPE, picture->p[0].p_pixels);
+ vgl->tex_format, vgl->tex_type, picture->p[0].p_pixels);
#endif
vlc_gl_Unlock(vgl->gl);
@@ -482,16 +457,15 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
/* glTexCoord works differently with GL_TEXTURE_2D and
GL_TEXTURE_RECTANGLE_EXT */
-#if VLCGL_TARGET == GL_TEXTURE_2D
- const float f_normw = vgl->tex_width;
- const float f_normh = vgl->tex_height;
-#elif defined (GL_TEXTURE_RECTANGLE_EXT) \
- && (VLCGL_TARGET == GL_TEXTURE_RECTANGLE_EXT)
- const float f_normw = 1.0;
- const float f_normh = 1.0;
-#else
-# error Unknown texture type!
-#endif
+ float f_normw, f_normh;
+
+ if (vgl->tex_target == GL_TEXTURE_2D) {
+ f_normw = vgl->tex_width;
+ f_normh = vgl->tex_height;
+ } else {
+ f_normw = 1.0;
+ f_normh = 1.0;
+ }
float f_x = (source->i_x_offset + 0 ) / f_normw;
float f_y = (source->i_y_offset + 0 ) / f_normh;
@@ -507,7 +481,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
if (vgl->program)
glEnable(GL_FRAGMENT_PROGRAM_ARB);
else
- glEnable(VLCGL_TARGET);
+ glEnable(vgl->tex_target);
#if USE_OPENGL_ES
static const GLfloat vertexCoord[] = {
@@ -542,7 +516,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
if (vgl->program)
glDisable(GL_FRAGMENT_PROGRAM_ARB);
else
- glDisable(VLCGL_TARGET);
+ glDisable(vgl->tex_target);
vlc_gl_Swap(vgl->gl);
More information about the vlc-commits
mailing list