1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2020 VLC authors and VideoLAN
5 * Copyright (C) 2020 Videolabs
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
20 *****************************************************************************/
29 LogShaderErrors(vlc_object_t
*obj
, const opengl_vtable_t
*vt
, GLuint id
)
32 vt
->GetShaderiv(id
, GL_INFO_LOG_LENGTH
, &info_len
);
35 char *info_log
= malloc(info_len
);
39 vt
->GetShaderInfoLog(id
, info_len
, &written
, info_log
);
40 msg_Err(obj
, "shader: %s", info_log
);
47 LogProgramErrors(vlc_object_t
*obj
, const opengl_vtable_t
*vt
, GLuint id
)
50 vt
->GetProgramiv(id
, GL_INFO_LOG_LENGTH
, &info_len
);
53 char *info_log
= malloc(info_len
);
57 vt
->GetProgramInfoLog(id
, info_len
, &written
, info_log
);
58 msg_Err(obj
, "program: %s", info_log
);
65 CreateShader(vlc_object_t
*obj
, const opengl_vtable_t
*vt
, GLenum type
,
66 GLsizei count
, const GLchar
**src
)
68 GLuint shader
= vt
->CreateShader(type
);
72 vt
->ShaderSource(shader
, count
, src
, NULL
);
73 vt
->CompileShader(shader
);
75 LogShaderErrors(obj
, vt
, shader
);
78 vt
->GetShaderiv(shader
, GL_COMPILE_STATUS
, &compiled
);
81 msg_Err(obj
, "Failed to compile shader");
82 vt
->DeleteShader(shader
);
91 vlc_gl_BuildProgram(vlc_object_t
*obj
, const opengl_vtable_t
*vt
,
92 GLsizei vstring_count
, const GLchar
**vstrings
,
93 GLsizei fstring_count
, const GLchar
**fstrings
)
97 GLuint vertex_shader
= CreateShader(obj
, vt
, GL_VERTEX_SHADER
,
98 vstring_count
, vstrings
);
102 GLuint fragment_shader
= CreateShader(obj
, vt
, GL_FRAGMENT_SHADER
,
103 fstring_count
, fstrings
);
104 if (!fragment_shader
)
107 program
= vt
->CreateProgram();
111 vt
->AttachShader(program
, vertex_shader
);
112 vt
->AttachShader(program
, fragment_shader
);
114 vt
->LinkProgram(program
);
116 LogProgramErrors(obj
, vt
, program
);
119 vt
->GetProgramiv(program
, GL_LINK_STATUS
, &linked
);
122 msg_Err(obj
, "Failed to link program");
123 vt
->DeleteProgram(program
);
128 vt
->DeleteShader(fragment_shader
);
130 vt
->DeleteShader(vertex_shader
);