Home | History | Annotate | Download | only in pipe
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 /**
     29  * @file
     30  *
     31  * Screen, Adapter or GPU
     32  *
     33  * These are driver functions/facilities that are context independent.
     34  */
     35 
     36 
     37 #ifndef P_SCREEN_H
     38 #define P_SCREEN_H
     39 
     40 
     41 #include "pipe/p_compiler.h"
     42 #include "pipe/p_format.h"
     43 #include "pipe/p_defines.h"
     44 #include "pipe/p_video_enums.h"
     45 
     46 
     47 
     48 #ifdef __cplusplus
     49 extern "C" {
     50 #endif
     51 
     52 
     53 /** Opaque types */
     54 struct winsys_handle;
     55 struct pipe_fence_handle;
     56 struct pipe_resource;
     57 struct pipe_surface;
     58 struct pipe_transfer;
     59 
     60 
     61 /**
     62  * Gallium screen/adapter context.  Basically everything
     63  * hardware-specific that doesn't actually require a rendering
     64  * context.
     65  */
     66 struct pipe_screen {
     67    void (*destroy)( struct pipe_screen * );
     68 
     69    const char *(*get_name)( struct pipe_screen * );
     70 
     71    const char *(*get_vendor)( struct pipe_screen * );
     72 
     73    /**
     74     * Query an integer-valued capability/parameter/limit
     75     * \param param  one of PIPE_CAP_x
     76     */
     77    int (*get_param)( struct pipe_screen *, enum pipe_cap param );
     78 
     79    /**
     80     * Query a float-valued capability/parameter/limit
     81     * \param param  one of PIPE_CAP_x
     82     */
     83    float (*get_paramf)( struct pipe_screen *, enum pipe_capf param );
     84 
     85    /**
     86     * Query a per-shader-stage integer-valued capability/parameter/limit
     87     * \param param  one of PIPE_CAP_x
     88     */
     89    int (*get_shader_param)( struct pipe_screen *, unsigned shader, enum pipe_shader_cap param );
     90 
     91    /**
     92     * Query an integer-valued capability/parameter/limit for a codec/profile
     93     * \param param  one of PIPE_VIDEO_CAP_x
     94     */
     95    int (*get_video_param)( struct pipe_screen *,
     96 			   enum pipe_video_profile profile,
     97 			   enum pipe_video_cap param );
     98 
     99    /**
    100     * Query a compute-specific capability/parameter/limit.
    101     * \param param  one of PIPE_COMPUTE_CAP_x
    102     * \param ret    pointer to a preallocated buffer that will be
    103     *               initialized to the parameter value, or NULL.
    104     * \return       size in bytes of the parameter value that would be
    105     *               returned.
    106     */
    107    int (*get_compute_param)(struct pipe_screen *,
    108 			    enum pipe_compute_cap param,
    109 			    void *ret);
    110 
    111    /**
    112     * Query a timestamp in nanoseconds. The returned value should match
    113     * PIPE_QUERY_TIMESTAMP. This function returns immediately and doesn't
    114     * wait for rendering to complete (which cannot be achieved with queries).
    115     */
    116    uint64_t (*get_timestamp)(struct pipe_screen *);
    117 
    118    struct pipe_context * (*context_create)( struct pipe_screen *,
    119 					    void *priv );
    120 
    121    /**
    122     * Check if the given pipe_format is supported as a texture or
    123     * drawing surface.
    124     * \param bindings  bitmask of PIPE_BIND_*
    125     */
    126    boolean (*is_format_supported)( struct pipe_screen *,
    127                                    enum pipe_format format,
    128                                    enum pipe_texture_target target,
    129                                    unsigned sample_count,
    130                                    unsigned bindings );
    131 
    132    /**
    133     * Check if the given pipe_format is supported as output for this codec/profile.
    134     * \param profile  profile to check, may also be PIPE_VIDEO_PROFILE_UNKNOWN
    135     */
    136    boolean (*is_video_format_supported)( struct pipe_screen *,
    137                                          enum pipe_format format,
    138                                          enum pipe_video_profile profile );
    139 
    140    /**
    141     * Create a new texture object, using the given template info.
    142     */
    143    struct pipe_resource * (*resource_create)(struct pipe_screen *,
    144 					     const struct pipe_resource *templat);
    145 
    146    /**
    147     * Create a texture from a winsys_handle. The handle is often created in
    148     * another process by first creating a pipe texture and then calling
    149     * resource_get_handle.
    150     */
    151    struct pipe_resource * (*resource_from_handle)(struct pipe_screen *,
    152 						  const struct pipe_resource *templat,
    153 						  struct winsys_handle *handle);
    154 
    155    /**
    156     * Get a winsys_handle from a texture. Some platforms/winsys requires
    157     * that the texture is created with a special usage flag like
    158     * DISPLAYTARGET or PRIMARY.
    159     */
    160    boolean (*resource_get_handle)(struct pipe_screen *,
    161 				  struct pipe_resource *tex,
    162 				  struct winsys_handle *handle);
    163 
    164 
    165    void (*resource_destroy)(struct pipe_screen *,
    166 			    struct pipe_resource *pt);
    167 
    168 
    169    /**
    170     * Do any special operations to ensure frontbuffer contents are
    171     * displayed, eg copy fake frontbuffer.
    172     * \param winsys_drawable_handle  an opaque handle that the calling context
    173     *                                gets out-of-band
    174     */
    175    void (*flush_frontbuffer)( struct pipe_screen *screen,
    176                               struct pipe_resource *resource,
    177                               unsigned level, unsigned layer,
    178                               void *winsys_drawable_handle );
    179 
    180 
    181 
    182    /** Set ptr = fence, with reference counting */
    183    void (*fence_reference)( struct pipe_screen *screen,
    184                             struct pipe_fence_handle **ptr,
    185                             struct pipe_fence_handle *fence );
    186 
    187    /**
    188     * Checks whether the fence has been signalled.
    189     */
    190    boolean (*fence_signalled)( struct pipe_screen *screen,
    191                                struct pipe_fence_handle *fence );
    192 
    193    /**
    194     * Wait for the fence to finish.
    195     * \param timeout  in nanoseconds
    196     */
    197    boolean (*fence_finish)( struct pipe_screen *screen,
    198                             struct pipe_fence_handle *fence,
    199                             uint64_t timeout );
    200 
    201 };
    202 
    203 
    204 #ifdef __cplusplus
    205 }
    206 #endif
    207 
    208 #endif /* P_SCREEN_H */
    209