Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2013 Keith Packard
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and its
  5.  * documentation for any purpose is hereby granted without fee, provided that
  6.  * the above copyright notice appear in all copies and that both that copyright
  7.  * notice and this permission notice appear in supporting documentation, and
  8.  * that the name of the copyright holders not be used in advertising or
  9.  * publicity pertaining to distribution of the software without specific,
  10.  * written prior permission.  The copyright holders make no representations
  11.  * about the suitability of this software for any purpose.  It is provided "as
  12.  * is" without express or implied warranty.
  13.  *
  14.  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  15.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  16.  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  17.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  18.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  19.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  20.  * OF THIS SOFTWARE.
  21.  */
  22.  
  23. /* This file was derived from dri2_priv.h which carries the following
  24.  * copyright:
  25.  *
  26.  * Copyright © 2008 Red Hat, Inc.
  27.  *
  28.  * Permission is hereby granted, free of charge, to any person obtaining a
  29.  * copy of this software and associated documentation files (the "Soft-
  30.  * ware"), to deal in the Software without restriction, including without
  31.  * limitation the rights to use, copy, modify, merge, publish, distribute,
  32.  * and/or sell copies of the Software, and to permit persons to whom the
  33.  * Software is furnished to do so, provided that the above copyright
  34.  * notice(s) and this permission notice appear in all copies of the Soft-
  35.  * ware and that both the above copyright notice(s) and this permission
  36.  * notice appear in supporting documentation.
  37.  *
  38.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  39.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
  40.  * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
  41.  * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
  42.  * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
  43.  * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  44.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  45.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
  46.  * MANCE OF THIS SOFTWARE.
  47.  *
  48.  * Except as contained in this notice, the name of a copyright holder shall
  49.  * not be used in advertising or otherwise to promote the sale, use or
  50.  * other dealings in this Software without prior written authorization of
  51.  * the copyright holder.
  52.  *
  53.  * Authors:
  54.  *   Kristian Høgsberg (krh@redhat.com)
  55.  */
  56.  
  57. #include <xcb/xcb.h>
  58. #include <xcb/dri3.h>
  59. #include <xcb/present.h>
  60. #include <xcb/sync.h>
  61.  
  62. /* From xmlpool/options.h, user exposed so should be stable */
  63. #define DRI_CONF_VBLANK_NEVER 0
  64. #define DRI_CONF_VBLANK_DEF_INTERVAL_0 1
  65. #define DRI_CONF_VBLANK_DEF_INTERVAL_1 2
  66. #define DRI_CONF_VBLANK_ALWAYS_SYNC 3
  67.  
  68. enum dri3_buffer_type {
  69.    dri3_buffer_back = 0,
  70.    dri3_buffer_front = 1
  71. };
  72.  
  73. struct dri3_buffer {
  74.    __DRIimage   *image;
  75.    __DRIimage   *linear_buffer;
  76.    uint32_t     pixmap;
  77.  
  78.    /* Synchronization between the client and X server is done using an
  79.     * xshmfence that is mapped into an X server SyncFence. This lets the
  80.     * client check whether the X server is done using a buffer with a simple
  81.     * xshmfence call, rather than going to read X events from the wire.
  82.     *
  83.     * However, we can only wait for one xshmfence to be triggered at a time,
  84.     * so we need to know *which* buffer is going to be idle next. We do that
  85.     * by waiting for a PresentIdleNotify event. When that event arrives, the
  86.     * 'busy' flag gets cleared and the client knows that the fence has been
  87.     * triggered, and that the wait call will not block.
  88.     */
  89.  
  90.    uint32_t     sync_fence;     /* XID of X SyncFence object */
  91.    struct xshmfence *shm_fence; /* pointer to xshmfence object */
  92.    GLboolean    busy;           /* Set on swap, cleared on IdleNotify */
  93.    GLboolean    own_pixmap;     /* We allocated the pixmap ID, free on destroy */
  94.    void         *driverPrivate;
  95.  
  96.    uint32_t     size;
  97.    uint32_t     pitch;
  98.    uint32_t     cpp;
  99.    uint32_t     flags;
  100.    uint32_t     width, height;
  101.    uint64_t     last_swap;
  102.  
  103.    enum dri3_buffer_type        buffer_type;
  104. };
  105.  
  106. struct dri3_display
  107. {
  108.    __GLXDRIdisplay base;
  109.  
  110.    const __DRIextension **loader_extensions;
  111.  
  112.    /* DRI3 bits */
  113.    int dri3Major;
  114.    int dri3Minor;
  115.  
  116.    /* Present bits */
  117.    int hasPresent;
  118.    int presentMajor;
  119.    int presentMinor;
  120. };
  121.  
  122. struct dri3_screen {
  123.    struct glx_screen base;
  124.  
  125.    __DRIscreen *driScreen;
  126.    __GLXDRIscreen vtable;
  127.  
  128.    const __DRIimageExtension *image;
  129.    const __DRIimageDriverExtension *image_driver;
  130.    const __DRIcoreExtension *core;
  131.    const __DRI2flushExtension *f;
  132.    const __DRI2configQueryExtension *config;
  133.    const __DRItexBufferExtension *texBuffer;
  134.    const __DRI2rendererQueryExtension *rendererQuery;
  135.    const __DRIconfig **driver_configs;
  136.  
  137.    void *driver;
  138.    int fd;
  139.    int is_different_gpu;
  140.  
  141.    int show_fps_interval;
  142. };
  143.  
  144. struct dri3_context
  145. {
  146.    struct glx_context base;
  147.    __DRIcontext *driContext;
  148. };
  149.  
  150. #define DRI3_MAX_BACK   4
  151. #define DRI3_BACK_ID(i) (i)
  152. #define DRI3_FRONT_ID   (DRI3_MAX_BACK)
  153.  
  154. static inline int
  155. dri3_pixmap_buf_id(enum dri3_buffer_type buffer_type)
  156. {
  157.    if (buffer_type == dri3_buffer_back)
  158.       return DRI3_BACK_ID(0);
  159.    else
  160.       return DRI3_FRONT_ID;
  161. }
  162.  
  163. #define DRI3_NUM_BUFFERS        (1 + DRI3_MAX_BACK)
  164.  
  165. struct dri3_drawable {
  166.    __GLXDRIdrawable base;
  167.    __DRIdrawable *driDrawable;
  168.    int width, height, depth;
  169.    int swap_interval;
  170.    uint8_t have_back;
  171.    uint8_t have_fake_front;
  172.    uint8_t is_pixmap;
  173.    uint8_t flipping;
  174.  
  175.    /* Present extension capabilities
  176.     */
  177.    uint32_t present_capabilities;
  178.  
  179.    /* SBC numbers are tracked by using the serial numbers
  180.     * in the present request and complete events
  181.     */
  182.    uint64_t send_sbc;
  183.    uint64_t recv_sbc;
  184.  
  185.    /* Last received UST/MSC values for pixmap present complete */
  186.    uint64_t ust, msc;
  187.  
  188.    /* Last received UST/MSC values from present notify msc event */
  189.    uint64_t notify_ust, notify_msc;
  190.  
  191.    /* Serial numbers for tracking wait_for_msc events */
  192.    uint32_t send_msc_serial;
  193.    uint32_t recv_msc_serial;
  194.  
  195.    struct dri3_buffer *buffers[DRI3_NUM_BUFFERS];
  196.    int cur_back;
  197.    int num_back;
  198.  
  199.    uint32_t *stamp;
  200.  
  201.    xcb_present_event_t eid;
  202.    xcb_gcontext_t gc;
  203.    xcb_special_event_t *special_event;
  204.  
  205.    /* LIBGL_SHOW_FPS support */
  206.    uint64_t previous_ust;
  207.    unsigned frames;
  208. };
  209.  
  210.  
  211. _X_HIDDEN int
  212. dri3_query_renderer_integer(struct glx_screen *base, int attribute,
  213.                             unsigned int *value);
  214.  
  215. _X_HIDDEN int
  216. dri3_query_renderer_string(struct glx_screen *base, int attribute,
  217.                            const char **value);
  218.