Subversion Repositories Kolibri OS

Rev

Rev 4358 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. #ifndef _NATIVE_H_
  26. #define _NATIVE_H_
  27.  
  28. #include "EGL/egl.h"  /* for EGL native types */
  29.  
  30. #include "pipe/p_compiler.h"
  31. #include "pipe/p_screen.h"
  32. #include "pipe/p_context.h"
  33. #include "pipe/p_state.h"
  34. #include "state_tracker/sw_winsys.h"
  35.  
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39.  
  40. #include "native_buffer.h"
  41. #include "native_modeset.h"
  42. #include "native_wayland_bufmgr.h"
  43.  
  44. /**
  45.  * Only color buffers are listed.  The others are allocated privately through,
  46.  * for example, st_renderbuffer_alloc_storage().
  47.  */
  48. enum native_attachment {
  49.    NATIVE_ATTACHMENT_FRONT_LEFT,
  50.    NATIVE_ATTACHMENT_BACK_LEFT,
  51.    NATIVE_ATTACHMENT_FRONT_RIGHT,
  52.    NATIVE_ATTACHMENT_BACK_RIGHT,
  53.  
  54.    NUM_NATIVE_ATTACHMENTS
  55. };
  56.  
  57. enum native_param_type {
  58.    /*
  59.     * Return TRUE if window/pixmap surfaces use the buffers of the native
  60.     * types.
  61.     */
  62.    NATIVE_PARAM_USE_NATIVE_BUFFER,
  63.  
  64.    /**
  65.     * Return TRUE if native_surface::present can preserve the buffer.
  66.     */
  67.    NATIVE_PARAM_PRESERVE_BUFFER,
  68.  
  69.    /**
  70.     * Return the maximum supported swap interval.
  71.     */
  72.    NATIVE_PARAM_MAX_SWAP_INTERVAL,
  73.  
  74.    /**
  75.     * Return TRUE if the display supports premultiplied alpha, regardless of
  76.     * the surface color format.
  77.     *
  78.     * Note that returning TRUE for this parameter will make
  79.     * EGL_VG_ALPHA_FORMAT_PRE_BIT to be set for all EGLConfig's with non-zero
  80.     * EGL_ALPHA_SIZE.  EGL_VG_ALPHA_FORMAT attribute of a surface will affect
  81.     * how the surface is presented.
  82.     */
  83.    NATIVE_PARAM_PREMULTIPLIED_ALPHA,
  84.  
  85.    /**
  86.     * Return TRUE if native_surface::present supports presenting a partial
  87.     * surface.
  88.     */
  89.    NATIVE_PARAM_PRESENT_REGION
  90. };
  91.  
  92. /**
  93.  * Control how a surface presentation should happen.
  94.  */
  95. struct native_present_control {
  96.    /**< the attachment to present */
  97.    enum native_attachment natt;
  98.  
  99.    /**< the contents of the presented attachment should be preserved */
  100.    boolean preserve;
  101.  
  102.    /**< wait until the given vsyncs has passed since the last presentation */
  103.    uint swap_interval;
  104.  
  105.    /**< pixels use premultiplied alpha */
  106.    boolean premultiplied_alpha;
  107.  
  108.    /**< The region to present. y=0=top.
  109.         If num_rects is 0, the whole surface is to be presented */
  110.    int num_rects;
  111.    const int *rects; /* x, y, width, height */
  112. };
  113.  
  114. struct native_surface {
  115.    /**
  116.     * Available for caller's use.
  117.     */
  118.    void *user_data;
  119.  
  120.    void (*destroy)(struct native_surface *nsurf);
  121.  
  122.    /**
  123.     * Present the given buffer to the native engine.
  124.     */
  125.    boolean (*present)(struct native_surface *nsurf,
  126.                       const struct native_present_control *ctrl);
  127.  
  128.    /**
  129.     * Validate the buffers of the surface.  textures, if not NULL, points to an
  130.     * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
  131.     * by the caller.  A sequence number is also returned.  The caller can use
  132.     * it to check if anything has changed since the last call. Any of the
  133.     * pointers may be NULL and it indicates the caller has no interest in those
  134.     * values.
  135.     *
  136.     * If this function is called multiple times with different attachment
  137.     * masks, those not listed in the latest call might be destroyed.  This
  138.     * behavior might change in the future.
  139.     */
  140.    boolean (*validate)(struct native_surface *nsurf, uint attachment_mask,
  141.                        unsigned int *seq_num, struct pipe_resource **textures,
  142.                        int *width, int *height);
  143.  
  144.    /**
  145.     * Wait until all native commands affecting the surface has been executed.
  146.     */
  147.    void (*wait)(struct native_surface *nsurf);
  148. };
  149.  
  150. /**
  151.  * Describe a native display config.
  152.  */
  153. struct native_config {
  154.    /* available buffers and their format */
  155.    uint buffer_mask;
  156.    enum pipe_format color_format;
  157.  
  158.    /* supported surface types */
  159.    boolean window_bit;
  160.    boolean pixmap_bit;
  161.    boolean scanout_bit;
  162.  
  163.    int native_visual_id;
  164.    int native_visual_type;
  165.    int level;
  166.    boolean transparent_rgb;
  167.    int transparent_rgb_values[3];
  168. };
  169.  
  170. /**
  171.  * A pipe winsys abstracts the OS.  A pipe screen abstracts the graphcis
  172.  * hardware.  A native display consists of a pipe winsys, a pipe screen, and
  173.  * the native display server.
  174.  */
  175. struct native_display {
  176.    /**
  177.     * The pipe screen of the native display.
  178.     */
  179.    struct pipe_screen *screen;
  180.  
  181.    /**
  182.     * Context used for copy operations.
  183.     */
  184.    struct pipe_context *pipe;
  185.  
  186.    /**
  187.     * Available for caller's use.
  188.     */
  189.    void *user_data;
  190.  
  191.    /**
  192.     * Initialize and create the pipe screen.
  193.     */
  194.    boolean (*init_screen)(struct native_display *ndpy);
  195.  
  196.    void (*destroy)(struct native_display *ndpy);
  197.  
  198.    /**
  199.     * Query the parameters of the native display.
  200.     *
  201.     * The return value is defined by the parameter.
  202.     */
  203.    int (*get_param)(struct native_display *ndpy,
  204.                     enum native_param_type param);
  205.  
  206.    /**
  207.     * Get the supported configs.  The configs are owned by the display, but
  208.     * the returned array should be FREE()ed.
  209.     */
  210.    const struct native_config **(*get_configs)(struct native_display *ndpy,
  211.                                                int *num_configs);
  212.  
  213.    /**
  214.     * Get the color format of the pixmap.  Required unless no config has
  215.     * pixmap_bit set.
  216.     */
  217.    boolean (*get_pixmap_format)(struct native_display *ndpy,
  218.                                 EGLNativePixmapType pix,
  219.                                 enum pipe_format *format);
  220.  
  221.    /**
  222.     * Copy the contents of the resource to the pixmap's front-left attachment.
  223.     * This is used to implement eglCopyBuffers.  Required unless no config has
  224.     * pixmap_bit set.
  225.     */
  226.    boolean (*copy_to_pixmap)(struct native_display *ndpy,
  227.                              EGLNativePixmapType pix,
  228.                              struct pipe_resource *src);
  229.  
  230.    /**
  231.     * Create a window surface.  Required unless no config has window_bit set.
  232.     */
  233.    struct native_surface *(*create_window_surface)(struct native_display *ndpy,
  234.                                                    EGLNativeWindowType win,
  235.                                                    const struct native_config *nconf);
  236.  
  237.    /**
  238.     * Create a pixmap surface.  The native config may be NULL.  In that case, a
  239.     * "best config" will be picked.  Required unless no config has pixmap_bit
  240.     * set.
  241.     */
  242.    struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
  243.                                                    EGLNativePixmapType pix,
  244.                                                    const struct native_config *nconf);
  245.  
  246.    const struct native_display_buffer *buffer;
  247.    const struct native_display_modeset *modeset;
  248.    const struct native_display_wayland_bufmgr *wayland_bufmgr;
  249.  
  250. #ifdef HAVE_WAYLAND_BACKEND
  251.    struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */
  252. #endif
  253. };
  254.  
  255. /**
  256.  * The handler for events that a native display may generate.  The events are
  257.  * generated asynchronously and the handler may be called by any thread at any
  258.  * time.
  259.  */
  260. struct native_event_handler {
  261.    /**
  262.     * This function is called when a surface needs to be validated.
  263.     */
  264.    void (*invalid_surface)(struct native_display *ndpy,
  265.                            struct native_surface *nsurf,
  266.                            unsigned int seq_num);
  267.  
  268.    struct pipe_screen *(*new_drm_screen)(struct native_display *ndpy,
  269.                                          const char *name, int fd);
  270.    struct pipe_screen *(*new_sw_screen)(struct native_display *ndpy,
  271.                                         struct sw_winsys *ws);
  272.  
  273.    struct pipe_resource *(*lookup_egl_image)(struct native_display *ndpy,
  274.                                              void *egl_image);
  275. };
  276.  
  277. /**
  278.  * Test whether an attachment is set in the mask.
  279.  */
  280. static INLINE boolean
  281. native_attachment_mask_test(uint mask, enum native_attachment att)
  282. {
  283.    return !!(mask & (1 << att));
  284. }
  285.  
  286. /**
  287.  * Get the display copy context
  288.  */
  289. static INLINE struct pipe_context *
  290. ndpy_get_copy_context(struct native_display *ndpy)
  291. {
  292.    if (!ndpy->pipe)
  293.       ndpy->pipe = ndpy->screen->context_create(ndpy->screen, NULL);
  294.    return ndpy->pipe;
  295. }
  296.  
  297. /**
  298.  * Free display screen and context resources
  299.  */
  300. static INLINE void
  301. ndpy_uninit(struct native_display *ndpy)
  302. {
  303.    if (ndpy->pipe)
  304.       ndpy->pipe->destroy(ndpy->pipe);
  305.    if (ndpy->screen)
  306.       ndpy->screen->destroy(ndpy->screen);
  307. }
  308.  
  309. struct native_platform {
  310.    const char *name;
  311.  
  312.    /**
  313.     * Create the native display and usually establish a connection to the
  314.     * display server.
  315.     *
  316.     * No event should be generated at this stage.
  317.     */
  318.    struct native_display *(*create_display)(void *dpy, boolean use_sw);
  319. };
  320.  
  321. const struct native_platform *
  322. native_get_gdi_platform(const struct native_event_handler *event_handler);
  323.  
  324. const struct native_platform *
  325. native_get_x11_platform(const struct native_event_handler *event_handler);
  326.  
  327. const struct native_platform *
  328. native_get_wayland_platform(const struct native_event_handler *event_handler);
  329.  
  330. const struct native_platform *
  331. native_get_drm_platform(const struct native_event_handler *event_handler);
  332.  
  333. const struct native_platform *
  334. native_get_fbdev_platform(const struct native_event_handler *event_handler);
  335.  
  336. const struct native_platform *
  337. native_get_null_platform(const struct native_event_handler *event_handler);
  338.  
  339. const struct native_platform *
  340. native_get_android_platform(const struct native_event_handler *event_handler);
  341.  
  342. #ifdef __cplusplus
  343. }
  344. #endif
  345.  
  346. #endif /* _NATIVE_H_ */
  347.