From c107b06a76ecd3b5bc06940362f9f66ea7b4167d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 12 Nov 2013 12:00:57 +0100 Subject: [PATCH] Add RETRO_ENVIRONMENT_SET_CAMERA_RETRIEVE --- camera/video4linux2.c | 16 ++++++++++++++++ driver.h | 1 + dynamic.c | 14 ++++++++++++++ libretro.h | 14 ++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/camera/video4linux2.c b/camera/video4linux2.c index 82673fd254..3b582b7c85 100644 --- a/camera/video4linux2.c +++ b/camera/video4linux2.c @@ -749,6 +749,21 @@ static bool v4l_ready(void *data, unsigned *width, unsigned *height) return v4l->ready; } +static uint64_t v4l_set_capabilities(void *data, uint64_t state) +{ + (void)data; + uint64_t ret = 0; + + //FIXME - set when driver supports this + //if (state & (1 << RETRO_CAMERA_RECV_GL_TEXTURE)) + //ret |= (1 << RETRO_CAMERA_RECV_GL_TEXTURE); + + if (state & (1 << RETRO_CAMERA_RECV_RAW_FRAMEBUFFER)) + ret |= (1 << RETRO_CAMERA_RECV_RAW_FRAMEBUFFER); + + return ret; +} + const camera_driver_t camera_v4l2 = { v4l_init, v4l_free, @@ -757,5 +772,6 @@ const camera_driver_t camera_v4l2 = { v4l_ready, v4l_texture_image_2d, v4l_texture_subimage_2d, + v4l_set_capabilities, "video4linux2", }; diff --git a/driver.h b/driver.h index 8589811a77..6c21b6a5f7 100644 --- a/driver.h +++ b/driver.h @@ -342,6 +342,7 @@ typedef struct camera_driver bool (*ready)(void *data, unsigned *width, unsigned *height); void (*texture_image_2d)(void *data); void (*texture_subimage_2d)(void *data); + uint64_t (*set_capabilities)(void *data, uint64_t mask); const char *ident; } camera_driver_t; diff --git a/dynamic.c b/dynamic.c index 8e60057f27..ad3ba6b798 100644 --- a/dynamic.c +++ b/dynamic.c @@ -783,6 +783,20 @@ bool rarch_environment_cb(unsigned cmd, void *data) break; } + case RETRO_ENVIRONMENT_SET_CAMERA_RETRIEVE: + { +#ifdef HAVE_CAMERA + RARCH_LOG("Environ SET_CAMERA_RETRIEVE.\n"); + uint64_t *mask_ptr = (uint64_t*)data; + uint64_t mask = *mask_ptr; + if (driver.camera) + *mask_ptr = driver.camera->set_capabilities(driver.camera_data, mask); + else + *mask_ptr = 0; + break; +#endif + } + // Private extensions for internal use, not part of libretro API. case RETRO_ENVIRONMENT_SET_LIBRETRO_PATH: RARCH_LOG("Environ (Private) SET_LIBRETRO_PATH.\n"); diff --git a/libretro.h b/libretro.h index e4a03028f2..89d52eb433 100755 --- a/libretro.h +++ b/libretro.h @@ -541,6 +541,12 @@ enum retro_mod // The purpose of this interface is to allow // setting state related to sensors such as polling rate, enabling/disable it entirely, etc. // Reading sensor state is done via the normal input_state_callback API. +#define RETRO_ENVIRONMENT_SET_CAMERA_RETRIEVE (26 | RETRO_ENVIRONMENT_EXPERIMENTAL) + // uint64_t * -- + // Sends a bitmask value to the camera driver, telling it which receive modes are expected to be handled by the + // camera interface._ + // Example bitmask: caps = (1 << RETRO_CAMERA_RECV_GL_TEXTURE) | (1 << RETRO_CAMERA_RECV_RAW_FRAMEBUFFER). + // Returns a bitmask value that tells which camera retrieval modes have been set by the driver. // FIXME: Document the sensor API and work out behavior. // It will be marked as experimental until then. @@ -552,6 +558,14 @@ enum retro_sensor_action RETRO_SENSOR_DUMMY = INT_MAX }; +enum retro_camera_mode +{ + RETRO_CAMERA_RECV_GL_TEXTURE = 0, + RETRO_CAMERA_RECV_RAW_FRAMEBUFFER, + + RETRO_CAMERA_DUMMY = INT_MAX +}; + typedef bool (*retro_set_sensor_state_t)(unsigned port, enum retro_sensor_action action, unsigned rate); struct retro_sensor_interface {