framebuffer.c revision 8b23a6c7e1aee255004dd19098d4c2462b61b849
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <memory.h>
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* client fields, these correspond to code that waits for updates before displaying them */
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* at the moment, only one client is supported */
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*                        fb_opaque;
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferUpdateFunc       fb_update;
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferRotateFunc       fb_rotate;
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferDoneFunc         fb_done;
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*                        pr_opaque;
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferCheckUpdateFunc  pr_check;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferInvalidateFunc   pr_invalidate;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferDetachFunc       pr_detach;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} QFrameBufferExtra;
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_get_pitch( int  width, QFrameBufferFormat  format )
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (format) {
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case QFRAME_BUFFER_RGB565:
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return width*2;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return -1;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_init( QFrameBuffer*       qfbuff,
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 width,
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 height,
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 rotation,
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   QFrameBufferFormat  format )
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int   pitch;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rotation &= 3;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!qfbuff || width < 0 || height < 0)
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    pitch = _get_pitch( width, format );
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (pitch < 0)
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    memset( qfbuff, 0, sizeof(*qfbuff) );
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->extra = calloc( 1, sizeof(QFrameBufferExtra) );
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (qfbuff->extra == NULL)
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->pixels = calloc( pitch, height );
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (qfbuff->pixels == NULL && (height > 0 && pitch > 0)) {
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        free( qfbuff->extra );
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->width  = width;
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->height = height;
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->pitch  = pitch;
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->format = format;
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qframebuffer_set_dpi( qfbuff, DEFAULT_FRAMEBUFFER_DPI, DEFAULT_FRAMEBUFFER_DPI );
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_dpi( QFrameBuffer*   qfbuff,
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      int             x_dpi,
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      int             y_dpi )
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* dpi = dots / inch
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** inch = dots / dpi
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** mm / 25.4 = dots / dpi
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** mm = (dots * 25.4)/dpi
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_width_mm  = (int)(0.5 + 25.4 * qfbuff->width  / x_dpi);
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_height_mm = (int)(0.5 + 25.4 * qfbuff->height / y_dpi);
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* alternative to qframebuffer_set_dpi where one can set the physical dimensions directly */
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* in millimeters. for the record 1 inch = 25.4 mm */
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_mm( QFrameBuffer*   qfbuff,
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     int             width_mm,
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     int             height_mm )
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_width_mm  = width_mm;
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_height_mm = height_mm;
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_update( QFrameBuffer*  qfbuff, int  x, int  y, int  w, int  h )
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra->fb_update)
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        extra->fb_update( extra->fb_opaque, x, y, w, h );
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_add_client( QFrameBuffer*           qfbuff,
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         void*                   fb_opaque,
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferUpdateFunc  fb_update,
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferRotateFunc  fb_rotate,
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferDoneFunc    fb_done )
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_opaque = fb_opaque;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_update = fb_update;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_rotate = fb_rotate;
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_done   = fb_done;
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_producer( QFrameBuffer*                qfbuff,
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           void*                        opaque,
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferCheckUpdateFunc  pr_check,
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferInvalidateFunc   pr_invalidate,
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferDetachFunc       pr_detach )
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_opaque     = opaque;
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_check      = pr_check;
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_invalidate = pr_invalidate;
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_detach     = pr_detach;
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_rotate( QFrameBuffer*  qfbuff, int  rotation )
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((rotation ^ qfbuff->rotation) & 1) {
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* swap width and height if new rotation requires it */
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int  temp = qfbuff->width;
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->width  = qfbuff->height;
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->height = temp;
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->pitch  = _get_pitch( qfbuff->width, qfbuff->format );
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        temp = qfbuff->phys_width_mm;
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->phys_width_mm  = qfbuff->phys_height_mm;
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->phys_height_mm = temp;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->rotation = rotation;
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra->fb_rotate)
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        extra->fb_rotate( extra->fb_opaque, rotation );
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_done( QFrameBuffer*   qfbuff )
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra) {
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_detach)
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_detach( extra->pr_opaque );
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->fb_done)
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->fb_done( extra->fb_opaque );
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    free( qfbuff->pixels );
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    free( qfbuff->extra );
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    memset( qfbuff, 0, sizeof(*qfbuff) );
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  MAX_FRAME_BUFFERS  8
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic QFrameBuffer* framebuffer_fifo[ MAX_FRAME_BUFFERS ];
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int           framebuffer_fifo_rpos;
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int           framebuffer_fifo_count;
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_fifo_add( QFrameBuffer*  qfbuff )
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (framebuffer_fifo_count >= MAX_FRAME_BUFFERS)
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    framebuffer_fifo[ framebuffer_fifo_count++ ] = qfbuff;
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectQFrameBuffer*
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_fifo_get( void )
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (framebuffer_fifo_rpos >= framebuffer_fifo_count)
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return NULL;
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return framebuffer_fifo[ framebuffer_fifo_rpos++ ];
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_check_updates( void )
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  nn;
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (nn = 0; nn < framebuffer_fifo_count; nn++) {
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBuffer*       q     = framebuffer_fifo[nn];
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBufferExtra*  extra = q->extra;
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_check)
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_check( extra->pr_opaque );
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_invalidate_all( void )
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  nn;
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (nn = 0; nn < framebuffer_fifo_count; nn++) {
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBuffer*       q     = framebuffer_fifo[nn];
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBufferExtra*  extra = q->extra;
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_invalidate)
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_invalidate( extra->pr_opaque );
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
244