Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. #define ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED (1 << 3)
  93.  
  94. /**
  95.  * Reasons that context creation might fail.
  96.  */
  97. enum st_context_error {
  98.    ST_CONTEXT_SUCCESS = 0,
  99.    ST_CONTEXT_ERROR_NO_MEMORY,
  100.    ST_CONTEXT_ERROR_BAD_API,
  101.    ST_CONTEXT_ERROR_BAD_VERSION,
  102.    ST_CONTEXT_ERROR_BAD_FLAG,
  103.    ST_CONTEXT_ERROR_UNKNOWN_ATTRIBUTE,
  104.    ST_CONTEXT_ERROR_UNKNOWN_FLAG
  105. };
  106.  
  107. /**
  108.  * Used in st_context_iface->teximage.
  109.  */
  110. enum st_texture_type {
  111.    ST_TEXTURE_1D,
  112.    ST_TEXTURE_2D,
  113.    ST_TEXTURE_3D,
  114.    ST_TEXTURE_RECT
  115. };
  116.  
  117. /**
  118.  * Available attachments of framebuffer.
  119.  */
  120. enum st_attachment_type {
  121.    ST_ATTACHMENT_FRONT_LEFT,
  122.    ST_ATTACHMENT_BACK_LEFT,
  123.    ST_ATTACHMENT_FRONT_RIGHT,
  124.    ST_ATTACHMENT_BACK_RIGHT,
  125.    ST_ATTACHMENT_DEPTH_STENCIL,
  126.    ST_ATTACHMENT_ACCUM,
  127.    ST_ATTACHMENT_SAMPLE,
  128.  
  129.    ST_ATTACHMENT_COUNT,
  130.    ST_ATTACHMENT_INVALID = -1
  131. };
  132.  
  133. /* for buffer_mask in st_visual */
  134. #define ST_ATTACHMENT_FRONT_LEFT_MASK     (1 << ST_ATTACHMENT_FRONT_LEFT)
  135. #define ST_ATTACHMENT_BACK_LEFT_MASK      (1 << ST_ATTACHMENT_BACK_LEFT)
  136. #define ST_ATTACHMENT_FRONT_RIGHT_MASK    (1 << ST_ATTACHMENT_FRONT_RIGHT)
  137. #define ST_ATTACHMENT_BACK_RIGHT_MASK     (1 << ST_ATTACHMENT_BACK_RIGHT)
  138. #define ST_ATTACHMENT_DEPTH_STENCIL_MASK  (1 << ST_ATTACHMENT_DEPTH_STENCIL)
  139. #define ST_ATTACHMENT_ACCUM_MASK          (1 << ST_ATTACHMENT_ACCUM)
  140. #define ST_ATTACHMENT_SAMPLE_MASK         (1 << ST_ATTACHMENT_SAMPLE)
  141.  
  142. /**
  143.  * Enumerations of state tracker context resources.
  144.  */
  145. enum st_context_resource_type {
  146.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_2D,
  147.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_3D,
  148.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_X,
  149.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  150.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  151.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
  152.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  153.    ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  154.    ST_CONTEXT_RESOURCE_OPENGL_RENDERBUFFER,
  155.    ST_CONTEXT_RESOURCE_OPENVG_PARENT_IMAGE
  156. };
  157.  
  158. /**
  159.  * Flush flags.
  160.  */
  161. #define ST_FLUSH_FRONT                    (1 << 0)
  162. #define ST_FLUSH_END_OF_FRAME             (1 << 1)
  163.  
  164. /**
  165.  * Value to st_manager->get_param function.
  166.  */
  167. enum st_manager_param {
  168.    /**
  169.     * The dri state tracker on old libGL's doesn't do the right thing
  170.     * with regards to invalidating the framebuffers.
  171.     *
  172.     * For the mesa state tracker that means that it needs to invalidate
  173.     * the framebuffer in glViewport itself.
  174.     */
  175.    ST_MANAGER_BROKEN_INVALIDATE
  176. };
  177.  
  178. /**
  179.  * The return type of st_api->get_proc_address.
  180.  */
  181. typedef void (*st_proc_t)(void);
  182.  
  183. struct pipe_context;
  184. struct pipe_resource;
  185. struct pipe_fence_handle;
  186.  
  187. /**
  188.  * Used in st_context_iface->get_resource_for_egl_image.
  189.  */
  190. struct st_context_resource
  191. {
  192.    /* these fields are filled in by the caller */
  193.    enum st_context_resource_type type;
  194.    void *resource;
  195.  
  196.    /* this is owned by the caller */
  197.    struct pipe_resource *texture;
  198. };
  199.  
  200. /**
  201.  * Used in st_manager_iface->get_egl_image.
  202.  */
  203. struct st_egl_image
  204. {
  205.    /* this is owned by the caller */
  206.    struct pipe_resource *texture;
  207.  
  208.    unsigned level;
  209.    unsigned layer;
  210. };
  211.  
  212. /**
  213.  * Represent the visual of a framebuffer.
  214.  */
  215. struct st_visual
  216. {
  217.    /**
  218.     * Available buffers.  Tested with ST_FRAMEBUFFER_*_MASK.
  219.     */
  220.    unsigned buffer_mask;
  221.  
  222.    /**
  223.     * Buffer formats.  The formats are always set even when the buffer is
  224.     * not available.
  225.     */
  226.    enum pipe_format color_format;
  227.    enum pipe_format depth_stencil_format;
  228.    enum pipe_format accum_format;
  229.    int samples;
  230.  
  231.    /**
  232.     * Desired render buffer.
  233.     */
  234.    enum st_attachment_type render_buffer;
  235. };
  236.  
  237.  
  238. /**
  239.  * Configuration options from driconf
  240.  */
  241. struct st_config_options
  242. {
  243.    boolean disable_blend_func_extended;
  244.    boolean disable_glsl_line_continuations;
  245.    boolean disable_shader_bit_encoding;
  246.    boolean force_glsl_extensions_warn;
  247.    unsigned force_glsl_version;
  248.    boolean force_s3tc_enable;
  249.    boolean allow_glsl_extension_directive_midshader;
  250. };
  251.  
  252. /**
  253.  * Represent the attributes of a context.
  254.  */
  255. struct st_context_attribs
  256. {
  257.    /**
  258.     * The profile and minimal version to support.
  259.     *
  260.     * The valid profiles and versions are rendering API dependent.  The latest
  261.     * version satisfying the request should be returned.
  262.     */
  263.    enum st_profile_type profile;
  264.    int major, minor;
  265.  
  266.    /** Mask of ST_CONTEXT_FLAG_x bits */
  267.    unsigned flags;
  268.  
  269.    /**
  270.     * The visual of the framebuffers the context will be bound to.
  271.     */
  272.    struct st_visual visual;
  273.  
  274.    /**
  275.     * Configuration options.
  276.     */
  277.    struct st_config_options options;
  278. };
  279.  
  280. struct st_context_iface;
  281.  
  282. /**
  283.  * Represent a windowing system drawable.
  284.  *
  285.  * The framebuffer is implemented by the state tracker manager and
  286.  * used by the state trackers.
  287.  *
  288.  * Instead of the winsys poking into the API context to figure
  289.  * out what buffers that might be needed in the future by the API
  290.  * context, it calls into the framebuffer to get the textures.
  291.  *
  292.  * This structure along with the notify_invalid_framebuffer
  293.  * allows framebuffers to be shared between different threads
  294.  * but at the same make the API context free from thread
  295.  * synchronization primitves, with the exception of a small
  296.  * atomic flag used for notification of framebuffer dirty status.
  297.  *
  298.  * The thread synchronization is put inside the framebuffer
  299.  * and only called once the framebuffer has become dirty.
  300.  */
  301. struct st_framebuffer_iface
  302. {
  303.    /**
  304.     * Atomic stamp which changes when framebuffers need to be updated.
  305.     */
  306.    int32_t stamp;
  307.  
  308.    /**
  309.     * Available for the state tracker manager to use.
  310.     */
  311.    void *st_manager_private;
  312.  
  313.    /**
  314.     * The visual of a framebuffer.
  315.     */
  316.    const struct st_visual *visual;
  317.  
  318.    /**
  319.     * Flush the front buffer.
  320.     *
  321.     * On some window systems, changes to the front buffers are not immediately
  322.     * visible.  They need to be flushed.
  323.     *
  324.     * @att is one of the front buffer attachments.
  325.     */
  326.    boolean (*flush_front)(struct st_context_iface *stctx,
  327.                           struct st_framebuffer_iface *stfbi,
  328.                           enum st_attachment_type statt);
  329.  
  330.    /**
  331.     * The state tracker asks for the textures it needs.
  332.     *
  333.     * It should try to only ask for attachments that it currently renders
  334.     * to, thus allowing the winsys to delay the allocation of textures not
  335.     * needed. For example front buffer attachments are not needed if you
  336.     * only do back buffer rendering.
  337.     *
  338.     * The implementor of this function needs to also ensure
  339.     * thread safty as this call might be done from multiple threads.
  340.     *
  341.     * The returned textures are owned by the caller.  They should be
  342.     * unreferenced when no longer used.  If this function is called multiple
  343.     * times with different sets of attachments, those buffers not included in
  344.     * the last call might be destroyed.  This behavior might change in the
  345.     * future.
  346.     */
  347.    boolean (*validate)(struct st_context_iface *stctx,
  348.                        struct st_framebuffer_iface *stfbi,
  349.                        const enum st_attachment_type *statts,
  350.                        unsigned count,
  351.                        struct pipe_resource **out);
  352. };
  353.  
  354. /**
  355.  * Represent a rendering context.
  356.  *
  357.  * This entity is created from st_api and used by the state tracker manager.
  358.  */
  359. struct st_context_iface
  360. {
  361.    /**
  362.     * Available for the state tracker and the manager to use.
  363.     */
  364.    void *st_context_private;
  365.    void *st_manager_private;
  366.  
  367.    /**
  368.     * The CSO context associated with this context in case we need to draw
  369.     * something before swap buffers.
  370.     */
  371.    struct cso_context *cso_context;
  372.  
  373.    /**
  374.     * The gallium context.
  375.     */
  376.    struct pipe_context *pipe;
  377.  
  378.    /**
  379.     * Destroy the context.
  380.     */
  381.    void (*destroy)(struct st_context_iface *stctxi);
  382.  
  383.    /**
  384.     * Flush all drawing from context to the pipe also flushes the pipe.
  385.     */
  386.    void (*flush)(struct st_context_iface *stctxi, unsigned flags,
  387.                  struct pipe_fence_handle **fence);
  388.  
  389.    /**
  390.     * Replace the texture image of a texture object at the specified level.
  391.     *
  392.     * This function is optional.
  393.     */
  394.    boolean (*teximage)(struct st_context_iface *stctxi,
  395.                        enum st_texture_type target,
  396.                        int level, enum pipe_format internal_format,
  397.                        struct pipe_resource *tex, boolean mipmap);
  398.  
  399.    /**
  400.     * Used to implement glXCopyContext.
  401.     */
  402.    void (*copy)(struct st_context_iface *stctxi,
  403.                 struct st_context_iface *stsrci, unsigned mask);
  404.  
  405.    /**
  406.     * Used to implement wglShareLists.
  407.     */
  408.    boolean (*share)(struct st_context_iface *stctxi,
  409.                     struct st_context_iface *stsrci);
  410.  
  411.    /**
  412.     * Look up and return the info of a resource for EGLImage.
  413.     *
  414.     * This function is optional.
  415.     */
  416.    boolean (*get_resource_for_egl_image)(struct st_context_iface *stctxi,
  417.                                          struct st_context_resource *stres);
  418. };
  419.  
  420.  
  421. /**
  422.  * Represent a state tracker manager.
  423.  *
  424.  * This interface is implemented by the state tracker manager.  It corresponds
  425.  * to a "display" in the window system.
  426.  */
  427. struct st_manager
  428. {
  429.    struct pipe_screen *screen;
  430.  
  431.    /**
  432.     * Look up and return the info of an EGLImage.
  433.     *
  434.     * This is used to implement for example EGLImageTargetTexture2DOES.
  435.     * The GLeglImageOES agrument of that call is passed directly to this
  436.     * function call and the information needed to access this is returned
  437.     * in the given struct out.
  438.     *
  439.     * @smapi: manager owning the caller context
  440.     * @stctx: caller context
  441.     * @egl_image: EGLImage that caller recived
  442.     * @out: return struct filled out with access information.
  443.     *
  444.     * This function is optional.
  445.     */
  446.    boolean (*get_egl_image)(struct st_manager *smapi,
  447.                             void *egl_image,
  448.                             struct st_egl_image *out);
  449.  
  450.    /**
  451.     * Query an manager param.
  452.     */
  453.    int (*get_param)(struct st_manager *smapi,
  454.                     enum st_manager_param param);
  455. };
  456.  
  457. /**
  458.  * Represent a rendering API such as OpenGL or OpenVG.
  459.  *
  460.  * Implemented by the state tracker and used by the state tracker manager.
  461.  */
  462. struct st_api
  463. {
  464.    /**
  465.     * The name of the rendering API.  This is informative.
  466.     */
  467.    const char *name;
  468.  
  469.    /**
  470.     * The supported rendering API.
  471.     */
  472.    enum st_api_type api;
  473.  
  474.    /**
  475.     * The supported profiles.  Tested with ST_PROFILE_*_MASK.
  476.     */
  477.    unsigned profile_mask;
  478.  
  479.    /**
  480.     * The supported optional features.  Tested with ST_FEATURE_*_MASK.
  481.     */
  482.    unsigned feature_mask;
  483.  
  484.    /**
  485.     * Destroy the API.
  486.     */
  487.    void (*destroy)(struct st_api *stapi);
  488.  
  489.    /**
  490.     * Query supported OpenGL versions. (if applicable)
  491.     * The format is (major*10+minor).
  492.     */
  493.    void (*query_versions)(struct st_api *stapi, struct st_manager *sm,
  494.                           struct st_config_options *options,
  495.                           int *gl_core_version,
  496.                           int *gl_compat_version,
  497.                           int *gl_es1_version,
  498.                           int *gl_es2_version);
  499.  
  500.    /**
  501.     * Return an API entry point.
  502.     *
  503.     * For GL this is the same as _glapi_get_proc_address.
  504.     */
  505.    st_proc_t (*get_proc_address)(struct st_api *stapi, const char *procname);
  506.  
  507.    /**
  508.     * Create a rendering context.
  509.     */
  510.    struct st_context_iface *(*create_context)(struct st_api *stapi,
  511.                                               struct st_manager *smapi,
  512.                                               const struct st_context_attribs *attribs,
  513.                                               enum st_context_error *error,
  514.                                               struct st_context_iface *stsharei);
  515.  
  516.    /**
  517.     * Bind the context to the calling thread with draw and read as drawables.
  518.     *
  519.     * The framebuffers might be NULL, or might have different visuals than the
  520.     * context does.
  521.     */
  522.    boolean (*make_current)(struct st_api *stapi,
  523.                            struct st_context_iface *stctxi,
  524.                            struct st_framebuffer_iface *stdrawi,
  525.                            struct st_framebuffer_iface *streadi);
  526.  
  527.    /**
  528.     * Get the currently bound context in the calling thread.
  529.     */
  530.    struct st_context_iface *(*get_current)(struct st_api *stapi);
  531. };
  532.  
  533. /**
  534.  * Return true if the visual has the specified buffers.
  535.  */
  536. static INLINE boolean
  537. st_visual_have_buffers(const struct st_visual *visual, unsigned mask)
  538. {
  539.    return ((visual->buffer_mask & mask) == mask);
  540. }
  541.  
  542. #endif /* _ST_API_H_ */
  543.