From 2eb09a5b1616dd03135444d42b712b19866a1306 Mon Sep 17 00:00:00 2001 From: David Hilvert Date: Mon, 20 Oct 2008 09:37:07 +0000 Subject: [PATCH] accel: add context() retrieval method, include in d2::image_accel. --- accel.cc | 2 ++ accel.h | 88 +++++++++++++++++++++++++++++++++++--------------------- d2/image_accel.h | 4 +-- 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/accel.cc b/accel.cc index 69026e2..47082e8 100644 --- a/accel.cc +++ b/accel.cc @@ -26,3 +26,5 @@ int accel::use_gpu = 2; /* auto */ int accel::_mask_gpu = 0; +void *accel::_accel_context = NULL; +void *accel::_accel_backend = NULL; diff --git a/accel.h b/accel.h index 5c5b244..c15200a 100644 --- a/accel.h +++ b/accel.h @@ -25,7 +25,9 @@ #ifndef __accel_h__ #define __accel_h__ -#include "gpu.h" +extern "C" { +#include +} #include #include @@ -35,6 +37,8 @@ class accel { static int use_gpu; static int _mask_gpu; + static void *_accel_context; + static void *_accel_backend; public: @@ -55,15 +59,33 @@ public: } static void set_auto() { -#ifdef USE_GLEW const char *accel_default = getenv("ALE_GPU_ACCEL_DEFAULT"); - if (accel_default && !strcmp(accel_default, "1") && gpu::is_ok()) - use_gpu = 1; - else + if (!accel_default || strcmp(accel_default, "1")) { use_gpu = 0; -#else - use_gpu = 0; -#endif + return; + } + + _accel_backend = ale_new_backend("glsl"); + + if (!_accel_backend) { + ale_delete_backend(_accel_backend); + _accel_backend = NULL; + use_gpu = 0; + return; + } + + _accel_context = ale_new_context(_accel_backend); + + if (!_accel_context) { + ale_delete_context(_accel_context); + ale_delete_backend(_accel_backend); + _accel_context = NULL; + _accel_backend = NULL; + use_gpu = 0; + return; + } + + use_gpu = 1; } static int is_gpu() { @@ -76,36 +98,38 @@ public: if (_mask_gpu) return 0; - if (!gpu::is_ok()) { - fprintf(stderr, "GPU acceleration error.\n"); - exit(1); + return 1; + } + + static void *context() { + if (use_gpu == 2) + set_auto(); + + if (_accel_context) + return _accel_context; + + if (use_gpu == 0) { + _accel_backend = ale_new_backend("guile"); + } else { + _accel_backend = ale_new_backend("glsl"); } -#ifdef USE_GLEW - const char *extensions[] = { - "GL_ARB_fragment_shader", - "GL_ARB_texture_float", - "GL_ARB_texture_rectangle", - "GL_EXT_framebuffer_object", - NULL - }; - - int unsupported = 0; - for (const char **c = extensions; *c; c++) { - if (!glewIsSupported(*c)) { - fprintf(stderr, "GL feature %s not supported.\n", *c); - unsupported = 1; - } + if (!_accel_backend) { + fprintf(stderr, "Could not create backend.\n"); + exit(1); } - if (unsupported) + + _accel_context = ale_new_context(_accel_backend); + + if (!_accel_context) { + fprintf(stderr, "Could not create context.\n"); exit(1); -#else - fprintf(stderr, "GLEW linkage is required for acceleration.\n"); - exit(1); -#endif + } + + return _accel_context; - return 1; } + }; #endif diff --git a/d2/image_accel.h b/d2/image_accel.h index 0029358..68767c4 100644 --- a/d2/image_accel.h +++ b/d2/image_accel.h @@ -69,7 +69,7 @@ public: assert(0); } - im = ale_new_domain_2d(NULL, libale_bayer, ALE_TYPE_FLOAT_32, dimy, dimx); + im = ale_new_domain_2d(accel::context(), libale_bayer, ALE_TYPE_FLOAT_32, dimy, dimx); assert (im); @@ -105,7 +105,7 @@ public: assert(0); } - im = ale_new_domain_2d(NULL, libale_bayer, ALE_TYPE_FLOAT_32, _dimy, _dimx); + im = ale_new_domain_2d(accel::context(), libale_bayer, ALE_TYPE_FLOAT_32, _dimy, _dimx); assert (im); -- 2.11.4.GIT