Graphics library for Mercury, including OpenGL bindings, TGA image reading, and X11, Win32, and SDL2 windowing and input.
リビジョン | c44b3bd3e05bcfadbab2847a05f9ec81d1015f79 (tree) |
---|---|
日時 | 2022-03-21 05:09:28 |
作者 | AlaskanEmily <emily@alas...> |
コミッター | AlaskanEmily |
Improve GL version parsing
@@ -121,7 +121,7 @@ | ||
121 | 121 | |
122 | 122 | :- pred opengl_version_string(Ctx, string, io.io, io.io) |
123 | 123 | <= saffron.gl.context(Ctx). |
124 | -:- mode opengl_version_string(in, uo, di, uo) is det. | |
124 | +:- mode opengl_version_string(in, out, di, uo) is det. | |
125 | 125 | |
126 | 126 | %-----------------------------------------------------------------------------% |
127 | 127 |
@@ -133,7 +133,7 @@ | ||
133 | 133 | |
134 | 134 | :- pred shader_model_version_string(Ctx, string, io.io, io.io) |
135 | 135 | <= saffron.gl.context(Ctx). |
136 | -:- mode shader_model_version_string(in, uo, di, uo) is det. | |
136 | +:- mode shader_model_version_string(in, out, di, uo) is det. | |
137 | 137 | |
138 | 138 | %-----------------------------------------------------------------------------% |
139 | 139 |
@@ -425,54 +425,56 @@ gl_load_function(gl_load_func_ctx(Ctx), Name, MaybeFunc, !IO) :- | ||
425 | 425 | |
426 | 426 | %-----------------------------------------------------------------------------% |
427 | 427 | |
428 | +:- type version_type ---> gl ; glsl. | |
429 | + | |
430 | +:- pragma foreign_enum("C", version_type/0, [ | |
431 | + gl - "GL_VERSION", | |
432 | + glsl - "GL_SHADING_LANGUAGE_VERSION" | |
433 | +]). | |
434 | + | |
435 | +%-----------------------------------------------------------------------------% | |
436 | + | |
437 | +:- pred version_string(version_type, string, io.io, io.io). | |
438 | +:- mode version_string(in, out, di, uo) is det. | |
439 | + | |
428 | 440 | :- pragma foreign_proc("C", |
429 | - opengl_version_string(_Ctx::in, Str::uo, IOi::di, IOo::uo), | |
430 | - [will_not_call_mercury, promise_pure, thread_safe, will_not_throw_exception], | |
441 | + version_string(Type::in, Str::out, IOi::di, IOo::uo), | |
442 | + [will_not_call_mercury, promise_pure, thread_safe, will_not_throw_exception, | |
443 | + does_not_affect_liveness, may_duplicate], | |
431 | 444 | " |
432 | - const void *ver = glGetString(GL_VERSION); | |
433 | - if(glGetError() != GL_NO_ERROR || ver == NULL){ | |
434 | - ver = ""0.0""; | |
445 | + const char *ver = (char*)glGetString(Type); | |
446 | + if(glGetError() != GL_NO_ERROR || ver == NULL || *ver == 0){ | |
447 | + Str = ""0.0""; | |
448 | + } | |
449 | + else{ | |
450 | + while(*ver == ' ') | |
451 | + ver++; | |
452 | + MR_Integer len = strspn(ver, ""0123456789.""); | |
453 | + Str = MR_GC_malloc_atomic(len + 1); | |
454 | + memcpy(Str, ver, len + 1); | |
435 | 455 | } |
436 | - MR_Integer len = strlen(ver); | |
437 | - Str = MR_GC_malloc_atomic(len + 1); | |
438 | - memcpy(Str, ver, len + 1); | |
439 | 456 | IOo = IOi; |
440 | 457 | "). |
441 | 458 | |
442 | 459 | %-----------------------------------------------------------------------------% |
443 | 460 | |
444 | -:- pragma inline(opengl_version/4). | |
461 | +opengl_version_string(Ctx, Str, !IO) :- | |
462 | + saffron.make_current(Ctx, !IO), | |
463 | + version_string(gl, Str, !IO). | |
464 | + | |
465 | +%-----------------------------------------------------------------------------% | |
445 | 466 | |
446 | 467 | opengl_version(Ctx, saffron.parse_sem_ver(Version), !IO) :- |
447 | - saffron.make_current(Ctx, !IO), | |
448 | 468 | opengl_version_string(Ctx, Version, !IO). |
449 | 469 | |
450 | 470 | %-----------------------------------------------------------------------------% |
451 | 471 | |
452 | -:- pragma foreign_proc("C", | |
453 | - shader_model_version_string(_Ctx::in, VersionString::uo, IOi::di, IOo::uo), | |
454 | - [will_not_call_mercury, promise_pure, thread_safe, will_not_throw_exception], | |
455 | - " | |
456 | - const void *version_string; | |
457 | - MR_Integer version_string_len; | |
458 | - (void)glGetError(); | |
459 | - version_string = glGetString(GL_SHADING_LANGUAGE_VERSION); | |
460 | - if(glGetError() != GL_NO_ERROR || version_string == NULL){ | |
461 | - version_string = ""0""; | |
462 | - version_string_len = 1; | |
463 | - } | |
464 | - else{ | |
465 | - version_string_len = strcspn(version_string, "" ""); | |
466 | - } | |
467 | - VersionString = MR_GC_malloc_atomic(version_string_len + 1); | |
468 | - memcpy(VersionString, version_string, version_string_len); | |
469 | - ((char*)VersionString)[version_string_len] = '\\0'; | |
470 | - IOo = IOi; | |
471 | - "). | |
472 | +shader_model_version_string(Ctx, Str, !IO) :- | |
473 | + saffron.make_current(Ctx, !IO), | |
474 | + version_string(glsl, Str, !IO). | |
472 | 475 | |
473 | 476 | %-----------------------------------------------------------------------------% |
474 | 477 | |
475 | 478 | shader_model_version(Ctx, saffron.parse_sem_ver(Version), !IO) :- |
476 | - saffron.make_current(Ctx, !IO), | |
477 | 479 | shader_model_version_string(Ctx, Version, !IO). |
478 | 480 |