|
|
|
@ -318,6 +318,34 @@ int main(int argc, char** argv) |
|
|
|
|
int ch; |
|
|
|
|
bool list_extensions = false, list_layers = false; |
|
|
|
|
|
|
|
|
|
// These duplicate the defaults for each hint
|
|
|
|
|
int client_api = GLFW_OPENGL_API; |
|
|
|
|
int context_major = 1; |
|
|
|
|
int context_minor = 0; |
|
|
|
|
int context_release = GLFW_ANY_RELEASE_BEHAVIOR; |
|
|
|
|
int context_creation_api = GLFW_NATIVE_CONTEXT_API; |
|
|
|
|
int context_robustness = GLFW_NO_ROBUSTNESS; |
|
|
|
|
bool context_debug = false; |
|
|
|
|
bool context_no_error = false; |
|
|
|
|
bool opengl_forward = false; |
|
|
|
|
int opengl_profile = GLFW_OPENGL_ANY_PROFILE; |
|
|
|
|
int fb_red_bits = 8; |
|
|
|
|
int fb_green_bits = 8; |
|
|
|
|
int fb_blue_bits = 8; |
|
|
|
|
int fb_alpha_bits = 8; |
|
|
|
|
int fb_depth_bits = 24; |
|
|
|
|
int fb_stencil_bits = 8; |
|
|
|
|
int fb_accum_red_bits = 0; |
|
|
|
|
int fb_accum_green_bits = 0; |
|
|
|
|
int fb_accum_blue_bits = 0; |
|
|
|
|
int fb_accum_alpha_bits = 0; |
|
|
|
|
int fb_aux_buffers = 0; |
|
|
|
|
int fb_samples = 0; |
|
|
|
|
bool fb_stereo = false; |
|
|
|
|
bool fb_srgb = false; |
|
|
|
|
bool fb_doublebuffer = true; |
|
|
|
|
bool cocoa_graphics_switching = false; |
|
|
|
|
|
|
|
|
|
enum { CLIENT, CONTEXT, BEHAVIOR, DEBUG_CONTEXT, FORWARD, HELP, |
|
|
|
|
EXTENSIONS, LAYERS, |
|
|
|
|
MAJOR, MINOR, PROFILE, ROBUSTNESS, VERSION, |
|
|
|
@ -360,18 +388,6 @@ int main(int argc, char** argv) |
|
|
|
|
{ NULL, 0, NULL, 0 } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Initialize GLFW and create window
|
|
|
|
|
|
|
|
|
|
if (!valid_version()) |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
|
|
|
|
|
glfwSetErrorCallback(error_callback); |
|
|
|
|
|
|
|
|
|
glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE); |
|
|
|
|
|
|
|
|
|
if (!glfwInit()) |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
|
|
|
|
|
while ((ch = getopt_long(argc, argv, "a:b:c:dfhlm:n:p:s:v", options, NULL)) != -1) |
|
|
|
|
{ |
|
|
|
|
switch (ch) |
|
|
|
@ -379,9 +395,9 @@ int main(int argc, char** argv) |
|
|
|
|
case 'a': |
|
|
|
|
case CLIENT: |
|
|
|
|
if (strcasecmp(optarg, API_NAME_OPENGL) == 0) |
|
|
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); |
|
|
|
|
client_api = GLFW_OPENGL_API; |
|
|
|
|
else if (strcasecmp(optarg, API_NAME_OPENGL_ES) == 0) |
|
|
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); |
|
|
|
|
client_api = GLFW_OPENGL_ES_API; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
usage(); |
|
|
|
@ -391,15 +407,9 @@ int main(int argc, char** argv) |
|
|
|
|
case 'b': |
|
|
|
|
case BEHAVIOR: |
|
|
|
|
if (strcasecmp(optarg, BEHAVIOR_NAME_NONE) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR, |
|
|
|
|
GLFW_RELEASE_BEHAVIOR_NONE); |
|
|
|
|
} |
|
|
|
|
context_release = GLFW_RELEASE_BEHAVIOR_NONE; |
|
|
|
|
else if (strcasecmp(optarg, BEHAVIOR_NAME_FLUSH) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR, |
|
|
|
|
GLFW_RELEASE_BEHAVIOR_FLUSH); |
|
|
|
|
} |
|
|
|
|
context_release = GLFW_RELEASE_BEHAVIOR_FLUSH; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
usage(); |
|
|
|
@ -409,11 +419,11 @@ int main(int argc, char** argv) |
|
|
|
|
case 'c': |
|
|
|
|
case CONTEXT: |
|
|
|
|
if (strcasecmp(optarg, API_NAME_NATIVE) == 0) |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API); |
|
|
|
|
context_creation_api = GLFW_NATIVE_CONTEXT_API; |
|
|
|
|
else if (strcasecmp(optarg, API_NAME_EGL) == 0) |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API); |
|
|
|
|
context_creation_api = GLFW_EGL_CONTEXT_API; |
|
|
|
|
else if (strcasecmp(optarg, API_NAME_OSMESA) == 0) |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_OSMESA_CONTEXT_API); |
|
|
|
|
context_creation_api = GLFW_OSMESA_CONTEXT_API; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
usage(); |
|
|
|
@ -422,11 +432,11 @@ int main(int argc, char** argv) |
|
|
|
|
break; |
|
|
|
|
case 'd': |
|
|
|
|
case DEBUG_CONTEXT: |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_DEBUG, GLFW_TRUE); |
|
|
|
|
context_debug = true; |
|
|
|
|
break; |
|
|
|
|
case 'f': |
|
|
|
|
case FORWARD: |
|
|
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); |
|
|
|
|
opengl_forward = true; |
|
|
|
|
break; |
|
|
|
|
case 'h': |
|
|
|
|
case HELP: |
|
|
|
@ -441,24 +451,18 @@ int main(int argc, char** argv) |
|
|
|
|
break; |
|
|
|
|
case 'm': |
|
|
|
|
case MAJOR: |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, atoi(optarg)); |
|
|
|
|
context_major = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case 'n': |
|
|
|
|
case MINOR: |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, atoi(optarg)); |
|
|
|
|
context_minor = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case 'p': |
|
|
|
|
case PROFILE: |
|
|
|
|
if (strcasecmp(optarg, PROFILE_NAME_CORE) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, |
|
|
|
|
GLFW_OPENGL_CORE_PROFILE); |
|
|
|
|
} |
|
|
|
|
opengl_profile = GLFW_OPENGL_CORE_PROFILE; |
|
|
|
|
else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, |
|
|
|
|
GLFW_OPENGL_COMPAT_PROFILE); |
|
|
|
|
} |
|
|
|
|
opengl_profile = GLFW_OPENGL_COMPAT_PROFILE; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
usage(); |
|
|
|
@ -468,15 +472,9 @@ int main(int argc, char** argv) |
|
|
|
|
case 's': |
|
|
|
|
case ROBUSTNESS: |
|
|
|
|
if (strcasecmp(optarg, STRATEGY_NAME_NONE) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, |
|
|
|
|
GLFW_NO_RESET_NOTIFICATION); |
|
|
|
|
} |
|
|
|
|
context_robustness = GLFW_NO_RESET_NOTIFICATION; |
|
|
|
|
else if (strcasecmp(optarg, STRATEGY_NAME_LOSE) == 0) |
|
|
|
|
{ |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, |
|
|
|
|
GLFW_LOSE_CONTEXT_ON_RESET); |
|
|
|
|
} |
|
|
|
|
context_robustness = GLFW_LOSE_CONTEXT_ON_RESET; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
usage(); |
|
|
|
@ -489,90 +487,90 @@ int main(int argc, char** argv) |
|
|
|
|
exit(EXIT_SUCCESS); |
|
|
|
|
case REDBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_RED_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_red_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_RED_BITS, atoi(optarg)); |
|
|
|
|
fb_red_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case GREENBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_GREEN_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_green_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_GREEN_BITS, atoi(optarg)); |
|
|
|
|
fb_green_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case BLUEBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_BLUE_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_blue_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_BLUE_BITS, atoi(optarg)); |
|
|
|
|
fb_blue_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case ALPHABITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_ALPHA_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_alpha_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_ALPHA_BITS, atoi(optarg)); |
|
|
|
|
fb_alpha_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case DEPTHBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_DEPTH_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_depth_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_DEPTH_BITS, atoi(optarg)); |
|
|
|
|
fb_depth_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case STENCILBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_STENCIL_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_stencil_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_STENCIL_BITS, atoi(optarg)); |
|
|
|
|
fb_stencil_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case ACCUMREDBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_RED_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_accum_red_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_RED_BITS, atoi(optarg)); |
|
|
|
|
fb_accum_red_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case ACCUMGREENBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_GREEN_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_accum_green_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_GREEN_BITS, atoi(optarg)); |
|
|
|
|
fb_accum_green_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case ACCUMBLUEBITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_BLUE_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_accum_blue_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_BLUE_BITS, atoi(optarg)); |
|
|
|
|
fb_accum_blue_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case ACCUMALPHABITS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, GLFW_DONT_CARE); |
|
|
|
|
fb_accum_alpha_bits = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, atoi(optarg)); |
|
|
|
|
fb_accum_alpha_bits = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case AUXBUFFERS: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_AUX_BUFFERS, GLFW_DONT_CARE); |
|
|
|
|
fb_aux_buffers = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_AUX_BUFFERS, atoi(optarg)); |
|
|
|
|
fb_aux_buffers = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case SAMPLES: |
|
|
|
|
if (strcmp(optarg, "-") == 0) |
|
|
|
|
glfwWindowHint(GLFW_SAMPLES, GLFW_DONT_CARE); |
|
|
|
|
fb_samples = GLFW_DONT_CARE; |
|
|
|
|
else |
|
|
|
|
glfwWindowHint(GLFW_SAMPLES, atoi(optarg)); |
|
|
|
|
fb_samples = atoi(optarg); |
|
|
|
|
break; |
|
|
|
|
case STEREO: |
|
|
|
|
glfwWindowHint(GLFW_STEREO, GLFW_TRUE); |
|
|
|
|
fb_stereo = true; |
|
|
|
|
break; |
|
|
|
|
case SRGB: |
|
|
|
|
glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE); |
|
|
|
|
fb_srgb = true; |
|
|
|
|
break; |
|
|
|
|
case SINGLEBUFFER: |
|
|
|
|
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_FALSE); |
|
|
|
|
fb_doublebuffer = false; |
|
|
|
|
break; |
|
|
|
|
case NOERROR_SRSLY: |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_NO_ERROR, GLFW_TRUE); |
|
|
|
|
context_no_error = true; |
|
|
|
|
break; |
|
|
|
|
case GRAPHICS_SWITCHING: |
|
|
|
|
glfwWindowHint(GLFW_COCOA_GRAPHICS_SWITCHING, GLFW_TRUE); |
|
|
|
|
cocoa_graphics_switching = true; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
usage(); |
|
|
|
@ -580,10 +578,51 @@ int main(int argc, char** argv) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Initialize GLFW and create window
|
|
|
|
|
|
|
|
|
|
if (!valid_version()) |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
|
|
|
|
|
glfwSetErrorCallback(error_callback); |
|
|
|
|
|
|
|
|
|
glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE); |
|
|
|
|
|
|
|
|
|
if (!glfwInit()) |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
|
|
|
|
|
print_version(); |
|
|
|
|
|
|
|
|
|
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); |
|
|
|
|
|
|
|
|
|
glfwWindowHint(GLFW_CLIENT_API, client_api); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, context_major); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, context_minor); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR, context_release); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, context_creation_api); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, context_robustness); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_DEBUG, context_debug); |
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_NO_ERROR, context_no_error); |
|
|
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, opengl_forward); |
|
|
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, opengl_profile); |
|
|
|
|
|
|
|
|
|
glfwWindowHint(GLFW_RED_BITS, fb_red_bits); |
|
|
|
|
glfwWindowHint(GLFW_BLUE_BITS, fb_blue_bits); |
|
|
|
|
glfwWindowHint(GLFW_GREEN_BITS, fb_green_bits); |
|
|
|
|
glfwWindowHint(GLFW_ALPHA_BITS, fb_alpha_bits); |
|
|
|
|
glfwWindowHint(GLFW_DEPTH_BITS, fb_depth_bits); |
|
|
|
|
glfwWindowHint(GLFW_STENCIL_BITS, fb_stencil_bits); |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_RED_BITS, fb_accum_red_bits); |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_GREEN_BITS, fb_accum_green_bits); |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_BLUE_BITS, fb_accum_blue_bits); |
|
|
|
|
glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, fb_accum_alpha_bits); |
|
|
|
|
glfwWindowHint(GLFW_AUX_BUFFERS, fb_aux_buffers); |
|
|
|
|
glfwWindowHint(GLFW_SAMPLES, fb_samples); |
|
|
|
|
glfwWindowHint(GLFW_STEREO, fb_stereo); |
|
|
|
|
glfwWindowHint(GLFW_SRGB_CAPABLE, fb_srgb); |
|
|
|
|
glfwWindowHint(GLFW_DOUBLEBUFFER, fb_doublebuffer); |
|
|
|
|
|
|
|
|
|
glfwWindowHint(GLFW_COCOA_GRAPHICS_SWITCHING, cocoa_graphics_switching); |
|
|
|
|
|
|
|
|
|
GLFWwindow* window = glfwCreateWindow(200, 200, "Version", NULL, NULL); |
|
|
|
|
if (!window) |
|
|
|
|
{ |
|
|
|
|