aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md3
-rw-r--r--c_src/esdl2.h4
-rw-r--r--c_src/sdl_gl.c69
-rw-r--r--src/esdl2.erl12
-rw-r--r--src/sdl_gl.erl30
5 files changed, 115 insertions, 3 deletions
diff --git a/README.md b/README.md
index 324a7e9..2717c4f 100644
--- a/README.md
+++ b/README.md
@@ -87,15 +87,12 @@ The following tasks remain to be done:
* SDL_GL_ResetAttributes()
* SDL_GL_SetAttribute()
* SDL_GL_GetAttribute()
- * SDL_GL_CreateContext()
* SDL_GL_MakeCurrent()
* SDL_GL_GetCurrentWindow()
* SDL_GL_GetCurrentContext()
* SDL_GL_GetDrawableSize()
* SDL_GL_SetSwapInterval()
* SDL_GL_GetSwapInterval()
- * SDL_GL_SwapWindow()
- * SDL_GL_DeleteContext()
* We do not support any of the video driver related functions:
* SDL_GetNumVideoDrivers()
* SDL_GetVideoDriver()
diff --git a/c_src/esdl2.h b/c_src/esdl2.h
index 6e69cff..ac479b4 100644
--- a/c_src/esdl2.h
+++ b/c_src/esdl2.h
@@ -123,6 +123,7 @@
#define NIF_RES_TYPE(r) SDL_ ## r
#define NIF_RESOURCES(R) \
+ R(GLContext) \
R(Renderer) \
R(Surface) \
R(Texture) \
@@ -162,6 +163,9 @@
/* sdl_filesystem */ \
F(get_base_path, 0) \
F(get_pref_path, 2) \
+ /* sdl_gl */ \
+ F(gl_create_context, 1) \
+ F(gl_swap_window, 1) \
/* sdl_power */ \
F(get_power_info, 0) \
/* sdl_renderer */ \
diff --git a/c_src/sdl_gl.c b/c_src/sdl_gl.c
new file mode 100644
index 0000000..febd49f
--- /dev/null
+++ b/c_src/sdl_gl.c
@@ -0,0 +1,69 @@
+// Copyright (c) 2015, Loïc Hoguin <[email protected]>
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+#include "esdl2.h"
+
+void dtor_GLContext(ErlNifEnv* env, void* obj)
+{
+ SDL_GL_DeleteContext(NIF_RES_GET(GLContext, obj));
+ enif_release_resource(NIF_RES_DEP(GLContext, obj));
+}
+
+// gl_create_context
+
+NIF_CALL_HANDLER(thread_gl_create_context)
+{
+ SDL_GLContext context;
+ ERL_NIF_TERM term;
+
+ context = SDL_GL_CreateContext(args[0]);
+ if (!context)
+ return sdl_error_tuple(env);
+
+ enif_keep_resource(args[0]);
+
+ NIF_RES_TO_TERM_WITH_DEP(GLContext, context, term, args[0]);
+
+ return enif_make_tuple2(env,
+ atom_ok,
+ term
+ );
+}
+
+NIF_FUNCTION(gl_create_context)
+{
+ void* window_res;
+
+ BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res));
+
+ return nif_thread_call(env, thread_gl_create_context, 1,
+ NIF_RES_GET(Window, window_res));
+}
+
+// gl_swap_window
+
+NIF_CAST_HANDLER(thread_gl_swap_window)
+{
+ SDL_GL_SwapWindow(args[0]);
+}
+
+NIF_FUNCTION(gl_swap_window)
+{
+ void* window_res;
+
+ BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res));
+
+ return nif_thread_cast(env, thread_gl_swap_window, 1,
+ NIF_RES_GET(Window, window_res));
+}
diff --git a/src/esdl2.erl b/src/esdl2.erl
index ec07b2c..af8f322 100644
--- a/src/esdl2.erl
+++ b/src/esdl2.erl
@@ -49,6 +49,10 @@
-export([get_base_path/0]).
-export([get_pref_path/2]).
+%% sdl_gl
+-export([gl_create_context/1]).
+-export([gl_swap_window/1]).
+
%% sdl_power
-export([get_power_info/0]).
@@ -225,6 +229,14 @@ get_base_path() ->
get_pref_path(_, _) ->
erlang:nif_error({not_loaded, ?MODULE}).
+%% sdl_gl
+
+gl_create_context(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+gl_swap_window(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
%% sdl_power
get_power_info() ->
diff --git a/src/sdl_gl.erl b/src/sdl_gl.erl
new file mode 100644
index 0000000..457994a
--- /dev/null
+++ b/src/sdl_gl.erl
@@ -0,0 +1,30 @@
+%% Copyright (c) 2015, Loïc Hoguin <[email protected]>
+%%
+%% Permission to use, copy, modify, and/or distribute this software for any
+%% purpose with or without fee is hereby granted, provided that the above
+%% copyright notice and this permission notice appear in all copies.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-module(sdl_gl).
+
+-export([create_context/1]).
+-export([swap_window/1]).
+
+-opaque context() :: <<>>.
+-export_type([context/0]).
+
+-spec create_context(sdl_window:window()) -> {ok, context()} | sdl:error().
+create_context(Window) ->
+ esdl2:gl_create_context(Window),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec swap_window(sdl_window:window()) -> ok.
+swap_window(Window) ->
+ esdl2:gl_swap_window(Window).