[vlc-devel] [PATCH 2/3] vout/opengl: always support shaders

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Dec 8 14:04:05 CET 2016


On 12/08/2016 01:15 PM, Thomas Guillem wrote:
> And drop fixed pipeline support.
> vout_display_opengl_New() will fail if there is no shaders support.

Shouldn't this be 2 commits?

> ---
>  modules/video_output/opengl.c | 307 +++++++++++++-----------------------------
>  1 file changed, 93 insertions(+), 214 deletions(-)
>
> diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
> index c96df1d..d9ef274 100644
> --- a/modules/video_output/opengl.c
> +++ b/modules/video_output/opengl.c
> @@ -81,15 +81,12 @@
>  #   define VLCGL_TEXTURE_COUNT 1
>  #   define PRECISION "precision highp float;"
>  #   define VLCGL_PICTURE_MAX 128
> -#   define SUPPORTS_SHADERS
>  #   define glClientActiveTexture(x)
>  #else
>  #   define GLSL_VERSION "120"
>  #   define VLCGL_TEXTURE_COUNT 1
>  #   define VLCGL_PICTURE_MAX 128
>  #   define PRECISION ""
> -#   define SUPPORTS_SHADERS
> -#   define SUPPORTS_FIXED_PIPELINE
>  #endif
>
>  #ifndef GL_RED
> @@ -156,7 +153,6 @@ struct vout_display_opengl_t {
>      int    subpicture_buffer_object_count;
>
>      /* Shader variables commands*/
> -#ifdef SUPPORTS_SHADERS
>      PFNGLGETUNIFORMLOCATIONPROC      GetUniformLocation;
>      PFNGLGETATTRIBLOCATIONPROC       GetAttribLocation;
>      PFNGLVERTEXATTRIBPOINTERPROC     VertexAttribPointer;
> @@ -190,7 +186,6 @@ struct vout_display_opengl_t {
>      PFNGLBINDBUFFERPROC    BindBuffer;
>      PFNGLBUFFERDATAPROC    BufferData;
>      PFNGLDELETEBUFFERSPROC DeleteBuffers;
> -#endif
>
>  #if defined(_WIN32)
>      PFNGLACTIVETEXTUREPROC  ActiveTexture;
> @@ -254,7 +249,6 @@ static int GetTexFormatSize(int target, int tex_format, int tex_internal,
>  }
>  #endif
>
> -#ifdef SUPPORTS_SHADERS
>  static void BuildVertexShader(vout_display_opengl_t *vgl,
>                                GLint *shader)
>  {
> @@ -449,8 +443,6 @@ static void BuildXYZFragmentShader(vout_display_opengl_t *vgl,
>      vgl->CompileShader(*shader);
>  }
>
> -#endif
> -
>  vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>                                                 const vlc_fourcc_t **subpicture_chromas,
>                                                 vlc_gl_t *gl,
> @@ -480,7 +472,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      const int yuv_plane_texformat = oglv3 ? GL_RED : GL_LUMINANCE;
>      const int yuv_plane_texformat_16 = oglv3 ? GL_R16 : GL_LUMINANCE16;
>  #else
> -    bool supports_shaders = false;
> +    bool supports_shaders = true;
>      const int yuv_plane_texformat = GL_LUMINANCE;
>  #endif
>
> @@ -516,8 +508,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      vgl->BufferData    = glBufferData;
>      vgl->DeleteBuffers = glDeleteBuffers;
>
> -    supports_shaders = true;
> -#elif defined(SUPPORTS_SHADERS)
> +#else
>      vgl->CreateShader  = (PFNGLCREATESHADERPROC)vlc_gl_GetProcAddress(vgl->gl, "glCreateShader");
>      vgl->ShaderSource  = (PFNGLSHADERSOURCEPROC)vlc_gl_GetProcAddress(vgl->gl, "glShaderSource");
>      vgl->CompileShader = (PFNGLCOMPILESHADERPROC)vlc_gl_GetProcAddress(vgl->gl, "glCompileShader");
> @@ -552,6 +543,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      if (!vgl->CreateShader || !vgl->ShaderSource || !vgl->CreateProgram)
>          supports_shaders = false;
>  #endif
> +    if (!supports_shaders)
> +    {
> +        msg_Err(gl, "shaders not supported");
> +        vlc_gl_Unlock(vgl->gl);
> +        free(vgl);
> +        return NULL;
> +    }
>
>  #if defined(_WIN32)
>      vgl->ActiveTexture = (PFNGLACTIVETEXTUREPROC)vlc_gl_GetProcAddress(vgl->gl, "glActiveTexture");
> @@ -572,12 +570,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      GLint max_texture_units = 0;
>      glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
>
> -#ifdef __APPLE__
> -#ifdef USE_OPENGL_ES2
> -    supports_shaders = true;
> -#endif
> -#endif
> -
>      /* Initialize with default chroma */
>      vgl->fmt = *fmt;
>      vgl->fmt.i_chroma = VLC_CODEC_RGB32;
> @@ -595,22 +587,14 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      vgl->tex_internal = GL_RGBA;
>      vgl->tex_type     = GL_UNSIGNED_BYTE;
>      /* Use YUV if possible and needed */
> -    bool need_fs_yuv = false;
>      bool need_fs_xyz = false;
> -#   if defined (USE_OPENGL_ES2)
> -    bool need_fs_rgba = true;
> -#   else
> -    bool need_fs_rgba = false;
> -#   endif
> -    bool need_vs = fmt->projection_mode != PROJECTION_MODE_RECTANGULAR;
>      float yuv_range_correction = 1.0;
>
> -    if (max_texture_units >= 3 && supports_shaders && vlc_fourcc_IsYUV(fmt->i_chroma)) {
> +    if (max_texture_units >= 3 && vlc_fourcc_IsYUV(fmt->i_chroma)) {
>          const vlc_fourcc_t *list = vlc_fourcc_GetYUVFallback(fmt->i_chroma);
>          while (*list) {
>              const vlc_chroma_description_t *dsc = vlc_fourcc_GetChromaDescription(*list);
>              if (dsc && dsc->plane_count == 3 && dsc->pixel_size == 1) {
> -                need_fs_yuv       = true;
>                  vgl->fmt          = *fmt;
>                  vgl->fmt.i_chroma = *list;
>                  vgl->tex_format   = yuv_plane_texformat;
> @@ -624,7 +608,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>                                          yuv_plane_texformat,
>                                          yuv_plane_texformat_16,
>                                          GL_UNSIGNED_SHORT) == 16) {
> -                need_fs_yuv       = true;
>                  vgl->fmt          = *fmt;
>                  vgl->fmt.i_chroma = *list;
>                  vgl->tex_format   = yuv_plane_texformat;
> @@ -670,67 +653,61 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      vgl->shader[1] =
>      vgl->shader[2] = -1;
>      vgl->local_count = 0;
> -    if (supports_shaders && (need_vs || need_fs_yuv || need_fs_xyz|| need_fs_rgba)) {
> -#ifdef SUPPORTS_SHADERS
> -        if (need_fs_xyz)
> -            BuildXYZFragmentShader(vgl, &vgl->shader[0]);
> -        else
> -            BuildYUVFragmentShader(vgl, &vgl->shader[0], &vgl->local_count,
> -                                vgl->local_value, fmt, yuv_range_correction);
> -
> -        BuildRGBAFragmentShader(vgl, &vgl->shader[1]);
> -        BuildVertexShader(vgl, &vgl->shader[2]);
> -
> -        /* Check shaders messages */
> -        for (unsigned j = 0; j < 3; j++) {
> -            int infoLength;
> -            vgl->GetShaderiv(vgl->shader[j], GL_INFO_LOG_LENGTH, &infoLength);
> -            if (infoLength <= 1)
> -                continue;
> -
> -            char *infolog = malloc(infoLength);
> -            int charsWritten;
> -            vgl->GetShaderInfoLog(vgl->shader[j], infoLength, &charsWritten, infolog);
> -            fprintf(stderr, "shader %d: %s\n", j, infolog);
> -            free(infolog);
> -        }
> +    if (need_fs_xyz)
> +        BuildXYZFragmentShader(vgl, &vgl->shader[0]);
> +    else
> +        BuildYUVFragmentShader(vgl, &vgl->shader[0], &vgl->local_count,
> +                            vgl->local_value, fmt, yuv_range_correction);
> +
> +    BuildRGBAFragmentShader(vgl, &vgl->shader[1]);
> +    BuildVertexShader(vgl, &vgl->shader[2]);
> +
> +    /* Check shaders messages */
> +    for (unsigned j = 0; j < 3; j++) {
> +        int infoLength;
> +        vgl->GetShaderiv(vgl->shader[j], GL_INFO_LOG_LENGTH, &infoLength);
> +        if (infoLength <= 1)
> +            continue;
> +
> +        char *infolog = malloc(infoLength);
> +        int charsWritten;
> +        vgl->GetShaderInfoLog(vgl->shader[j], infoLength, &charsWritten, infolog);
> +        fprintf(stderr, "shader %d: %s\n", j, infolog);
> +        free(infolog);

That's unrelated to your commit, but malloc isn't checked, and the 
entire block should probably in a #ifndef NDEBUG & use msg_Dbg instead 
of fprintf

> +    }
>
> -        /* YUV/XYZ & Vertex shaders */
> -        vgl->program[0] = vgl->CreateProgram();
> -        vgl->AttachShader(vgl->program[0], vgl->shader[0]);
> -        vgl->AttachShader(vgl->program[0], vgl->shader[2]);
> -        vgl->LinkProgram(vgl->program[0]);
> -
> -        /* RGB & Vertex shaders */
> -        vgl->program[1] = vgl->CreateProgram();
> -        vgl->AttachShader(vgl->program[1], vgl->shader[1]);
> -        vgl->AttachShader(vgl->program[1], vgl->shader[2]);
> -        vgl->LinkProgram(vgl->program[1]);
> -
> -        /* Check program messages */
> -        for (GLuint i = 0; i < 2; i++) {
> -            int infoLength = 0;
> -            vgl->GetProgramiv(vgl->program[i], GL_INFO_LOG_LENGTH, &infoLength);
> -            if (infoLength <= 1)
> -                continue;
> -            char *infolog = malloc(infoLength);
> -            int charsWritten;
> -            vgl->GetProgramInfoLog(vgl->program[i], infoLength, &charsWritten, infolog);
> -            fprintf(stderr, "shader program %d: %s\n", i, infolog);
> -            free(infolog);
> -
> -            /* If there is some message, better to check linking is ok */
> -            GLint link_status = GL_TRUE;
> -            vgl->GetProgramiv(vgl->program[i], GL_LINK_STATUS, &link_status);
> -            if (link_status == GL_FALSE) {
> -                fprintf(stderr, "Unable to use program %d\n", i);
> -                free(vgl);
> -                return NULL;
> -            }
> +    /* YUV/XYZ & Vertex shaders */
> +    vgl->program[0] = vgl->CreateProgram();
> +    vgl->AttachShader(vgl->program[0], vgl->shader[0]);
> +    vgl->AttachShader(vgl->program[0], vgl->shader[2]);
> +    vgl->LinkProgram(vgl->program[0]);
> +
> +    /* RGB & Vertex shaders */
> +    vgl->program[1] = vgl->CreateProgram();
> +    vgl->AttachShader(vgl->program[1], vgl->shader[1]);
> +    vgl->AttachShader(vgl->program[1], vgl->shader[2]);
> +    vgl->LinkProgram(vgl->program[1]);
> +
> +    /* Check program messages */
> +    for (GLuint i = 0; i < 2; i++) {
> +        int infoLength = 0;
> +        vgl->GetProgramiv(vgl->program[i], GL_INFO_LOG_LENGTH, &infoLength);
> +        if (infoLength <= 1)
> +            continue;
> +        char *infolog = malloc(infoLength);
> +        int charsWritten;
> +        vgl->GetProgramInfoLog(vgl->program[i], infoLength, &charsWritten, infolog);
> +        fprintf(stderr, "shader program %d: %s\n", i, infolog);
> +        free(infolog);
> +
> +        /* If there is some message, better to check linking is ok */
> +        GLint link_status = GL_TRUE;
> +        vgl->GetProgramiv(vgl->program[i], GL_LINK_STATUS, &link_status);
> +        if (link_status == GL_FALSE) {
> +            fprintf(stderr, "Unable to use program %d\n", i);
> +            free(vgl);
> +            return NULL;
>          }
> -#else
> -        (void)yuv_range_correction;
> -#endif
>      }
>
>      /* */
> @@ -741,7 +718,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
>      glClear(GL_COLOR_BUFFER_BIT);
>
> -#ifdef SUPPORTS_SHADERS
>      vgl->GenBuffers(1, &vgl->vertex_buffer_object);
>      vgl->GenBuffers(1, &vgl->index_buffer_object);
>      vgl->GenBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
> @@ -756,7 +732,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>      }
>      vgl->subpicture_buffer_object_count = subpicture_buffer_object_count;
>      vgl->GenBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
> -#endif
>
>      vlc_gl_Unlock(vgl->gl);
>
> @@ -797,20 +772,16 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
>          }
>          free(vgl->region);
>
> -#ifdef SUPPORTS_SHADERS
> -        if (vgl->program[0]) {
> -            for (int i = 0; i < 2; i++)
> -                vgl->DeleteProgram(vgl->program[i]);
> -            for (int i = 0; i < 3; i++)
> -                vgl->DeleteShader(vgl->shader[i]);
> -        }
> +        for (int i = 0; i < 2; i++)
> +            vgl->DeleteProgram(vgl->program[i]);
> +        for (int i = 0; i < 3; i++)
> +            vgl->DeleteShader(vgl->shader[i]);
>          vgl->DeleteBuffers(1, &vgl->vertex_buffer_object);
>          vgl->DeleteBuffers(1, &vgl->index_buffer_object);
>          vgl->DeleteBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
>          if (vgl->subpicture_buffer_object_count > 0)
>              vgl->DeleteBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
>          free(vgl->subpicture_buffer_object);
> -#endif
>
>          free(vgl->texture_temp_buf);
>          vlc_gl_Unlock(vgl->gl);
> @@ -1130,7 +1101,6 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
>      return VLC_SUCCESS;
>  }
>
> -#ifdef SUPPORTS_SHADERS
>  static const GLfloat identity[] = {
>      1.0f, 0.0f, 0.0f, 0.0f,
>      0.0f, 1.0f, 0.0f, 0.0f,
> @@ -1283,58 +1253,7 @@ void orientationTransformMatrix(GLfloat matrix[static 16], video_orientation_t o
>          matrix[1 * 4 + 1] = cos;
>      }
>  }
> -#endif
> -
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -static void DrawWithoutShaders(vout_display_opengl_t *vgl,
> -                               float *left, float *top, float *right, float *bottom)
> -{
> -    static const GLfloat vertexCoord[] = {
> -        -1.0f, -1.0f,
> -         1.0f, -1.0f,
> -        -1.0f,  1.0f,
> -         1.0f,  1.0f,
> -    };
> -
> -    const GLfloat textureCoord[] = {
> -        left[0],  bottom[0],
> -        right[0], bottom[0],
> -        left[0],  top[0],
> -        right[0], top[0]
> -    };
> -
> -    GLfloat transformMatrix[16];
> -    orientationTransformMatrix(transformMatrix, vgl->fmt.orientation);
> -
> -    glPushMatrix();
> -    glMatrixMode(GL_MODELVIEW);
> -    glLoadMatrixf(transformMatrix);
> -
> -    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
> -    glEnable(vgl->tex_target);
> -    glActiveTexture(GL_TEXTURE0 + 0);
> -    glClientActiveTexture(GL_TEXTURE0 + 0);
> -
> -    glBindTexture(vgl->tex_target, vgl->texture[0][0]);
> -
> -    glEnableClientState(GL_VERTEX_ARRAY);
> -    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
> -
> -    glTexCoordPointer(2, GL_FLOAT, 0, textureCoord);
> -    glVertexPointer(2, GL_FLOAT, 0, vertexCoord);
> -
> -    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> -
> -    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
> -    glDisableClientState(GL_VERTEX_ARRAY);
> -    glDisable(vgl->tex_target);
> -
> -    glPopMatrix();
> -
> -}
> -#endif
>
> -#ifdef SUPPORTS_SHADERS
>  static int BuildSphere(unsigned nbPlanes,
>                          GLfloat **vertexCoord, GLfloat **textureCoord, unsigned *nbVertices,
>                          GLushort **indices, unsigned *nbIndices,
> @@ -1721,7 +1640,6 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
>      vgl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, vgl->index_buffer_object);
>      glDrawElements(GL_TRIANGLES, nbIndices, GL_UNSIGNED_SHORT, 0);
>  }
> -#endif
>
>  int vout_display_opengl_Display(vout_display_opengl_t *vgl,
>                                  const video_format_t *source)
> @@ -1769,35 +1687,19 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
>          bottom[j] = (source->i_y_offset + source->i_visible_height) * scale_h;
>      }
>
> -#ifdef SUPPORTS_SHADERS
> -    if (vgl->program[0] && (vgl->chroma->plane_count == 3 || vgl->chroma->plane_count == 2))
> -        DrawWithShaders(vgl, left, top, right, bottom, 0);
> -    else if (vgl->program[1] && vgl->chroma->plane_count == 1)
> -        DrawWithShaders(vgl, left, top, right, bottom, 1);
> -    else
> -#endif
> -    {
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -        DrawWithoutShaders(vgl, left, top, right, bottom);
> -#endif
> -    }
> +    assert(vgl->chroma->plane_count >= 1 && vgl->chroma->plane_count <= 3);
> +
> +    const int program_idx = vgl->chroma->plane_count == 1 ? 1 : 0;
> +    DrawWithShaders(vgl, left, top, right, bottom, program_idx);
>
>      /* Draw the subpictures */
> -    if (vgl->program[1]) {
> -#ifdef SUPPORTS_SHADERS
> -        // Change the program for overlays
> -        vgl->UseProgram(vgl->program[1]);
> -        vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[1], "Texture"), 0);
> -#endif
> -    }
> +    // Change the program for overlays
> +    vgl->UseProgram(vgl->program[1]);
> +    vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[1], "Texture"), 0);
>
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -    glEnable(GL_TEXTURE_2D);
> -#endif
>      glEnable(GL_BLEND);
>      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
>
> -#ifdef SUPPORTS_SHADERS
>      /* We need two buffer objects for each region: for vertex and texture coordinates. */
>      if (2 * vgl->region_count > vgl->subpicture_buffer_object_count) {
>          if (vgl->subpicture_buffer_object_count > 0)
> @@ -1814,7 +1716,6 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
>          vgl->subpicture_buffer_object_count = new_count;
>          vgl->GenBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
>      }
> -#endif
>
>      glActiveTexture(GL_TEXTURE0 + 0);
>      glClientActiveTexture(GL_TEXTURE0 + 0);
> @@ -1834,51 +1735,29 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
>          };
>
>          glBindTexture(GL_TEXTURE_2D, glr->texture);
> -        if (vgl->program[1]) {
> -#ifdef SUPPORTS_SHADERS
> -            vgl->Uniform4f(vgl->GetUniformLocation(vgl->program[1], "FillColor"), 1.0f, 1.0f, 1.0f, glr->alpha);
> -
> -            vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i]);
> -            vgl->BufferData(GL_ARRAY_BUFFER, sizeof(textureCoord), textureCoord, GL_STATIC_DRAW);
> -            vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[1], "MultiTexCoord0"));
> -            vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[1], "MultiTexCoord0"), 2, GL_FLOAT, 0, 0, 0);
> -
> -            vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i + 1]);
> -            vgl->BufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
> -            vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[1], "VertexPosition"));
> -            vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[1], "VertexPosition"), 2, GL_FLOAT, 0, 0, 0);
> -
> -            // Subpictures have the correct orientation:
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "OrientationMatrix"), 1, GL_FALSE, identity);
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ProjectionMatrix"), 1, GL_FALSE, identity);
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ZRotMatrix"), 1, GL_FALSE, identity);
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "YRotMatrix"), 1, GL_FALSE, identity);
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "XRotMatrix"), 1, GL_FALSE, identity);
> -            vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ZoomMatrix"), 1, GL_FALSE, identity);
> -#endif
> -        } else {
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -            glEnableClientState(GL_VERTEX_ARRAY);
> -            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
> -            glColor4f(1.0f, 1.0f, 1.0f, glr->alpha);
> -            glTexCoordPointer(2, GL_FLOAT, 0, textureCoord);
> -            glVertexPointer(2, GL_FLOAT, 0, vertexCoord);
> -#endif
> -        }
> +        vgl->Uniform4f(vgl->GetUniformLocation(vgl->program[1], "FillColor"), 1.0f, 1.0f, 1.0f, glr->alpha);
> +
> +        vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i]);
> +        vgl->BufferData(GL_ARRAY_BUFFER, sizeof(textureCoord), textureCoord, GL_STATIC_DRAW);
> +        vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[1], "MultiTexCoord0"));
> +        vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[1], "MultiTexCoord0"), 2, GL_FLOAT, 0, 0, 0);
> +
> +        vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i + 1]);
> +        vgl->BufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
> +        vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[1], "VertexPosition"));
> +        vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[1], "VertexPosition"), 2, GL_FLOAT, 0, 0, 0);
> +
> +        // Subpictures have the correct orientation:
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "OrientationMatrix"), 1, GL_FALSE, identity);
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ProjectionMatrix"), 1, GL_FALSE, identity);
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ZRotMatrix"), 1, GL_FALSE, identity);
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "YRotMatrix"), 1, GL_FALSE, identity);
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "XRotMatrix"), 1, GL_FALSE, identity);
> +        vgl->UniformMatrix4fv(vgl->GetUniformLocation(vgl->program[1], "ZoomMatrix"), 1, GL_FALSE, identity);
>
>          glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> -
> -        if (!vgl->program[1]) {
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
> -            glDisableClientState(GL_VERTEX_ARRAY);
> -#endif
> -        }
>      }
>      glDisable(GL_BLEND);
> -#ifdef SUPPORTS_FIXED_PIPELINE
> -    glDisable(GL_TEXTURE_2D);
> -#endif
>
>      /* Display */
>      vlc_gl_Swap(vgl->gl);
>



More information about the vlc-devel mailing list