Graphics library for Mercury, including OpenGL bindings, TGA image reading, and X11, Win32, and SDL2 windowing and input.
リビジョン | 8f211d9892a54f92bfcbfff5a40d2cd5491e82e7 (tree) |
---|---|
日時 | 2022-04-27 11:04:55 |
作者 | AlaskanEmily <emily@alas...> |
コミッター | AlaskanEmily |
Fix support for non-GL3+ systems
@@ -62,7 +62,7 @@ struct SaffronGL_BufferCtx{ | ||
62 | 62 | #define SAFFRON_GL_LOAD_BUFFER_CTX(GLCTX, CTX) (*(CTX) = 0) |
63 | 63 | #else |
64 | 64 | #define SAFFRON_GL_BUFFER_FUNC(CTX, X) ((CTX)->X) |
65 | -#define SAFFRON_GL_BUFFER_CTX struct SaffronGL_BufferCtx | |
65 | +#define SAFFRON_GL_BUFFER_CTX struct SaffronGL_BufferCtx* | |
66 | 66 | int SaffronGL_LoadBufferCtx(MR_Word gl_ctx, struct SaffronGL_BufferCtx **ctx_ptr); |
67 | 67 | #define SAFFRON_GL_LOAD_BUFFER_CTX SaffronGL_LoadBufferCtx |
68 | 68 | #endif |
@@ -80,11 +80,13 @@ int SaffronGL_LoadBufferCtx(MR_Word gl_ctx, struct SaffronGL_BufferCtx **ctx_ptr | ||
80 | 80 | return 0; |
81 | 81 | }while(0); |
82 | 82 | #define SAFFRON_GL_LOAD_FUNC_BUFFER_ARB(X) SAFFRON_GL_FUNC_LOAD(X, "ARB") |
83 | - if(SaffronGL_SupportsExtension("GL_ARB_vertex_buffer_object")) do{ | |
84 | - SAFFRON_GL_BUFFER_FUNCS(SAFFRON_GL_LOAD_FUNC_BUFFER_ARB) | |
85 | - *ctx_ptr = ctx; | |
86 | - return 0; | |
87 | - }while(0); | |
83 | + if(SaffronGL_SupportsExtension(gl_ctx, (MR_String)"GL_ARB_vertex_buffer_object")){ | |
84 | + do{ | |
85 | + SAFFRON_GL_BUFFER_FUNCS(SAFFRON_GL_LOAD_FUNC_BUFFER_ARB) | |
86 | + *ctx_ptr = ctx; | |
87 | + return 0; | |
88 | + }while(0); | |
89 | + } | |
88 | 90 | return 1; |
89 | 91 | } |
90 | 92 | #endif |
@@ -41,7 +41,8 @@ | ||
41 | 41 | %-----------------------------------------------------------------------------% |
42 | 42 | |
43 | 43 | :- pred create_buffer_ctx(Ctx, maybe.maybe_error(buffer_ctx), io.io, io.io) |
44 | - <= saffron.gl.context(Ctx). | |
44 | + <= (saffron.gl.context(Ctx), | |
45 | + saffron.gl.supports_extensions(Ctx)). | |
45 | 46 | :- mode create_buffer_ctx(in, out, di, uo) is det. |
46 | 47 | |
47 | 48 | %-----------------------------------------------------------------------------% |
@@ -155,6 +155,8 @@ typedef char SaffronGLchar; | ||
155 | 155 | |
156 | 156 | #endif |
157 | 157 | |
158 | +# undef SAFFRON_GL_EXPECT_BUFFER | |
159 | +# undef SAFFRON_GL_EXPECT_SHADER | |
158 | 160 | /* GL_NV_draw_texture */ |
159 | 161 | typedef void(APIENTRY*SaffronGL_DrawTextureNV_PROC)( |
160 | 162 | GLuint, |
@@ -326,7 +328,10 @@ texture_upload_at(_Ctx, Tex, B, X, Y, W, H, !IO) :- | ||
326 | 328 | % existentially type functor which we can pass to a Mercury predicate that will |
327 | 329 | % unpack it and invoke the predicate. |
328 | 330 | :- type gl_load_func_ctx ---> |
329 | - some [Ctx] (gl_load_func_ctx(Ctx) => saffron.context(Ctx)). | |
331 | + some [Ctx] (gl_load_func_ctx(Ctx) | |
332 | + => (saffron.context(Ctx), | |
333 | + saffron.gl.context(Ctx), | |
334 | + saffron.gl.supports_extensions(Ctx))). | |
330 | 335 | |
331 | 336 | %-----------------------------------------------------------------------------% |
332 | 337 | % A non-higher-typed version of load_function that takes gl_load_func_ctx. |
@@ -349,6 +354,47 @@ gl_load_function(gl_load_func_ctx(Ctx), Name, MaybeFunc, !IO) :- | ||
349 | 354 | gl_load_function(in, in, out, di, uo), |
350 | 355 | "SaffronGL_LoadFunction"). |
351 | 356 | |
357 | +:- pred gl_version( | |
358 | + gl_load_func_ctx, | |
359 | + int, | |
360 | + int, | |
361 | + io.io, io.io). | |
362 | +:- mode gl_version( | |
363 | + in, | |
364 | + out, | |
365 | + out, | |
366 | + di, uo) is det. | |
367 | + | |
368 | +gl_version(gl_load_func_ctx(Ctx), Major, Minor, !IO) :- | |
369 | + opengl_version(Ctx, MaybeSemVer, !IO), | |
370 | + ( | |
371 | + MaybeSemVer = maybe.ok(SemVer), | |
372 | + Major = major(SemVer), | |
373 | + Minor = minor(SemVer) | |
374 | + ; | |
375 | + MaybeSemVer = maybe.error(Error), | |
376 | + trace [io(!XIO)] ( | |
377 | + io.write_string("Error getting OpenGL version: ", !XIO), | |
378 | + io.write_string(Error, !XIO), | |
379 | + io.nl(!XIO) | |
380 | + ), | |
381 | + Major = 0, | |
382 | + Minor = 0 | |
383 | + ). | |
384 | + | |
385 | +:- pragma foreign_export("C", | |
386 | + gl_version(in, out, out, di, uo), | |
387 | + "SaffronGL_Version"). | |
388 | + | |
389 | +:- pred gl_supports_extension(gl_load_func_ctx::in, string::in) is semidet. | |
390 | + | |
391 | +gl_supports_extension(gl_load_func_ctx(Ctx), Ext) :- | |
392 | + saffron.gl.supports_extension(Ctx, Ext). | |
393 | + | |
394 | +:- pragma foreign_export("C", | |
395 | + gl_supports_extension(in, in), | |
396 | + "SaffronGL_SupportsExtension"). | |
397 | + | |
352 | 398 | %-----------------------------------------------------------------------------% |
353 | 399 | |
354 | 400 | :- type version_type ---> gl ; glsl. |
@@ -1,6 +1,6 @@ | ||
1 | 1 | func,CreateShader,GLenum,=GLuint |
2 | 2 | func,DeleteShader,GLuint |
3 | -func,ShaderSource,GLuint,GLsizei,const SaffronGLchar**,const GLint | |
3 | +func,ShaderSource,GLuint,GLsizei,const SaffronGLchar**,const GLint* | |
4 | 4 | func,CompileShader,GLuint |
5 | 5 | func,GetShaderiv,GLuint,GLenum,GLint* |
6 | 6 | func,GetShaderInfoLog,GLuint,GLsizei,GLsizei*,SaffronGLchar* |
@@ -23,7 +23,7 @@ typedef void(APIENTRY*SaffronGL_ShaderSource_PROC)( | ||
23 | 23 | GLuint, |
24 | 24 | GLsizei, |
25 | 25 | const SaffronGLchar**, |
26 | - const GLint); | |
26 | + const GLint*); | |
27 | 27 | #endif |
28 | 28 | #ifndef SAFFRON_GL_IMPL |
29 | 29 | typedef void(APIENTRY*SaffronGL_CompileShader_PROC)( |
@@ -96,7 +96,7 @@ struct SaffronGL_ShaderCtx{ | ||
96 | 96 | #define SAFFRON_GL_LOAD_SHADER_CTX(GLCTX, CTX) (*(CTX) = 0) |
97 | 97 | #else |
98 | 98 | #define SAFFRON_GL_SHADER_FUNC(CTX, X) ((CTX)->X) |
99 | -#define SAFFRON_GL_SHADER_CTX struct SaffronGL_ShaderCtx | |
99 | +#define SAFFRON_GL_SHADER_CTX struct SaffronGL_ShaderCtx* | |
100 | 100 | int SaffronGL_LoadShaderCtx(MR_Word gl_ctx, struct SaffronGL_ShaderCtx **ctx_ptr); |
101 | 101 | #define SAFFRON_GL_LOAD_SHADER_CTX SaffronGL_LoadShaderCtx |
102 | 102 | #endif |
@@ -25,7 +25,8 @@ | ||
25 | 25 | %-----------------------------------------------------------------------------% |
26 | 26 | |
27 | 27 | :- pred create_shader_ctx(Ctx, maybe.maybe_error(shader_ctx), io.io, io.io) |
28 | - <= saffron.context(Ctx). | |
28 | + <= (saffron.gl.context(Ctx), | |
29 | + saffron.gl.supports_extensions(Ctx)). | |
29 | 30 | :- mode create_shader_ctx(in, out, di, uo) is det. |
30 | 31 | |
31 | 32 | %-----------------------------------------------------------------------------% |
@@ -85,7 +86,7 @@ | ||
85 | 86 | #include ""saffron.gl.shader.inc"" |
86 | 87 | "). |
87 | 88 | |
88 | -:- pragma foreign_decl("C", " | |
89 | +:- pragma foreign_code("C", " | |
89 | 90 | #define SAFFRON_GL_IMPL |
90 | 91 | #include ""saffron.gl.shader.inc"" |
91 | 92 | #undef SAFFRON_GL_IMPL |
@@ -859,6 +859,8 @@ init(Ctx, | ||
859 | 859 | !IO) :- |
860 | 860 | |
861 | 861 | saffron.make_current(Ctx, !IO), |
862 | + % Get the supports_extension implementation for GL 2 contexts. | |
863 | + TempCtx = context(Ctx, maybe.no, maybe.no), | |
862 | 864 | saffron.gl.shader_model_version(Ctx, MaybeGLSLVersion, !IO), |
863 | 865 | % TODO: Should this live inside create_shader_ctx? |
864 | 866 | ( if |
@@ -866,12 +868,12 @@ init(Ctx, | ||
866 | 868 | saffron.sem_ver_compare(GLSLCmp, GLSLVersion, saffron.sem_ver(1, 20)), |
867 | 869 | GLSLCmp \= (<) |
868 | 870 | then |
869 | - saffron.gl.shader.create_shader_ctx(Ctx, MaybeErrShaderCtx, !IO), | |
871 | + saffron.gl.shader.create_shader_ctx(TempCtx, MaybeErrShaderCtx, !IO), | |
870 | 872 | MaybeShaderCtx = complete_load_ctx("shader", MaybeErrShaderCtx) |
871 | 873 | else |
872 | 874 | MaybeShaderCtx = maybe.no |
873 | 875 | ), |
874 | - saffron.gl.buffer.create_buffer_ctx(Ctx, MaybeErrBufferCtx, !IO), | |
876 | + saffron.gl.buffer.create_buffer_ctx(TempCtx, MaybeErrBufferCtx, !IO), | |
875 | 877 | MaybeBufferCtx = complete_load_ctx("buffer", MaybeErrBufferCtx), |
876 | 878 | init(!IO). |
877 | 879 |
@@ -87,7 +87,7 @@ $1 == "load" { | ||
87 | 87 | sig = "int SaffronGL_Load" $2 "Ctx(MR_Word gl_ctx, " struct " **ctx_ptr)"; |
88 | 88 | print("\ |
89 | 89 | #define SAFFRON_GL_" upper2 "_FUNC(CTX, X) ((CTX)->X)\n\ |
90 | -#define SAFFRON_GL_" upper2 "_CTX " struct "\n\ | |
90 | +#define SAFFRON_GL_" upper2 "_CTX " struct "*\n\ | |
91 | 91 | " sig ";\n\ |
92 | 92 | #define SAFFRON_GL_LOAD_" upper2 "_CTX SaffronGL_Load" $2 "Ctx"); |
93 | 93 | if(core != ""){ |
@@ -128,11 +128,13 @@ $1 == "load" { | ||
128 | 128 | macro = "SAFFRON_GL_LOAD_FUNC_" upper2 "_" sfx; |
129 | 129 | print("\ |
130 | 130 | #define " macro "(X) SAFFRON_GL_FUNC_LOAD(X, \"" sfx "\")\n\ |
131 | - if(SaffronGL_SupportsExtension(\"" ext "\")) do{ \n\ | |
132 | - SAFFRON_GL_" upper2 "_FUNCS(" macro ")\n\ | |
133 | - *ctx_ptr = ctx;\n\ | |
134 | - return 0;\n\ | |
135 | - }while(0);"); | |
131 | + if(SaffronGL_SupportsExtension(gl_ctx, (MR_String)\"" ext "\")){\n\ | |
132 | + do{\n\ | |
133 | + SAFFRON_GL_" upper2 "_FUNCS(" macro ")\n\ | |
134 | + *ctx_ptr = ctx;\n\ | |
135 | + return 0;\n\ | |
136 | + }while(0);\n\ | |
137 | + }"); | |
136 | 138 | } |
137 | 139 | } |
138 | 140 | print(" return 1;\n}"); |