I’m trying to create a full screen render window on a secondary monitor. The following is a relatively simple example that exhibits the error. When I set monitor_num to anything but 0 (i.e. my main/primary display) my code hangs at the glfwCreateWindow line. What am I doing wrong?
I’m operating on a Windows 10, 64-bit system with an Nvidia GPU and Visual Studio 2013.
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
GLuint programID;
GLuint vao;
GLuint vertexbuffer;
#define monitor_num 1
static void error_callback(int error, const char* description)
{
fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
void setup_shaders(void);
int main(void)
{
GLFWwindow* window;
glfwSetErrorCallback(error_callback);
if (!glfwInit())
exit(EXIT_FAILURE);
int number_of_monitors;
GLFWmonitor** monitors = glfwGetMonitors(&number_of_monitors);
const GLFWvidmode * current_mode = glfwGetVideoMode(monitors[monitor_num]);
glfwWindowHint(GLFW_MAXIMIZED, GL_TRUE);
glfwWindowHint(GLFW_AUTO_ICONIFY, GL_FALSE);
window = glfwCreateWindow(current_mode->width, current_mode->height, "Simple example", monitors[monitor_num], NULL);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
return false;
}
glfwSetKeyCallback(window, key_callback);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
setup_shaders();
static const GLfloat g_vertex_buffer_data[] =
{
-0.6f, -0.4f, 0.f,
0.6f, -0.4f, 0.f,
0.f, 0.6f, 0.f,
};
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glUseProgram(0);
while (!glfwWindowShouldClose(window))
{
glUseProgram(programID);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glUseProgram(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
void setup_shaders(void)
{
static const char * gl_vertex_shader_source_code[] =
{
"#version 330 core \n"
" \n"
"layout(location = 0) in vec3 vertexPosition_modelspace; \n"
" \n"
"void main(){ \n"
" \n"
" gl_Position = vec4(vertexPosition_modelspace, 1); \n"
"} \n"
};
static const GLchar * gl_fragment_shader_source_code[] =
{
"#version 330 core \n"
" \n"
"out vec3 color; \n"
" \n"
"void main() \n"
"{ \n"
" color = vec3(0.5, 1.0, 0.8); \n"
"} \n"
};
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, gl_vertex_shader_source_code, NULL);
glCompileShader(vertex_shader);
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, gl_fragment_shader_source_code, NULL);
glCompileShader(fragment_shader);
programID = glCreateProgram();
glAttachShader(programID, vertex_shader);
glAttachShader(programID, fragment_shader);
glLinkProgram(programID);
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
}