diff options
author | Loïc Hoguin <[email protected]> | 2014-04-02 23:30:25 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2014-04-02 23:30:25 +0200 |
commit | 00114c813b6c6829dcf3b6eedc6b45803b31c808 (patch) | |
tree | c602f21f0c0eff488bf2eb8b4eb3d0aeee8d820e | |
parent | 3fca1d3a170ac311fc379b3128be411edc21b0ee (diff) | |
download | esdl2-00114c813b6c6829dcf3b6eedc6b45803b31c808.tar.gz esdl2-00114c813b6c6829dcf3b6eedc6b45803b31c808.tar.bz2 esdl2-00114c813b6c6829dcf3b6eedc6b45803b31c808.zip |
Add CPU feature detection functions
Now requiring SDL 2.0.3+.
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | c_src/Makefile | 6 | ||||
-rw-r--r-- | c_src/esdl2.h | 14 | ||||
-rw-r--r-- | c_src/sdl_cpu_info.c | 136 | ||||
-rw-r--r-- | src/esdl2.erl | 56 | ||||
-rw-r--r-- | src/sdl_cpu_info.erl | 68 |
6 files changed, 284 insertions, 4 deletions
@@ -8,6 +8,8 @@ Status Week-end project. Work in progress. -You need at least Erlang 17.0 or a release candidate of it -for this project to run. It uses maps for a portion of its -interface. +The following limitations apply: + + * Erlang 17.0+ is required + * SDL 2.0.3+ is required + * No support for UTF-8 strings, only Latin-1 diff --git a/c_src/Makefile b/c_src/Makefile index 85cb8ce..0887c86 100644 --- a/c_src/Makefile +++ b/c_src/Makefile @@ -14,10 +14,14 @@ PRIV_DIR ?= ../priv +# SDL 2.0.3 has this option enabled that causes problems with NIF functions. +SDL2_LIBS_FILTER_OUT = -Wl,--no-undefined +SDL2_LIBS = $(filter-out $(SDL2_LIBS_FILTER_OUT),$(shell sdl2-config --static-libs)) + all: env.mk mkdir -p $(PRIV_DIR) gcc *.c -fPIC -shared -o $(PRIV_DIR)/esdl2.so -I $(ERTS_INCLUDE_DIR) \ - `sdl2-config --cflags` `sdl2-config --static-libs` -lSDL2_image + `sdl2-config --cflags` $(SDL2_LIBS) -lSDL2_image env.mk: erl -noshell -noinput -eval "file:write_file(\"env.mk\", \ diff --git a/c_src/esdl2.h b/c_src/esdl2.h index 7af7097..7a5346d 100644 --- a/c_src/esdl2.h +++ b/c_src/esdl2.h @@ -113,6 +113,20 @@ F(get_clipboard_text, 0) \ F(has_clipboard_text, 0) \ F(set_clipboard_text, 1) \ + /* sdl_cpu_info */ \ + F(get_cpu_cache_line_size, 0) \ + F(get_cpu_count, 0) \ + F(get_system_ram, 0) \ + F(has_3dnow, 0) \ + F(has_avx, 0) \ + F(has_altivec, 0) \ + F(has_mmx, 0) \ + F(has_rdtsc, 0) \ + F(has_sse, 0) \ + F(has_sse2, 0) \ + F(has_sse3, 0) \ + F(has_sse41, 0) \ + F(has_sse42, 0) \ /* sdl_events */ \ F(poll_event, 0) \ /* sdl_filesystem */ \ diff --git a/c_src/sdl_cpu_info.c b/c_src/sdl_cpu_info.c new file mode 100644 index 0000000..1178504 --- /dev/null +++ b/c_src/sdl_cpu_info.c @@ -0,0 +1,136 @@ +// Copyright (c) 2014, 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" + +// get_cpu_cache_line_size + +NIF_FUNCTION(get_cpu_cache_line_size) +{ + return enif_make_int(env, SDL_GetCPUCacheLineSize()); +} + +// get_cpu_count + +NIF_FUNCTION(get_cpu_count) +{ + return enif_make_int(env, SDL_GetCPUCount()); +} + +// get_system_ram + +NIF_FUNCTION(get_system_ram) +{ + return enif_make_int(env, SDL_GetSystemRAM()); +} + +// has_3dnow + +NIF_FUNCTION(has_3dnow) +{ + if (SDL_Has3DNow()) + return atom_true; + + return atom_false; +} + +// has_avx + +NIF_FUNCTION(has_avx) +{ + if (SDL_HasAVX()) + return atom_true; + + return atom_false; +} + +// has_altivec + +NIF_FUNCTION(has_altivec) +{ + if (SDL_HasAltiVec()) + return atom_true; + + return atom_false; +} + +// has_mmx + +NIF_FUNCTION(has_mmx) +{ + if (SDL_HasMMX()) + return atom_true; + + return atom_false; +} + +// has_rdtsc + +NIF_FUNCTION(has_rdtsc) +{ + if (SDL_HasRDTSC()) + return atom_true; + + return atom_false; +} + +// has_sse + +NIF_FUNCTION(has_sse) +{ + if (SDL_HasSSE()) + return atom_true; + + return atom_false; +} + +// has_sse2 + +NIF_FUNCTION(has_sse2) +{ + if (SDL_HasSSE2()) + return atom_true; + + return atom_false; +} + +// has_sse3 + +NIF_FUNCTION(has_sse3) +{ + if (SDL_HasSSE3()) + return atom_true; + + return atom_false; +} + +// has_sse41 + +NIF_FUNCTION(has_sse41) +{ + if (SDL_HasSSE41()) + return atom_true; + + return atom_false; +} + +// has_sse42 + +NIF_FUNCTION(has_sse42) +{ + if (SDL_HasSSE42()) + return atom_true; + + return atom_false; +} diff --git a/src/esdl2.erl b/src/esdl2.erl index 39ff1e3..23b157a 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -27,6 +27,21 @@ -export([has_clipboard_text/0]). -export([set_clipboard_text/1]). +%% sdl_cpu_info +-export([get_cpu_cache_line_size/0]). +-export([get_cpu_count/0]). +-export([get_system_ram/0]). +-export([has_3dnow/0]). +-export([has_avx/0]). +-export([has_altivec/0]). +-export([has_mmx/0]). +-export([has_rdtsc/0]). +-export([has_sse/0]). +-export([has_sse2/0]). +-export([has_sse3/0]). +-export([has_sse41/0]). +-export([has_sse42/0]). + %% sdl_events -export([poll_event/0]). @@ -101,6 +116,47 @@ has_clipboard_text() -> set_clipboard_text(_) -> erlang:nif_error({not_loaded, ?MODULE}). +%% sdl_cpu_info + +get_cpu_cache_line_size() -> + erlang:nif_error({not_loaded, ?MODULE}). + +get_cpu_count() -> + erlang:nif_error({not_loaded, ?MODULE}). + +get_system_ram() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_3dnow() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_avx() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_altivec() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_mmx() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_rdtsc() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_sse() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_sse2() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_sse3() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_sse41() -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_sse42() -> + erlang:nif_error({not_loaded, ?MODULE}). + %% sdl_events poll_event() -> diff --git a/src/sdl_cpu_info.erl b/src/sdl_cpu_info.erl new file mode 100644 index 0000000..0eccb1c --- /dev/null +++ b/src/sdl_cpu_info.erl @@ -0,0 +1,68 @@ +%% Copyright (c) 2014, 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_cpu_info). + +-export([get_cpu_cache_line_size/0]). +-export([get_cpu_count/0]). +-export([get_system_ram/0]). +-export([has_3dnow/0]). +-export([has_avx/0]). +-export([has_altivec/0]). +-export([has_mmx/0]). +-export([has_rdtsc/0]). +-export([has_sse/0]). +-export([has_sse2/0]). +-export([has_sse3/0]). +-export([has_sse41/0]). +-export([has_sse42/0]). + +get_cpu_cache_line_size() -> + esdl2:get_cpu_cache_line_size(). + +get_cpu_count() -> + esdl2:get_cpu_count(). + +get_system_ram() -> + esdl2:get_system_ram(). + +has_3dnow() -> + esdl2:has_3dnow(). + +has_avx() -> + esdl2:has_avx(). + +has_altivec() -> + esdl2:has_altivec(). + +has_mmx() -> + esdl2:has_mmx(). + +has_rdtsc() -> + esdl2:has_rdtsc(). + +has_sse() -> + esdl2:has_sse(). + +has_sse2() -> + esdl2:has_sse2(). + +has_sse3() -> + esdl2:has_sse3(). + +has_sse41() -> + esdl2:has_sse41(). + +has_sse42() -> + esdl2:has_sse42(). |