Home | History | Annotate | Download | only in state_tracker
      1 /**********************************************************
      2  * Copyright 2010 VMware, Inc.  All rights reserved.
      3  *
      4  * Permission is hereby granted, free of charge, to any person
      5  * obtaining a copy of this software and associated documentation
      6  * files (the "Software"), to deal in the Software without
      7  * restriction, including without limitation the rights to use, copy,
      8  * modify, merge, publish, distribute, sublicense, and/or sell copies
      9  * of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be
     13  * included in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  *
     24  **********************************************************/
     25 
     26 
     27 #ifndef _ST_API_H_
     28 #define _ST_API_H_
     29 
     30 #include "pipe/p_compiler.h"
     31 #include "pipe/p_format.h"
     32 
     33 /**
     34  * \file API for communication between state trackers and state tracker
     35  * managers.
     36  *
     37  * While both are state tackers, we use the term state tracker for rendering
     38  * APIs such as OpenGL or OpenVG, and state tracker manager for window system
     39  * APIs such as EGL or GLX in this file.
     40  *
     41  * This file defines an API to be implemented by both state trackers and state
     42  * tracker managers.
     43  */
     44 
     45 /**
     46  * The supported rendering API of a state tracker.
     47  */
     48 enum st_api_type {
     49    ST_API_OPENGL,
     50    ST_API_OPENVG,
     51 
     52    ST_API_COUNT
     53 };
     54 
     55 /**
     56  * The profile of a context.
     57  */
     58 enum st_profile_type
     59 {
     60    ST_PROFILE_DEFAULT,			/**< OpenGL compatibility profile */
     61    ST_PROFILE_OPENGL_CORE,		/**< OpenGL 3.2+ core profile */
     62    ST_PROFILE_OPENGL_ES1,		/**< OpenGL ES 1.x */
     63    ST_PROFILE_OPENGL_ES2		/**< OpenGL ES 2.0 */
     64 };
     65 
     66 /* for profile_mask in st_api */
     67 #define ST_PROFILE_DEFAULT_MASK      (1 << ST_PROFILE_DEFAULT)
     68 #define ST_PROFILE_OPENGL_CORE_MASK  (1 << ST_PROFILE_OPENGL_CORE)
     69 #define ST_PROFILE_OPENGL_ES1_MASK   (1 << ST_PROFILE_OPENGL_ES1)
     70 #define ST_PROFILE_OPENGL_ES2_MASK   (1 << ST_PROFILE_OPENGL_ES2)
     71 
     72 /**
     73  * Optional API/state tracker features.
     74  */
     75 enum st_api_feature
     76 {
     77    ST_API_FEATURE_MS_VISUALS  /**< support for multisample visuals */
     78 };
     79 
     80 /* for feature_mask in st_api */
     81 #define ST_API_FEATURE_MS_VISUALS_MASK (1 << ST_API_FEATURE_MS_VISUALS)
     82 
     83 /**
     84  * New context flags for GL 3.0 and beyond.
     85  *
     86  * Profile information (core vs. compatibilty for OpenGL 3.2+) is communicated
     87  * through the \c st_profile_type, not through flags.
     88  */
     89 #define ST_CONTEXT_FLAG_DEBUG               (1 << 0)
     90 #define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE  (1 << 1)
     91 #define ST_CONTEXT_FLAG_ROBUST_ACCESS       (1 << 2)
     92 
     93 /**
     94  * Reasons that context creation might fail.
     95  */
     96 enum st_context_error {
     97    ST_CONTEXT_SUCCESS = 0,
     98    ST_CONTEXT_ERROR_NO_MEMORY,
     99    ST_CONTEXT_ERROR_BAD_API,
    100    ST_CONTEXT_ERROR_BAD_VERSION,
    101    ST_CONTEXT_ERROR_BAD_FLAG,
    102    ST_CONTEXT_ERROR_UNKNOWN_ATTRIBUTE,
    103    ST_CONTEXT_ERROR_UNKNOWN_FLAG
    104 };
    105 
    106 /**
    107  * Used in st_context_iface->teximage.
    108  */
    109 enum st_texture_type {
    110    ST_TEXTURE_1D,
    111    ST_TEXTURE_2D,
    112    ST_TEXTURE_3D,
    113    ST_TEXTURE_RECT
    114 };
    115 
    116 /**
    117  * Available attachments of framebuffer.
    118  */
    119 enum st_attachment_type {
    120    ST_ATTACHMENT_FRONT_LEFT,
    121    ST_ATTACHMENT_BACK_LEFT,
    122    ST_ATTACHMENT_FRONT_RIGHT,
    123    ST_ATTACHMENT_BACK_RIGHT,
    124    ST_ATTACHMENT_DEPTH_STENCIL,
    125    ST_ATTACHMENT_ACCUM,
    126    ST_ATTACHMENT_SAMPLE,
    127 
    128    ST_ATTACHMENT_COUNT,
    129    ST_ATTACHMENT_INVALID = -1
    130 };
    131 
    132 /* for buffer_mask in st_visual */
    133 #define ST_ATTACHMENT_FRONT_LEFT_MASK     (1 << ST_ATTACHMENT_FRONT_LEFT)
    134 #define ST_ATTACHMENT_BACK_LEFT_MASK      (1 << ST_ATTACHMENT_BACK_LEFT)
    135 #define ST_ATTACHMENT_FRONT_RIGHT_MASK    (1 << ST_ATTACHMENT_FRONT_RIGHT)
    136 #define ST_ATTACHMENT_BACK_RIGHT_MASK     (1 << ST_ATTACHMENT_BACK_RIGHT)
    137 #define ST_ATTACHMENT_DEPTH_STENCIL_MASK  (1 << ST_ATTACHMENT_DEPTH_STENCIL)
    138 #define ST_ATTACHMENT_ACCUM_MASK          (1 << ST_ATTACHMENT_ACCUM)
    139 #define ST_ATTACHMENT_SAMPLE_MASK         (1 << ST_ATTACHMENT_SAMPLE)
    140 
    141 /**
    142  * Enumerations of state tracker context resources.
    143  */
    144 enum st_context_resource_type {
    145    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_2D,
    146    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_3D,
    147    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_X,
    148    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_X,
    149    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    150    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    151    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    152    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
    153    ST_CONTEXT_RESOURCE_OPENGL_RENDERBUFFER,
    154    ST_CONTEXT_RESOURCE_OPENVG_PARENT_IMAGE
    155 };
    156 
    157 /**
    158  * Flush flags.
    159  */
    160 #define ST_FLUSH_FRONT                    (1 << 0)
    161 
    162 /**
    163  * Value to st_manager->get_param function.
    164  */
    165 enum st_manager_param {
    166    /**
    167     * The dri state tracker on old libGL's doesn't do the right thing
    168     * with regards to invalidating the framebuffers.
    169     *
    170     * For the mesa state tracker that means that it needs to invalidate
    171     * the framebuffer in glViewport itself.
    172     */
    173    ST_MANAGER_BROKEN_INVALIDATE
    174 };
    175 
    176 /**
    177  * The return type of st_api->get_proc_address.
    178  */
    179 typedef void (*st_proc_t)(void);
    180 
    181 struct pipe_context;
    182 struct pipe_resource;
    183 struct pipe_fence_handle;
    184 
    185 /**
    186  * Used in st_context_iface->get_resource_for_egl_image.
    187  */
    188 struct st_context_resource
    189 {
    190    /* these fields are filled in by the caller */
    191    enum st_context_resource_type type;
    192    void *resource;
    193 
    194    /* this is owned by the caller */
    195    struct pipe_resource *texture;
    196 };
    197 
    198 /**
    199  * Used in st_manager_iface->get_egl_image.
    200  */
    201 struct st_egl_image
    202 {
    203    /* this is owned by the caller */
    204    struct pipe_resource *texture;
    205 
    206    unsigned level;
    207    unsigned layer;
    208 };
    209 
    210 /**
    211  * Represent the visual of a framebuffer.
    212  */
    213 struct st_visual
    214 {
    215    /**
    216     * Available buffers.  Tested with ST_FRAMEBUFFER_*_MASK.
    217     */
    218    unsigned buffer_mask;
    219 
    220    /**
    221     * Buffer formats.  The formats are always set even when the buffer is
    222     * not available.
    223     */
    224    enum pipe_format color_format;
    225    enum pipe_format depth_stencil_format;
    226    enum pipe_format accum_format;
    227    int samples;
    228 
    229    /**
    230     * Desired render buffer.
    231     */
    232    enum st_attachment_type render_buffer;
    233 };
    234 
    235 
    236 /**
    237  * Configuration options from driconf
    238  */
    239 struct st_config_options
    240 {
    241 	boolean force_glsl_extensions_warn;
    242 };
    243 
    244 /**
    245  * Represent the attributes of a context.
    246  */
    247 struct st_context_attribs
    248 {
    249    /**
    250     * The profile and minimal version to support.
    251     *
    252     * The valid profiles and versions are rendering API dependent.  The latest
    253     * version satisfying the request should be returned, unless the
    254     * ST_CONTEXT_FLAG_FORWARD_COMPATIBLE bit is set.
    255     */
    256    enum st_profile_type profile;
    257    int major, minor;
    258 
    259    /** Mask of ST_CONTEXT_FLAG_x bits */
    260    unsigned flags;
    261 
    262    /**
    263     * The visual of the framebuffers the context will be bound to.
    264     */
    265    struct st_visual visual;
    266 
    267    /**
    268     * Configuration options.
    269     */
    270    struct st_config_options options;
    271 };
    272 
    273 /**
    274  * Represent a windowing system drawable.
    275  *
    276  * The framebuffer is implemented by the state tracker manager and
    277  * used by the state trackers.
    278  *
    279  * Instead of the winsys poking into the API context to figure
    280  * out what buffers that might be needed in the future by the API
    281  * context, it calls into the framebuffer to get the textures.
    282  *
    283  * This structure along with the notify_invalid_framebuffer
    284  * allows framebuffers to be shared between different threads
    285  * but at the same make the API context free from thread
    286  * synchronization primitves, with the exception of a small
    287  * atomic flag used for notification of framebuffer dirty status.
    288  *
    289  * The thread synchronization is put inside the framebuffer
    290  * and only called once the framebuffer has become dirty.
    291  */
    292 struct st_framebuffer_iface
    293 {
    294    /**
    295     * Atomic stamp which changes when framebuffers need to be updated.
    296     */
    297    int32_t stamp;
    298 
    299    /**
    300     * Available for the state tracker manager to use.
    301     */
    302    void *st_manager_private;
    303 
    304    /**
    305     * The visual of a framebuffer.
    306     */
    307    const struct st_visual *visual;
    308 
    309    /**
    310     * Flush the front buffer.
    311     *
    312     * On some window systems, changes to the front buffers are not immediately
    313     * visible.  They need to be flushed.
    314     *
    315     * @att is one of the front buffer attachments.
    316     */
    317    boolean (*flush_front)(struct st_framebuffer_iface *stfbi,
    318                           enum st_attachment_type statt);
    319 
    320    /**
    321     * The state tracker asks for the textures it needs.
    322     *
    323     * It should try to only ask for attachments that it currently renders
    324     * to, thus allowing the winsys to delay the allocation of textures not
    325     * needed. For example front buffer attachments are not needed if you
    326     * only do back buffer rendering.
    327     *
    328     * The implementor of this function needs to also ensure
    329     * thread safty as this call might be done from multiple threads.
    330     *
    331     * The returned textures are owned by the caller.  They should be
    332     * unreferenced when no longer used.  If this function is called multiple
    333     * times with different sets of attachments, those buffers not included in
    334     * the last call might be destroyed.  This behavior might change in the
    335     * future.
    336     */
    337    boolean (*validate)(struct st_framebuffer_iface *stfbi,
    338                        const enum st_attachment_type *statts,
    339                        unsigned count,
    340                        struct pipe_resource **out);
    341 };
    342 
    343 /**
    344  * Represent a rendering context.
    345  *
    346  * This entity is created from st_api and used by the state tracker manager.
    347  */
    348 struct st_context_iface
    349 {
    350    /**
    351     * Available for the state tracker and the manager to use.
    352     */
    353    void *st_context_private;
    354    void *st_manager_private;
    355 
    356    /**
    357     * Destroy the context.
    358     */
    359    void (*destroy)(struct st_context_iface *stctxi);
    360 
    361    /**
    362     * Flush all drawing from context to the pipe also flushes the pipe.
    363     */
    364    void (*flush)(struct st_context_iface *stctxi, unsigned flags,
    365                  struct pipe_fence_handle **fence);
    366 
    367    /**
    368     * Replace the texture image of a texture object at the specified level.
    369     *
    370     * This function is optional.
    371     */
    372    boolean (*teximage)(struct st_context_iface *stctxi,
    373                        enum st_texture_type target,
    374                        int level, enum pipe_format internal_format,
    375                        struct pipe_resource *tex, boolean mipmap);
    376 
    377    /**
    378     * Used to implement glXCopyContext.
    379     */
    380    void (*copy)(struct st_context_iface *stctxi,
    381                 struct st_context_iface *stsrci, unsigned mask);
    382 
    383    /**
    384     * Used to implement wglShareLists.
    385     */
    386    boolean (*share)(struct st_context_iface *stctxi,
    387                     struct st_context_iface *stsrci);
    388 
    389    /**
    390     * Look up and return the info of a resource for EGLImage.
    391     *
    392     * This function is optional.
    393     */
    394    boolean (*get_resource_for_egl_image)(struct st_context_iface *stctxi,
    395                                          struct st_context_resource *stres);
    396 };
    397 
    398 
    399 /**
    400  * Represent a state tracker manager.
    401  *
    402  * This interface is implemented by the state tracker manager.  It corresponds
    403  * to a "display" in the window system.
    404  */
    405 struct st_manager
    406 {
    407    struct pipe_screen *screen;
    408 
    409    /**
    410     * Look up and return the info of an EGLImage.
    411     *
    412     * This is used to implement for example EGLImageTargetTexture2DOES.
    413     * The GLeglImageOES agrument of that call is passed directly to this
    414     * function call and the information needed to access this is returned
    415     * in the given struct out.
    416     *
    417     * @smapi: manager owning the caller context
    418     * @stctx: caller context
    419     * @egl_image: EGLImage that caller recived
    420     * @out: return struct filled out with access information.
    421     *
    422     * This function is optional.
    423     */
    424    boolean (*get_egl_image)(struct st_manager *smapi,
    425                             void *egl_image,
    426                             struct st_egl_image *out);
    427 
    428    /**
    429     * Query an manager param.
    430     */
    431    int (*get_param)(struct st_manager *smapi,
    432                     enum st_manager_param param);
    433 };
    434 
    435 /**
    436  * Represent a rendering API such as OpenGL or OpenVG.
    437  *
    438  * Implemented by the state tracker and used by the state tracker manager.
    439  */
    440 struct st_api
    441 {
    442    /**
    443     * The name of the rendering API.  This is informative.
    444     */
    445    const char *name;
    446 
    447    /**
    448     * The supported rendering API.
    449     */
    450    enum st_api_type api;
    451 
    452    /**
    453     * The supported profiles.  Tested with ST_PROFILE_*_MASK.
    454     */
    455    unsigned profile_mask;
    456 
    457    /**
    458     * The supported optional features.  Tested with ST_FEATURE_*_MASK.
    459     */
    460    unsigned feature_mask;
    461 
    462    /**
    463     * Destroy the API.
    464     */
    465    void (*destroy)(struct st_api *stapi);
    466 
    467    /**
    468     * Return an API entry point.
    469     *
    470     * For GL this is the same as _glapi_get_proc_address.
    471     */
    472    st_proc_t (*get_proc_address)(struct st_api *stapi, const char *procname);
    473 
    474    /**
    475     * Create a rendering context.
    476     */
    477    struct st_context_iface *(*create_context)(struct st_api *stapi,
    478                                               struct st_manager *smapi,
    479                                               const struct st_context_attribs *attribs,
    480                                               enum st_context_error *error,
    481                                               struct st_context_iface *stsharei);
    482 
    483    /**
    484     * Bind the context to the calling thread with draw and read as drawables.
    485     *
    486     * The framebuffers might be NULL, or might have different visuals than the
    487     * context does.
    488     */
    489    boolean (*make_current)(struct st_api *stapi,
    490                            struct st_context_iface *stctxi,
    491                            struct st_framebuffer_iface *stdrawi,
    492                            struct st_framebuffer_iface *streadi);
    493 
    494    /**
    495     * Get the currently bound context in the calling thread.
    496     */
    497    struct st_context_iface *(*get_current)(struct st_api *stapi);
    498 };
    499 
    500 /**
    501  * Return true if the visual has the specified buffers.
    502  */
    503 static INLINE boolean
    504 st_visual_have_buffers(const struct st_visual *visual, unsigned mask)
    505 {
    506    return ((visual->buffer_mask & mask) == mask);
    507 }
    508 
    509 #endif /* _ST_API_H_ */
    510