diff --git a/apple/common/RAGameView.m b/apple/common/RAGameView.m index bf65cc09b5..7f4725edb3 100644 --- a/apple/common/RAGameView.m +++ b/apple/common/RAGameView.m @@ -81,6 +81,7 @@ CFMutableDictionaryRef attrs; CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; GLuint renderFrameBuffer; +static bool newFrame = false; #elif defined(OSX) @@ -260,6 +261,7 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer glBindFramebuffer(GL_FRAMEBUFFER, renderFrameBuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + newFrame = true; } - (void) onCameraInit @@ -584,4 +586,87 @@ void apple_bind_game_view_fbo(void) [g_view bindDrawable]; }); } + +// References: +// http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ +// https://developer.apple.com/library/iOS/samplecode/GLCameraRipple/ + +typedef struct ios_camera +{ + void *empty; +} ioscamera_t; + +static void *ios_camera_init(const char *device, uint64_t caps, unsigned width, unsigned height) +{ + if ((caps & (1ULL << RETRO_CAMERA_BUFFER_OPENGL_TEXTURE)) == 0) + { + RARCH_ERR("ioscamera returns OpenGL texture.\n"); + return NULL; + } + + ioscamera_t *ioscamera = (ioscamera_t*)calloc(1, sizeof(ioscamera_t)); + if (!ioscamera) + return NULL; + + [[RAGameView get] onCameraInit]; + + return ioscamera; +} + +static void ios_camera_free(void *data) +{ + ioscamera_t *ioscamera = (ioscamera_t*)data; + + [[RAGameView get] onCameraFree]; + + if (ioscamera) + free(ioscamera); + ioscamera = NULL; +} + +static bool ios_camera_start(void *data) +{ + (void)data; + + [[RAGameView get] onCameraStart]; + + return true; +} + +static void ios_camera_stop(void *data) +{ + [[RAGameView get] onCameraStop]; +} + +static bool ios_camera_poll(void *data, retro_camera_frame_raw_framebuffer_t frame_raw_cb, + retro_camera_frame_opengl_texture_t frame_gl_cb) +{ + + (void)data; + (void)frame_raw_cb; + + if (frame_gl_cb && newFrame) + { + // FIXME: Identity for now. Use proper texture matrix as returned by iOS Camera (if at all?). + static const float affine[] = { + 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f + }; + + frame_gl_cb(CVOpenGLESTextureGetName(renderTexture), GL_TEXTURE_2D, affine); + newFrame = false; + } + + return true; +} + +const camera_driver_t camera_ios = { + ios_camera_init, + ios_camera_free, + ios_camera_start, + ios_camera_stop, + ios_camera_poll, + "ios", +}; #endif diff --git a/camera/ios.c b/camera/ios.c deleted file mode 100644 index 3a599266bf..0000000000 --- a/camera/ios.c +++ /dev/null @@ -1,113 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2013 - Hans-Kristian Arntzen - * Copyright (C) 2011-2013 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -// References: -// http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ -// https://developer.apple.com/library/iOS/samplecode/GLCameraRipple/ - -#include -#include -#include "../driver.h" - -typedef struct ios_camera -{ - void *empty; -} ioscamera_t; - -static void *ios_camera_init(const char *device, uint64_t caps, unsigned width, unsigned height) -{ - if ((caps & (1ULL << RETRO_CAMERA_BUFFER_OPENGL_TEXTURE)) == 0) - { - RARCH_ERR("ioscamera returns OpenGL texture.\n"); - return NULL; - } - - ioscamera_t *ioscamera = (ioscamera_t*)calloc(1, sizeof(ioscamera_t)); - if (!ioscamera) - return NULL; - - // TODO - call onCameraInit from RAGameView - - return ioscamera; -dealloc: - free(ioscamera); - return NULL; -} - -static void ios_camera_free(void *data) -{ - ioscamera_t *ioscamera = (ioscamera_t*)data; - - //TODO - call onCameraFree from RAGameView - - if (ioscamera) - free(ioscamera); - ioscamera = NULL; -} - -static bool ios_camera_start(void *data) -{ - (void)data; - - //TODO - call onCameraStart from RAGAmeView - - return true; -} - -static void ios_camera_stop(void *data) -{ - ioscamera_t *ioscamera = (ioscamera_t*)data; - (void)ioscamera; - - //TODO - call onCameraStop from RAGameView -} - -static bool ios_camera_poll(void *data, retro_camera_frame_raw_framebuffer_t frame_raw_cb, - retro_camera_frame_opengl_texture_t frame_gl_cb) -{ - bool newFrame = false; - (void)data; - (void)frame_raw_cb; - - // TODO - call onCameraPoll from RAGameView - - if (frame_gl_cb && newFrame) - { - // FIXME: Identity for now. Use proper texture matrix as returned by iOS Camera (if at all?). - static const float affine[] = { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f - }; - (void)affine; -#if 0 - frame_gl_cb(CVOpenGLESTextureGetName(ioscamera->renderTexture), - GL_TEXTURE_2D, - affine); -#endif - } - - return true; -} - -const camera_driver_t camera_ios = { - ios_camera_init, - ios_camera_free, - ios_camera_start, - ios_camera_stop, - ios_camera_poll, - "ios", -}; diff --git a/griffin/griffin.c b/griffin/griffin.c index 92e75f0870..459655624f 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -358,8 +358,6 @@ CAMERA #ifdef HAVE_CAMERA #if defined(ANDROID) #include "../camera/android.c" -#elif defined(IOS) -#include "../camera/ios.c" #elif defined(EMSCRIPTEN) #include "../camera/rwebcam.c" #endif