[vlc-commits] ios2: remove zero copy GL code

Thomas Guillem git at videolan.org
Thu Feb 16 14:34:09 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Feb 16 14:25:56 2017 +0100| [141674f20c6ec9a3f114025b3be4f41b7727efbe] | committer: Thomas Guillem

ios2: remove zero copy GL code

It's now handled by the cvpx converter.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=141674f20c6ec9a3f114025b3be4f41b7727efbe
---

 modules/video_output/ios2.m            | 705 +++------------------------------
 modules/video_output/opengl/internal.h |   2 +-
 2 files changed, 60 insertions(+), 647 deletions(-)

diff --git a/modules/video_output/ios2.m b/modules/video_output/ios2.m
index 130ae7b..5abaa1e 100644
--- a/modules/video_output/ios2.m
+++ b/modules/video_output/ios2.m
@@ -52,78 +52,10 @@
  * Forward declarations
  */
 
-enum
-{
-    UNIFORM_Y,
-    UNIFORM_UV,
-    UNIFORM_COLOR_CONVERSION_MATRIX,
-    UNIFORM_TRANSFORM_MATRIX,
-    NUM_UNIFORMS
-};
-GLint uniforms[NUM_UNIFORMS];
-
-// Attribute index.
-enum
-{
-    ATTRIB_VERTEX,
-    ATTRIB_TEXCOORD,
-    NUM_ATTRIBUTES
-};
-
 struct picture_sys_t {
     CVPixelBufferRef pixelBuffer;
 };
 
-// BT.601, which is the standard for SDTV.
-static const GLfloat kColorConversion601[] = {
-    1.164383561643836,  1.164383561643836, 1.164383561643836,
-                  0.0, -0.391762290094914, 2.017232142857142,
-    1.596026785714286, -0.812967647237771,               0.0,
-};
-
-// BT.709, which is the standard for HDTV.
-static const GLfloat kColorConversion709[] = {
-    1.164383561643836,  1.164383561643836, 1.164383561643836,
-                  0.0,  -0.21324861427373, 2.112401785714286,
-    1.792741071428571, -0.532909328559444,               0.0,
-};
-
-static NSString *const fragmentShaderString = @" \
- varying highp vec2 texCoordVarying; \
- precision mediump float; \
-\
- uniform sampler2D SamplerY; \
- uniform sampler2D SamplerUV; \
- uniform mat3 colorConversionMatrix; \
-\
- void main() \
- { \
-    mediump vec3 yuv; \
-    lowp vec3 rgb; \
-\
-    yuv.x = (texture2D(SamplerY, texCoordVarying).r - (16.0/255.0)); \
-    yuv.yz = (texture2D(SamplerUV, texCoordVarying).rg - vec2(0.5, 0.5)); \
-\
-    rgb = colorConversionMatrix * yuv; \
-\
-    gl_FragColor = vec4(rgb,1); \
- } \
-";
-
-static NSString *const vertexShaderString = @" \
- attribute vec4 position; \
- attribute vec2 texCoord; \
- uniform mat4 transformMatrix; \
-\
- varying vec2 texCoordVarying; \
-\
- void main() \
- { \
-    gl_Position = transformMatrix * position; \
-    texCoordVarying = texCoord; \
- } \
-";
-
 static int Open(vlc_object_t *);
 static void Close(vlc_object_t *);
 
@@ -134,14 +66,9 @@ static int Control(vout_display_t*, int, va_list);
 
 static void *OurGetProcAddress(vlc_gl_t *, const char *);
 
-static int OpenglESClean(vlc_gl_t *);
+static int OpenglESLock(vlc_gl_t *);
 static void OpenglESSwap(vlc_gl_t *);
-static void OpenglESNoop(vlc_gl_t *);
-
-static picture_pool_t *ZeroCopyPicturePool(vout_display_t *, unsigned);
-static void DestroyZeroCopyPoolPicture(picture_t *);
-static void ZeroCopyClean(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
-static void ZeroCopyDisplay(vout_display_t *, picture_t *, subpicture_t *);
+static void OpenglESUnlock(vlc_gl_t *);
 
 /**
  * Module declaration
@@ -160,18 +87,12 @@ vlc_module_end ()
 @interface VLCOpenGLES2VideoView : UIView {
     vout_display_t *_voutDisplay;
     EAGLContext *_eaglContext;
+    EAGLContext *_previousEaglContext;
     GLuint _renderBuffer;
     GLuint _frameBuffer;
 
     BOOL _bufferNeedReset;
     BOOL _appActive;
-    bool _zeroCopy;
-
-    CVOpenGLESTextureCacheRef _videoTextureCache;
-    CVOpenGLESTextureRef _lumaTexture;
-    CVOpenGLESTextureRef _chromaTexture;
-
-    const GLfloat *_preferredConversion;
 }
 @property (readonly) GLuint renderBuffer;
 @property (readonly) GLuint frameBuffer;
@@ -180,16 +101,15 @@ vlc_module_end ()
 @property (readonly) BOOL isAppActive;
 @property GLuint shaderProgram;
 
-- (id)initWithFrame:(CGRect)frame zeroCopy:(bool)zero_copy voutDisplay:(vout_display_t *)vd;
+- (id)initWithFrame:(CGRect)frame voutDisplay:(vout_display_t *)vd;
 
 - (void)createBuffers;
 - (void)destroyBuffers;
 - (void)resetBuffers;
+- (void)lock;
+- (void)unlock;
 
 - (void)reshape;
-
-- (void)setupZeroCopyGL;
-- (void)displayPixelBuffer:(CVPixelBufferRef)pixelBuffer;
 @end
 
 struct vout_display_sys_t
@@ -203,11 +123,16 @@ struct vout_display_sys_t
 
     picture_pool_t *picturePool;
     bool has_first_frame;
-    bool zero_copy;
 
     vout_display_place_t place;
 };
 
+struct gl_sys
+{
+    CVEAGLContext locked_ctx;
+    VLCOpenGLES2VideoView *glESView;
+};
+
 static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
 {
     VLC_UNUSED(gl);
@@ -232,13 +157,8 @@ static int Open(vlc_object_t *this)
     sys->gl = NULL;
 
     @autoreleasepool {
-        if (vd->fmt.i_chroma == VLC_CODEC_CVPX_NV12) {
-            msg_Dbg(vd, "will use zero-copy rendering");
-            sys->zero_copy = true;
-        }
-
         /* setup the actual OpenGL ES view */
-        sys->glESView = [[VLCOpenGLES2VideoView alloc] initWithFrame:CGRectMake(0.,0.,320.,240.) zeroCopy:sys->zero_copy voutDisplay:vd];
+        sys->glESView = [[VLCOpenGLES2VideoView alloc] initWithFrame:CGRectMake(0.,0.,320.,240.) voutDisplay:vd];
         sys->glESView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 
         if (!sys->glESView) {
@@ -254,48 +174,41 @@ static int Open(vlc_object_t *this)
 
         const vlc_fourcc_t *subpicture_chromas;
         video_format_t fmt = vd->fmt;
-        if (!sys->zero_copy) {
-            msg_Dbg(vd, "will use regular OpenGL rendering");
-
-            sys->gl = vlc_object_create(this, sizeof(*sys->gl));
-            if (!sys->gl)
-                goto bailout;
-            /* Initialize common OpenGL video display */
-            sys->gl->makeCurrent = OpenglESClean;
-            sys->gl->releaseCurrent = OpenglESNoop;
-            sys->gl->swap = OpenglESSwap;
-            sys->gl->getProcAddress = OurGetProcAddress;
-            sys->gl->sys = sys;
 
-            vlc_gl_MakeCurrent(sys->gl);
-            sys->vgl = vout_display_opengl_New(&vd->fmt, &subpicture_chromas,
-                                               sys->gl, &vd->cfg->viewpoint);
-            vlc_gl_ReleaseCurrent(sys->gl);
-            if (!sys->vgl)
-                goto bailout;
-        } else {
-            subpicture_chromas = gl_subpicture_chromas;
-        }
+        sys->gl = vlc_object_create(this, sizeof(*sys->gl));
+        if (!sys->gl)
+            goto bailout;
+
+        struct gl_sys *glsys = sys->gl->sys = malloc(sizeof(struct gl_sys));
+        if (unlikely(!sys->gl->sys))
+            goto bailout;
+        glsys->locked_ctx = NULL;
+        glsys->glESView = sys->glESView;
+        /* Initialize common OpenGL video display */
+        sys->gl->makeCurrent = OpenglESLock;
+        sys->gl->releaseCurrent = OpenglESUnlock;
+        sys->gl->swap = OpenglESSwap;
+        sys->gl->getProcAddress = OurGetProcAddress;
+
+        vlc_gl_MakeCurrent(sys->gl);
+        sys->vgl = vout_display_opengl_New(&vd->fmt, &subpicture_chromas,
+                                           sys->gl, &vd->cfg->viewpoint);
+        vlc_gl_ReleaseCurrent(sys->gl);
+        if (!sys->vgl)
+            goto bailout;
 
         /* */
         vout_display_info_t info = vd->info;
         info.has_pictures_invalid = false;
         info.subpicture_chromas = subpicture_chromas;
-        info.is_slow = !sys->zero_copy;
         info.has_hide_mouse = false;
 
         /* Setup vout_display_t once everything is fine */
         vd->info = info;
 
-        if (sys->zero_copy) {
-            vd->pool = ZeroCopyPicturePool;
-            vd->prepare = ZeroCopyClean;
-            vd->display = ZeroCopyDisplay;
-        } else {
-            vd->pool = PicturePool;
-            vd->prepare = PictureRender;
-            vd->display = PictureDisplay;
-        }
+        vd->pool = PicturePool;
+        vd->prepare = PictureRender;
+        vd->display = PictureDisplay;
         vd->control = Control;
         vd->manage = NULL;
 
@@ -350,7 +263,7 @@ void Close (vlc_object_t *this)
             @synchronized (sys->glESView) {
                 msg_Dbg(this, "deleting display");
 
-                if (likely([sys->glESView isAppActive]))
+                if (likely([sys->glESView isAppActive]) && sys->vgl)
                 {
                     vlc_gl_MakeCurrent(sys->gl);
                     vout_display_opengl_Delete(sys->vgl);
@@ -362,13 +275,6 @@ void Close (vlc_object_t *this)
 
         [sys->glESView release];
 
-        /* when using the traditional pipeline, the cross-platform code will free the the pool */
-        if (sys->zero_copy) {
-            if (sys->picturePool)
-                picture_pool_Release(sys->picturePool);
-            sys->picturePool = NULL;
-        }
-        
         free(sys);
     }
 }
@@ -499,23 +405,27 @@ static picture_pool_t *PicturePool(vout_display_t *vd, unsigned requested_count)
 /*****************************************************************************
  * vout opengl callbacks
  *****************************************************************************/
-static int OpenglESClean(vlc_gl_t *gl)
+static int OpenglESLock(vlc_gl_t *gl)
 {
-    vout_display_sys_t *sys = (vout_display_sys_t *)gl->sys;
+    struct gl_sys *sys = gl->sys;
 
+    [sys->glESView lock];
     if (likely([sys->glESView isAppActive]))
         [sys->glESView resetBuffers];
+    sys->locked_ctx = (__bridge CVEAGLContext) ((__bridge void *) [sys->glESView eaglContext]);
     return 0;
 }
 
-static void OpenglESNoop(vlc_gl_t *gl)
+static void OpenglESUnlock(vlc_gl_t *gl)
 {
-    (void) gl;
+    struct gl_sys *sys = gl->sys;
+
+    [sys->glESView unlock];
 }
 
 static void OpenglESSwap(vlc_gl_t *gl)
 {
-    vout_display_sys_t *sys = (vout_display_sys_t *)gl->sys;
+    struct gl_sys *sys = gl->sys;
 
     if (likely([sys->glESView isAppActive]))
         [[sys->glESView eaglContext] presentRenderbuffer:GL_RENDERBUFFER];
@@ -523,168 +433,6 @@ static void OpenglESSwap(vlc_gl_t *gl)
 
 
 /*****************************************************************************
- * zero copy display callbacks
- *****************************************************************************/
-
-static picture_pool_t *ZeroCopyPicturePool(vout_display_t *vd, unsigned requested_count)
-{
-    vout_display_sys_t *sys = vd->sys;
-    if (sys->picturePool != NULL)
-        return sys->picturePool;
-
-    picture_t** pictures = calloc(requested_count, sizeof(*pictures));
-    if (!pictures)
-        goto bailout;
-
-    for (unsigned x = 0; x < requested_count; x++) {
-        picture_sys_t *picsys = calloc(1, sizeof(*picsys));
-        if (unlikely(!picsys)) {
-            goto bailout;
-        }
-
-        picture_resource_t picture_resource;
-        picture_resource.p_sys = picsys;
-        picture_resource.pf_destroy = DestroyZeroCopyPoolPicture;
-
-        picture_t *picture = picture_NewFromResource(&vd->fmt, &picture_resource);
-        if (unlikely(picture == NULL)) {
-            free(picsys);
-            goto bailout;
-        }
-
-        pictures[x] = picture;
-    }
-
-    picture_pool_configuration_t pool_config;
-    memset(&pool_config, 0, sizeof(pool_config));
-    pool_config.picture_count = requested_count;
-    pool_config.picture = pictures;
-
-    sys->picturePool = picture_pool_NewExtended(&pool_config);
-
-bailout:
-    if (sys->picturePool == NULL && pictures) {
-        for (unsigned x = 0; x < requested_count; x++)
-            DestroyZeroCopyPoolPicture(pictures[x]);
-        free(pictures);
-    }
-
-    return sys->picturePool;
-}
-
-static void DestroyZeroCopyPoolPicture(picture_t *picture)
-{
-    picture_sys_t *p_sys = (picture_sys_t *)picture->p_sys;
-
-    if (p_sys->pixelBuffer != nil) {
-        CFRelease(p_sys->pixelBuffer);
-        p_sys->pixelBuffer = nil;
-    }
-
-    free(p_sys);
-    free(picture);
-}
-
-static void ZeroCopyClean(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
-{
-    vout_display_sys_t *sys = vd->sys;
-    if (likely([sys->glESView isAppActive]))
-        [sys->glESView resetBuffers];
-}
-
-static void ZeroCopyDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
-{
-    vout_display_sys_t *sys = vd->sys;
-    sys->has_first_frame = true;
-    @synchronized (sys->glESView) {
-        if (likely([sys->glESView isAppActive])) {
-            if (pic->p_sys != NULL) {
-                picture_sys_t *picsys = pic->p_sys;
-
-                if (picsys->pixelBuffer != nil) {
-                    [sys->glESView displayPixelBuffer: picsys->pixelBuffer];
-                }
-            }
-        }
-    }
-
-    picture_Release(pic);
-
-    if (subpicture)
-        subpicture_Delete(subpicture);
-}
-
-static void orientationTransformMatrix(GLfloat matrix[static 16],
-                                       video_orientation_t orientation)
-{
-    static const GLfloat identity[] = {
-        1.0f, 0.0f, 0.0f, 0.0f,
-        0.0f, 1.0f, 0.0f, 0.0f,
-        0.0f, 0.0f, 1.0f, 0.0f,
-        0.0f, 0.0f, 0.0f, 1.0f
-    };
-    memcpy(matrix, identity, sizeof(identity));
-
-    const int k_cos_pi = -1;
-    const int k_cos_pi_2 = 0;
-    const int k_cos_n_pi_2 = 0;
-
-    const int k_sin_pi = 0;
-    const int k_sin_pi_2 = 1;
-    const int k_sin_n_pi_2 = -1;
-
-    bool rotate = false;
-    int cos = 0, sin = 0;
-
-    switch (orientation) {
-
-        case ORIENT_ROTATED_90:
-            cos = k_cos_pi_2;
-            sin = k_sin_pi_2;
-            rotate = true;
-            break;
-        case ORIENT_ROTATED_180:
-            cos = k_cos_pi;
-            sin = k_sin_pi;
-            rotate = true;
-            break;
-        case ORIENT_ROTATED_270:
-            cos = k_cos_n_pi_2;
-            sin = k_sin_n_pi_2;
-            rotate = true;
-            break;
-        case ORIENT_HFLIPPED:
-            matrix[0 * 4 + 0] = -1;
-            break;
-        case ORIENT_VFLIPPED:
-            matrix[1 * 4 + 1] = -1;
-            break;
-        case ORIENT_TRANSPOSED:
-            matrix[0 * 4 + 0] = 0;
-            matrix[0 * 4 + 1] = -1;
-            matrix[1 * 4 + 0] = -1;
-            matrix[1 * 4 + 1] = 0;
-            break;
-        case ORIENT_ANTI_TRANSPOSED:
-            matrix[0 * 4 + 0] = 0;
-            matrix[0 * 4 + 1] = 1;
-            matrix[1 * 4 + 0] = 1;
-            matrix[1 * 4 + 1] = 0;
-            break;
-        default:
-            break;
-    }
-
-    if (rotate) {
-
-        matrix[0 * 4 + 0] = cos;
-        matrix[0 * 4 + 1] = -sin;
-        matrix[1 * 4 + 0] = sin;
-        matrix[1 * 4 + 1] = cos;
-    }
-}
-
-/*****************************************************************************
  * Our UIView object
  *****************************************************************************/
 @implementation VLCOpenGLES2VideoView
@@ -695,7 +443,7 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
     return [CAEAGLLayer class];
 }
 
-- (id)initWithFrame:(CGRect)frame zeroCopy:(bool)zero_copy voutDisplay:(vout_display_t *)vd
+- (id)initWithFrame:(CGRect)frame voutDisplay:(vout_display_t *)vd
 {
     self = [super initWithFrame:frame];
 
@@ -720,16 +468,10 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
     _voutDisplay = vd;
 
     [self createBuffers];
-    if (zero_copy) {
-        _preferredConversion = kColorConversion709;
-        [self setupZeroCopyGL];
-    }
 
     [self reshape];
     [self setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
 
-    _zeroCopy = zero_copy;
-
     return self;
 }
 
@@ -789,12 +531,6 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
 
 - (void)dealloc
 {
-    if (_zeroCopy) {
-        [self cleanUpTextures];
-
-        if(likely(_videoTextureCache))
-            CFRelease(_videoTextureCache);
-    }
 
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     [_eaglContext release];
@@ -811,12 +547,6 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
 {
     glDisable(GL_DEPTH_TEST);
 
-    glEnableVertexAttribArray(ATTRIB_VERTEX);
-    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
-
-    glEnableVertexAttribArray(ATTRIB_TEXCOORD);
-    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
-
     glGenFramebuffers(1, &_frameBuffer);
     glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
 
@@ -851,17 +581,23 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
 - (void)resetBuffers
 {
     if (unlikely(_bufferNeedReset)) {
-        EAGLContext *previousContext = [EAGLContext currentContext];
-        [EAGLContext setCurrentContext:_eaglContext];
-
         [self destroyBuffers];
         [self createBuffers];
         _bufferNeedReset = NO;
-
-        [EAGLContext setCurrentContext:previousContext];
     }
 }
 
+- (void)lock
+{
+    _previousEaglContext = [EAGLContext currentContext];
+    [EAGLContext setCurrentContext:_eaglContext];
+}
+
+- (void)unlock
+{
+    [EAGLContext setCurrentContext:_previousEaglContext];
+}
+
 - (void)layoutSubviews
 {
     [self reshape];
@@ -939,327 +675,4 @@ static void orientationTransformMatrix(GLfloat matrix[static 16],
     return YES;
 }
 
-- (void)displayPixelBuffer:(CVPixelBufferRef)pixelBuffer
-{
-    /* the currently current context may not be ours, so cache it and restore it later */
-    EAGLContext *previousContext = [EAGLContext currentContext];
-    [EAGLContext setCurrentContext:_eaglContext];
-
-    CVReturn err;
-    if (pixelBuffer != NULL) {
-        int frameWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
-        int frameHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
-
-        if (!_videoTextureCache) {
-            if (_voutDisplay)
-                msg_Err(_voutDisplay, "No video texture cache");
-            goto done;
-        }
-
-        [self cleanUpTextures];
-
-        /* Use the color attachment of the pixel buffer to determine the appropriate color conversion matrix. */
-        CFTypeRef colorAttachments = CVBufferGetAttachment(pixelBuffer, kCVImageBufferYCbCrMatrixKey, NULL);
-
-        if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4)
-            _preferredConversion = kColorConversion601;
-        else
-            _preferredConversion = kColorConversion709;
-
-        /* Create Y and UV textures from the pixel buffer.
-         * These textures will be drawn on the frame buffer Y-plane. */
-        glActiveTexture(GL_TEXTURE0);
-
-        err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
-                                                           _videoTextureCache,
-                                                           pixelBuffer,
-                                                           NULL,
-                                                           GL_TEXTURE_2D,
-                                                           GL_RED_EXT,
-                                                           frameWidth,
-                                                           frameHeight,
-                                                           GL_RED_EXT,
-                                                           GL_UNSIGNED_BYTE,
-                                                           0,
-                                                           &_lumaTexture);
-        if (err) {
-            if (_voutDisplay)
-                msg_Err(_voutDisplay, "Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
-        }
-
-        glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-        // UV-plane.
-        glActiveTexture(GL_TEXTURE1);
-        err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
-                                                           _videoTextureCache,
-                                                           pixelBuffer,
-                                                           NULL,
-                                                           GL_TEXTURE_2D,
-                                                           GL_RG_EXT,
-                                                           frameWidth / 2,
-                                                           frameHeight / 2,
-                                                           GL_RG_EXT,
-                                                           GL_UNSIGNED_BYTE,
-                                                           1,
-                                                           &_chromaTexture);
-        if (err) {
-            if (_voutDisplay)
-                msg_Err(_voutDisplay, "Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
-        }
-
-        glBindTexture(CVOpenGLESTextureGetTarget(_chromaTexture), CVOpenGLESTextureGetName(_chromaTexture));
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-        glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
-    }
-
-    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-    glClear(GL_COLOR_BUFFER_BIT);
-
-    // Use shader program.
-    glUseProgram(self.shaderProgram);
-    glUniformMatrix3fv(uniforms[UNIFORM_COLOR_CONVERSION_MATRIX], 1, GL_FALSE, _preferredConversion);
-
-    GLfloat transformMatrix[16];
-    orientationTransformMatrix(transformMatrix, _voutDisplay->fmt.orientation);
-    glUniformMatrix4fv(uniforms[UNIFORM_TRANSFORM_MATRIX], 1, GL_FALSE, transformMatrix);
-
-    // Set up the quad vertices with respect to the orientation and aspect ratio of the video.
-    CGRect vertexSamplingRect = self.bounds;
-
-    // Compute normalized quad coordinates to draw the frame into.
-    CGSize normalizedSamplingSize = CGSizeMake(0.0, 0.0);
-    CGSize cropScaleAmount = CGSizeMake(vertexSamplingRect.size.width/self.bounds.size.width, vertexSamplingRect.size.height/self.bounds.size.height);
-
-    // Normalize the quad vertices.
-    if (cropScaleAmount.width > cropScaleAmount.height) {
-        normalizedSamplingSize.width = 1.0;
-        normalizedSamplingSize.height = cropScaleAmount.height/cropScaleAmount.width;
-    }
-    else {
-        normalizedSamplingSize.width = 1.0;
-        normalizedSamplingSize.height = cropScaleAmount.width/cropScaleAmount.height;
-    }
-
-    /*
-     The quad vertex data defines the region of 2D plane onto which we draw our pixel buffers.
-     Vertex data formed using (-1,-1) and (1,1) as the bottom left and top right coordinates respectively, covers the entire screen.
-     */
-    GLfloat quadVertexData [] = {
-        -1 * normalizedSamplingSize.width, -1 * normalizedSamplingSize.height,
-        normalizedSamplingSize.width, -1 * normalizedSamplingSize.height,
-        -1 * normalizedSamplingSize.width, normalizedSamplingSize.height,
-        normalizedSamplingSize.width, normalizedSamplingSize.height,
-    };
-
-    // Update attribute values.
-    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, quadVertexData);
-    glEnableVertexAttribArray(ATTRIB_VERTEX);
-
-    /*
-     The texture vertices are set up such that we flip the texture vertically. This is so that our top left origin buffers match OpenGL's bottom left texture coordinate system.
-     */
-    CGRect textureSamplingRect = CGRectMake(0, 0, 1, 1);
-    GLfloat quadTextureData[] =  {
-        CGRectGetMinX(textureSamplingRect), CGRectGetMaxY(textureSamplingRect),
-        CGRectGetMaxX(textureSamplingRect), CGRectGetMaxY(textureSamplingRect),
-        CGRectGetMinX(textureSamplingRect), CGRectGetMinY(textureSamplingRect),
-        CGRectGetMaxX(textureSamplingRect), CGRectGetMinY(textureSamplingRect)
-    };
-
-    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, 0, 0, quadTextureData);
-    glEnableVertexAttribArray(ATTRIB_TEXCOORD);
-
-    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
-    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
-    [_eaglContext presentRenderbuffer:GL_RENDERBUFFER];
-
-    glFlush();
-
-done:
-    /* restore previous eagl context which we cached on entry */
-    [EAGLContext setCurrentContext:previousContext];
-}
-
-- (void)setupZeroCopyGL
-{
-    EAGLContext *previousContext = [EAGLContext currentContext];
-    [EAGLContext setCurrentContext:_eaglContext];
-    [self loadShaders];
-
-    glUseProgram(self.shaderProgram);
-
-    // 0 and 1 are the texture IDs of _lumaTexture and _chromaTexture respectively.
-    glUniform1i(uniforms[UNIFORM_Y], 0);
-    glUniform1i(uniforms[UNIFORM_UV], 1);
-
-    GLfloat transformMatrix[16];
-    orientationTransformMatrix(transformMatrix, _voutDisplay->fmt.orientation);
-    glUniformMatrix4fv(uniforms[UNIFORM_TRANSFORM_MATRIX], 1, GL_FALSE, transformMatrix);
-
-    glUniformMatrix3fv(uniforms[UNIFORM_COLOR_CONVERSION_MATRIX], 1, GL_FALSE, _preferredConversion);
-
-    if (!_videoTextureCache) {
-        CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, _eaglContext, NULL, &_videoTextureCache);
-        if (err != noErr) {
-            if (_voutDisplay)
-                msg_Err(_voutDisplay, "Error at CVOpenGLESTextureCacheCreate %d", err);
-        }
-    }
-    [EAGLContext setCurrentContext:previousContext];
-}
-
-- (void)cleanUpTextures
-{
-    if (_lumaTexture) {
-        CFRelease(_lumaTexture);
-        _lumaTexture = NULL;
-    }
-
-    if (_chromaTexture) {
-        CFRelease(_chromaTexture);
-        _chromaTexture = NULL;
-    }
-
-    // Periodic texture cache flush every frame
-    CVOpenGLESTextureCacheFlush(_videoTextureCache, 0);
-}
-
-- (BOOL)loadShaders
-{
-    GLuint vertShader, fragShader;
-    NSURL *vertShaderURL, *fragShaderURL;
-
-    // Create the shader program.
-    self.shaderProgram = glCreateProgram();
-
-    // Create and compile the vertex shader.
-    if (![self compileShader:&vertShader type:GL_VERTEX_SHADER sourceString:vertexShaderString]) {
-        if (_voutDisplay)
-            msg_Err(_voutDisplay, "Failed to compile vertex shader");
-        return NO;
-    }
-
-    // Create and compile fragment shader.
-    if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER sourceString:fragmentShaderString]) {
-        if (_voutDisplay)
-            msg_Err(_voutDisplay, "Failed to compile fragment shader");
-        return NO;
-    }
-
-    // Attach vertex shader to program.
-    glAttachShader(self.shaderProgram, vertShader);
-
-    // Attach fragment shader to program.
-    glAttachShader(self.shaderProgram, fragShader);
-
-    // Bind attribute locations. This needs to be done prior to linking.
-    glBindAttribLocation(self.shaderProgram, ATTRIB_VERTEX, "position");
-    glBindAttribLocation(self.shaderProgram, ATTRIB_TEXCOORD, "texCoord");
-
-    // Link the program.
-    if (![self linkProgram:self.shaderProgram]) {
-        if (_voutDisplay)
-            msg_Err(_voutDisplay, "Failed to link program: %d", self.shaderProgram);
-
-        if (vertShader) {
-            glDeleteShader(vertShader);
-            vertShader = 0;
-        }
-        if (fragShader) {
-            glDeleteShader(fragShader);
-            fragShader = 0;
-        }
-        if (self.shaderProgram) {
-            glDeleteProgram(self.shaderProgram);
-            self.shaderProgram = 0;
-        }
-
-        return NO;
-    }
-
-    // Get uniform locations.
-    uniforms[UNIFORM_Y] = glGetUniformLocation(self.shaderProgram, "SamplerY");
-    uniforms[UNIFORM_UV] = glGetUniformLocation(self.shaderProgram, "SamplerUV");
-    uniforms[UNIFORM_COLOR_CONVERSION_MATRIX] = glGetUniformLocation(self.shaderProgram, "colorConversionMatrix");
-    uniforms[UNIFORM_TRANSFORM_MATRIX] = glGetUniformLocation(self.shaderProgram, "transformMatrix");
-
-    // Release vertex and fragment shaders.
-    if (vertShader) {
-        glDetachShader(self.shaderProgram, vertShader);
-        glDeleteShader(vertShader);
-    }
-    if (fragShader) {
-        glDetachShader(self.shaderProgram, fragShader);
-        glDeleteShader(fragShader);
-    }
-
-    return YES;
-}
-
-- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type sourceString:sourceString
-{
-    GLint status;
-    const GLchar *source;
-    source = (GLchar *)[sourceString UTF8String];
-
-    *shader = glCreateShader(type);
-    glShaderSource(*shader, 1, &source, NULL);
-    glCompileShader(*shader);
-
-#ifndef NDEBUG
-    GLint logLength;
-    glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
-    if (logLength > 0) {
-        GLchar *log = (GLchar *)malloc(logLength);
-        glGetShaderInfoLog(*shader, logLength, &logLength, log);
-        if (_voutDisplay)
-            msg_Dbg(_voutDisplay, "Shader compile log:\n%s", log);
-        free(log);
-    }
-#endif
-
-    glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
-    if (status == 0) {
-        glDeleteShader(*shader);
-        return NO;
-    }
-
-    return YES;
-}
-
-- (BOOL)linkProgram:(GLuint)prog
-{
-    GLint status;
-    glLinkProgram(prog);
-
-#ifndef NDEBUG
-    GLint logLength;
-    glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
-    if (logLength > 0) {
-        GLchar *log = (GLchar *)malloc(logLength);
-        glGetProgramInfoLog(prog, logLength, &logLength, log);
-        if (_voutDisplay)
-            msg_Dbg(_voutDisplay, "Program link log:\n%s", log);
-        free(log);
-    }
-#endif
-
-    glGetProgramiv(prog, GL_LINK_STATUS, &status);
-    if (status == 0) {
-        return NO;
-    }
-
-    return YES;
-}
-
 @end
diff --git a/modules/video_output/opengl/internal.h b/modules/video_output/opengl/internal.h
index 13bd777..f746872 100644
--- a/modules/video_output/opengl/internal.h
+++ b/modules/video_output/opengl/internal.h
@@ -331,7 +331,7 @@ opengl_tex_converter_anop_init(const video_format_t *,
                                opengl_tex_converter_t *);
 #endif
 
-#ifdef __APPLE__
+#ifdef VLCGL_CONV_CVPX
 GLuint
 opengl_tex_converter_cvpx_init(const video_format_t *fmt,
                                opengl_tex_converter_t *tc);



More information about the vlc-commits mailing list