[vlc-devel] [PATCH 05/11] vout/opengl: factor textures generation
Thomas Guillem
thomas at gllm.fr
Wed Dec 14 17:16:10 CET 2016
---
modules/video_output/opengl/vout_helper.c | 84 +++++++++++++++----------------
1 file changed, 40 insertions(+), 44 deletions(-)
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 8756e49..ceec884 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -888,6 +888,33 @@ void vout_display_opengl_SetWindowAspectRatio(vout_display_opengl_t *vgl,
UpdateZ(vgl);
}
+static void GenTextures(GLenum tex_target, GLint tex_internal,
+ GLenum tex_format, GLenum tex_type, GLsizei n,
+ GLsizei *tex_width, GLsizei *tex_height,
+ GLuint * textures)
+{
+ glGenTextures(n, textures);
+ for (GLsizei j = 0; j < n; j++) {
+ glActiveTexture(GL_TEXTURE0 + j);
+ glClientActiveTexture(GL_TEXTURE0 + j);
+ glBindTexture(tex_target, textures[j]);
+
+#if !defined(USE_OPENGL_ES2)
+ /* Set the texture parameters */
+ glTexParameterf(tex_target, GL_TEXTURE_PRIORITY, 1.0);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+#endif
+
+ glTexParameteri(tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ /* Call glTexImage2D only once, and use glTexSubImage2D later */
+ glTexImage2D(tex_target, 0, tex_internal, tex_width[j], tex_height[j],
+ 0, tex_format, tex_type, NULL);
+ }
+}
picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl, unsigned requested_count)
{
@@ -915,30 +942,10 @@ picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl, unsigned
if (vlc_gl_Lock(vgl->gl))
return vgl->pool;
- for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
- glGenTextures(vgl->chroma->plane_count, vgl->texture[i]);
- for (unsigned j = 0; j < vgl->chroma->plane_count; j++) {
- glActiveTexture(GL_TEXTURE0 + j);
- glClientActiveTexture(GL_TEXTURE0 + j);
- glBindTexture(vgl->tex_target, vgl->texture[i][j]);
-
-#if !defined(USE_OPENGL_ES2)
- /* Set the texture parameters */
- glTexParameterf(vgl->tex_target, GL_TEXTURE_PRIORITY, 1.0);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-#endif
-
- 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);
-
- /* Call glTexImage2D only once, and use glTexSubImage2D later */
- glTexImage2D(vgl->tex_target, 0,
- vgl->tex_internal, vgl->tex_width[j], vgl->tex_height[j],
- 0, vgl->tex_format, vgl->tex_type, NULL);
- }
- }
+ for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++)
+ GenTextures(vgl->tex_target, vgl->tex_internal, vgl->tex_format,
+ vgl->tex_type, vgl->chroma->plane_count,
+ vgl->tex_width, vgl->tex_height, vgl->texture[i]);
vlc_gl_Unlock(vgl->gl);
@@ -1090,28 +1097,17 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
const int pixels_offset = r->fmt.i_y_offset * r->p_picture->p->i_pitch +
r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
- if (glr->texture) {
- /* A texture was successfully recycled, reuse it. */
- glBindTexture(GL_TEXTURE_2D, glr->texture);
- Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, glr->width, glr->height, 1, 1, 1, 1,
- r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch, 0,
- &r->p_picture->p->p_pixels[pixels_offset], GL_TEXTURE_2D, glr->format, glr->type);
- } else {
+ if (!glr->texture)
+ {
/* Could not recycle a previous texture, generate a new one. */
- glGenTextures(1, &glr->texture);
- glBindTexture(GL_TEXTURE_2D, glr->texture);
-#if !defined(USE_OPENGL_ES2)
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 1.0);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-#endif
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, glr->width, glr->height, 1, 1, 1, 1,
- r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch, 1,
- &r->p_picture->p->p_pixels[pixels_offset], GL_TEXTURE_2D, glr->format, glr->type);
+ GLsizei tex_width = glr->width, tex_height = glr->height;
+ GenTextures(GL_TEXTURE_2D, glr->format, glr->format, glr->type,
+ 1, &tex_width, &tex_height, &glr->texture);
}
+ glBindTexture(GL_TEXTURE_2D, glr->texture);
+ Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, glr->width, glr->height, 1, 1, 1, 1,
+ r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch, 0,
+ &r->p_picture->p->p_pixels[pixels_offset], GL_TEXTURE_2D, glr->format, glr->type);
}
}
for (int i = 0; i < last_count; i++) {
--
2.10.2
More information about the vlc-devel
mailing list