15337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian/*
25337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * Copyright (C) 2008 The Android Open Source Project
35337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian *
45337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
55337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * you may not use this file except in compliance with the License.
65337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * You may obtain a copy of the License at
75337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian *
85337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
95337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian *
105337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * Unless required by applicable law or agreed to in writing, software
115337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
125337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * See the License for the specific language governing permissions and
145337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian * limitations under the License.
155337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian */
165337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
175337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
185337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#ifndef ANDROID_FB_INTERFACE_H
195337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#define ANDROID_FB_INTERFACE_H
205337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
215337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#include <stdint.h>
225337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#include <sys/cdefs.h>
235337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#include <sys/types.h>
245337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
255337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#include <cutils/native_handle.h>
265337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
275337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#include <hardware/hardware.h>
285337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
295337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian__BEGIN_DECLS
305337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
315337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#define GRALLOC_HARDWARE_FB0 "fb0"
325337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
335337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian/*****************************************************************************/
345337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
355337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
365337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian/*****************************************************************************/
375337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
385337b102898cfd48eda7215df15baaf3bc96521fMathias Agopiantypedef struct framebuffer_device_t {
3984d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles    /**
4084d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * Common methods of the framebuffer device.  This *must* be the first member of
4184d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * framebuffer_device_t as users of this structure will cast a hw_device_t to
4284d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * framebuffer_device_t pointer in contexts where it's known the hw_device_t references a
4384d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * framebuffer_device_t.
4484d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     */
455337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    struct hw_device_t common;
465337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
475337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* flags describing some attributes of the framebuffer */
485337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const uint32_t  flags;
495337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
505337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* dimensions of the framebuffer in pixels */
515337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const uint32_t  width;
525337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const uint32_t  height;
535337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
545337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* frambuffer stride in pixels */
555337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const int       stride;
565337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
575337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* framebuffer pixel format */
585337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const int       format;
595337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
605337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* resolution of the framebuffer's display panel in pixel per inch*/
615337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const float     xdpi;
625337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const float     ydpi;
635337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
645337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* framebuffer's display panel refresh rate in frames per second */
655337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const float     fps;
665337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
675337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* min swap interval supported by this framebuffer */
685337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const int       minSwapInterval;
695337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
705337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /* max swap interval supported by this framebuffer */
715337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    const int       maxSwapInterval;
725337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
7388ef190fcf4a02839eb13ab7ca8d91d3dd145731Naseer Ahmed    /* Number of framebuffers supported*/
7488ef190fcf4a02839eb13ab7ca8d91d3dd145731Naseer Ahmed    const int       numFramebuffers;
7588ef190fcf4a02839eb13ab7ca8d91d3dd145731Naseer Ahmed
7688ef190fcf4a02839eb13ab7ca8d91d3dd145731Naseer Ahmed    int reserved[7];
775337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
785337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
795337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * requests a specific swap-interval (same definition than EGL)
805337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
815337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Returns 0 on success or -errno on error.
825337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
835337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    int (*setSwapInterval)(struct framebuffer_device_t* window,
845337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian            int interval);
855337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
865337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
875337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * This hook is OPTIONAL.
885337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
895337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * It is non NULL If the framebuffer driver supports "update-on-demand"
905337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * and the given rectangle is the area of the screen that gets
915337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * updated during (*post)().
925337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
935337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * This is useful on devices that are able to DMA only a portion of
945337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * the screen to the display panel, upon demand -- as opposed to
955337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * constantly refreshing the panel 60 times per second, for instance.
965337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
975337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Only the area defined by this rectangle is guaranteed to be valid, that
985337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * is, the driver is not allowed to post anything outside of this
995337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * rectangle.
1005337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1015337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * The rectangle evaluated during (*post)() and specifies which area
1025337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * of the buffer passed in (*post)() shall to be posted.
1035337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1045337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * return -EINVAL if width or height <=0, or if left or top < 0
1055337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
1065337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    int (*setUpdateRect)(struct framebuffer_device_t* window,
1075337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian            int left, int top, int width, int height);
1085337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1095337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
1105337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Post <buffer> to the display (display it on the screen)
1115337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * The buffer must have been allocated with the
1125337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *   GRALLOC_USAGE_HW_FB usage flag.
1135337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * buffer must be the same width and height as the display and must NOT
1145337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * be locked.
1155337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1165337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * The buffer is shown during the next VSYNC.
1175337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1185337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * If the same buffer is posted again (possibly after some other buffer),
1195337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * post() will block until the the first post is completed.
1205337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1215337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Internally, post() is expected to lock the buffer so that a
1225337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * subsequent call to gralloc_module_t::(*lock)() with USAGE_RENDER or
1235337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * USAGE_*_WRITE will block until it is safe; that is typically once this
1245337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * buffer is shown and another buffer has been posted.
1255337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1265337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Returns 0 on success or -errno on error.
1275337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
1285337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    int (*post)(struct framebuffer_device_t* dev, buffer_handle_t buffer);
1295337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1305337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1315337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
1325337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * The (*compositionComplete)() method must be called after the
1335337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * compositor has finished issuing GL commands for client buffers.
1345337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
1355337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1365337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    int (*compositionComplete)(struct framebuffer_device_t* dev);
1375337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1385337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
1395337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * This hook is OPTIONAL.
1405337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1415337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * If non NULL it will be caused by SurfaceFlinger on dumpsys
1425337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
1435337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    void (*dump)(struct framebuffer_device_t* dev, char *buff, int buff_len);
1445337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1455337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    /*
1465337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * (*enableScreen)() is used to either blank (enable=0) or
1475337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * unblank (enable=1) the screen this framebuffer is attached to.
1485337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     *
1495337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     * Returns 0 on success or -errno on error.
1505337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian     */
1515337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    int (*enableScreen)(struct framebuffer_device_t* dev, int enable);
1525337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1535337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    void* reserved_proc[6];
1545337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1555337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian} framebuffer_device_t;
1565337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1575337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1585337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian/** convenience API for opening and closing a supported device */
1595337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1605337b102898cfd48eda7215df15baaf3bc96521fMathias Agopianstatic inline int framebuffer_open(const struct hw_module_t* module,
1615337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian        struct framebuffer_device_t** device) {
1625337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    return module->methods->open(module,
163cc8d9f9fcbc170dedba609a15705e838cf09218bColin Cross            GRALLOC_HARDWARE_FB0, TO_HW_DEVICE_T_OPEN(device));
1645337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian}
1655337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1665337b102898cfd48eda7215df15baaf3bc96521fMathias Agopianstatic inline int framebuffer_close(struct framebuffer_device_t* device) {
1675337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian    return device->common.close(&device->common);
1685337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian}
1695337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1705337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1715337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian__END_DECLS
1725337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian
1735337b102898cfd48eda7215df15baaf3bc96521fMathias Agopian#endif  // ANDROID_FB_INTERFACE_H
174