| 199 | } // namespace |
| 200 | |
| 201 | bool GlfwCanvas::load() { |
| 202 | // Requires a current GL context (glfwMakeContextCurrent). Only |
| 203 | // meaningfully callable at runtime once a window exists; unit tests |
| 204 | // exercise render_width/height() and get_text_renderer() without it. |
| 205 | fns_->pfn_glCreateShader = |
| 206 | load_gl<Fns::PFN_glCreateShader>("glCreateShader"); |
| 207 | fns_->pfn_glShaderSource = |
| 208 | load_gl<Fns::PFN_glShaderSource>("glShaderSource"); |
| 209 | fns_->pfn_glCompileShader = |
| 210 | load_gl<Fns::PFN_glCompileShader>("glCompileShader"); |
| 211 | fns_->pfn_glGetShaderiv = load_gl<Fns::PFN_glGetShaderiv>("glGetShaderiv"); |
| 212 | fns_->pfn_glGetShaderInfoLog = |
| 213 | load_gl<Fns::PFN_glGetShaderInfoLog>("glGetShaderInfoLog"); |
| 214 | fns_->pfn_glCreateProgram = |
| 215 | load_gl<Fns::PFN_glCreateProgram>("glCreateProgram"); |
| 216 | fns_->pfn_glAttachShader = |
| 217 | load_gl<Fns::PFN_glAttachShader>("glAttachShader"); |
| 218 | fns_->pfn_glLinkProgram = load_gl<Fns::PFN_glLinkProgram>("glLinkProgram"); |
| 219 | fns_->pfn_glGetProgramiv = |
| 220 | load_gl<Fns::PFN_glGetProgramiv>("glGetProgramiv"); |
| 221 | fns_->pfn_glGetProgramInfoLog = |
| 222 | load_gl<Fns::PFN_glGetProgramInfoLog>("glGetProgramInfoLog"); |
| 223 | fns_->pfn_glDeleteShader = |
| 224 | load_gl<Fns::PFN_glDeleteShader>("glDeleteShader"); |
| 225 | fns_->pfn_glDeleteProgram = |
| 226 | load_gl<Fns::PFN_glDeleteProgram>("glDeleteProgram"); |
| 227 | fns_->pfn_glUseProgram = load_gl<Fns::PFN_glUseProgram>("glUseProgram"); |
| 228 | fns_->pfn_glGetUniformLocation = |
| 229 | load_gl<Fns::PFN_glGetUniformLocation>("glGetUniformLocation"); |
| 230 | fns_->pfn_glUniform1i = load_gl<Fns::PFN_glUniform1i>("glUniform1i"); |
| 231 | fns_->pfn_glUniform2f = load_gl<Fns::PFN_glUniform2f>("glUniform2f"); |
| 232 | fns_->pfn_glUniform3fv = load_gl<Fns::PFN_glUniform3fv>("glUniform3fv"); |
| 233 | fns_->pfn_glUniform4fv = load_gl<Fns::PFN_glUniform4fv>("glUniform4fv"); |
| 234 | fns_->pfn_glUniformMatrix4fv = |
| 235 | load_gl<Fns::PFN_glUniformMatrix4fv>("glUniformMatrix4fv"); |
| 236 | fns_->pfn_glGenBuffers = load_gl<Fns::PFN_glGenBuffers>("glGenBuffers"); |
| 237 | fns_->pfn_glDeleteBuffers = |
| 238 | load_gl<Fns::PFN_glDeleteBuffers>("glDeleteBuffers"); |
| 239 | fns_->pfn_glBindBuffer = load_gl<Fns::PFN_glBindBuffer>("glBindBuffer"); |
| 240 | fns_->pfn_glBufferData = load_gl<Fns::PFN_glBufferData>("glBufferData"); |
| 241 | fns_->pfn_glEnableVertexAttribArray = |
| 242 | load_gl<Fns::PFN_glEnableVertexAttribArray>( |
| 243 | "glEnableVertexAttribArray"); |
| 244 | fns_->pfn_glVertexAttribPointer = |
| 245 | load_gl<Fns::PFN_glVertexAttribPointer>("glVertexAttribPointer"); |
| 246 | fns_->pfn_glGenTextures = load_gl<Fns::PFN_glGenTextures>("glGenTextures"); |
| 247 | fns_->pfn_glDeleteTextures = |
| 248 | load_gl<Fns::PFN_glDeleteTextures>("glDeleteTextures"); |
| 249 | fns_->pfn_glBindTexture = load_gl<Fns::PFN_glBindTexture>("glBindTexture"); |
| 250 | fns_->pfn_glActiveTexture = |
| 251 | load_gl<Fns::PFN_glActiveTexture>("glActiveTexture"); |
| 252 | fns_->pfn_glTexParameteri = |
| 253 | load_gl<Fns::PFN_glTexParameteri>("glTexParameteri"); |
| 254 | fns_->pfn_glTexImage2D = load_gl<Fns::PFN_glTexImage2D>("glTexImage2D"); |
| 255 | fns_->pfn_glTexSubImage2D = |
| 256 | load_gl<Fns::PFN_glTexSubImage2D>("glTexSubImage2D"); |
| 257 | fns_->pfn_glGenerateMipmap = |
| 258 | load_gl<Fns::PFN_glGenerateMipmap>("glGenerateMipmap"); |