Home | History | Annotate | Download | only in pipe-loader
      1 /**************************************************************************
      2  *
      3  * Copyright 2012 Francisco Jerez
      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 VMWARE 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 Library that provides device enumeration and creation of
     30  * winsys/pipe_screen instances.
     31  */
     32 
     33 #ifndef PIPE_LOADER_H
     34 #define PIPE_LOADER_H
     35 
     36 #include "pipe/p_compiler.h"
     37 #include "state_tracker/drm_driver.h"
     38 #include "util/xmlconfig.h"
     39 
     40 #ifdef __cplusplus
     41 extern "C" {
     42 #endif
     43 
     44 struct pipe_screen;
     45 struct drisw_loader_funcs;
     46 
     47 enum pipe_loader_device_type {
     48    PIPE_LOADER_DEVICE_SOFTWARE,
     49    PIPE_LOADER_DEVICE_PCI,
     50    PIPE_LOADER_DEVICE_PLATFORM,
     51    NUM_PIPE_LOADER_DEVICE_TYPES
     52 };
     53 
     54 /**
     55  * A device known to the pipe loader.
     56  */
     57 struct pipe_loader_device {
     58    enum pipe_loader_device_type type;
     59 
     60    union {
     61       struct {
     62          int vendor_id;
     63          int chip_id;
     64       } pci;
     65    } u; /**< Discriminated by \a type */
     66 
     67    char *driver_name;
     68    const struct pipe_loader_ops *ops;
     69 
     70    driOptionCache option_cache;
     71    driOptionCache option_info;
     72 };
     73 
     74 /**
     75  * Get a list of known devices.
     76  *
     77  * \param devs Array that will be filled with pointers to the devices
     78  *             available in the system.
     79  * \param ndev Maximum number of devices to return.
     80  * \return Number of devices available in the system.
     81  */
     82 int
     83 pipe_loader_probe(struct pipe_loader_device **devs, int ndev);
     84 
     85 /**
     86  * Create a pipe_screen for the specified device.
     87  *
     88  * \param dev Device the screen will be created for.
     89  */
     90 struct pipe_screen *
     91 pipe_loader_create_screen(struct pipe_loader_device *dev);
     92 
     93 /**
     94  * Query the configuration parameters for the specified device.
     95  *
     96  * \param dev Device that will be queried.
     97  * \param conf The drm_conf id of the option to be queried.
     98  */
     99 const struct drm_conf_ret *
    100 pipe_loader_configuration(struct pipe_loader_device *dev,
    101                           enum drm_conf conf);
    102 
    103 /**
    104  * Ensure that dev->option_cache is initialized appropriately for the driver.
    105  *
    106  * This function can be called multiple times.
    107  *
    108  * \param dev Device for which options should be loaded.
    109  */
    110 void
    111 pipe_loader_load_options(struct pipe_loader_device *dev);
    112 
    113 /**
    114  * Get the driinfo XML string used by the given driver.
    115  *
    116  * The returned string is heap-allocated.
    117  */
    118 char *
    119 pipe_loader_get_driinfo_xml(const char *driver_name);
    120 
    121 /**
    122  * Release resources allocated for a list of devices.
    123  *
    124  * Should be called when the specified devices are no longer in use to
    125  * release any resources allocated by pipe_loader_probe.
    126  *
    127  * \param devs Devices to release.
    128  * \param ndev Number of devices to release.
    129  */
    130 void
    131 pipe_loader_release(struct pipe_loader_device **devs, int ndev);
    132 
    133 /**
    134  * Initialize sw dri device give the drisw_loader_funcs.
    135  *
    136  * This function is platform-specific.
    137  *
    138  * \sa pipe_loader_probe
    139  */
    140 bool
    141 pipe_loader_sw_probe_dri(struct pipe_loader_device **devs,
    142                          struct drisw_loader_funcs *drisw_lf);
    143 
    144 /**
    145  * Initialize a kms backed sw device given an fd.
    146  *
    147  * This function is platform-specific.
    148  *
    149  * \sa pipe_loader_probe
    150  */
    151 bool
    152 pipe_loader_sw_probe_kms(struct pipe_loader_device **devs, int fd);
    153 
    154 /**
    155  * Initialize a null sw device.
    156  *
    157  * This function is platform-specific.
    158  *
    159  * \sa pipe_loader_probe
    160  */
    161 bool
    162 pipe_loader_sw_probe_null(struct pipe_loader_device **devs);
    163 
    164 /**
    165  * Get a list of known software devices.
    166  *
    167  * This function is platform-specific.
    168  *
    169  * \sa pipe_loader_probe
    170  */
    171 int
    172 pipe_loader_sw_probe(struct pipe_loader_device **devs, int ndev);
    173 
    174 /**
    175  * Get a software device wrapped atop another device.
    176  *
    177  * This function is platform-specific.
    178  *
    179  * \sa pipe_loader_probe
    180  */
    181 boolean
    182 pipe_loader_sw_probe_wrapped(struct pipe_loader_device **dev,
    183                              struct pipe_screen *screen);
    184 
    185 /**
    186  * Get a list of known DRM devices.
    187  *
    188  * This function is platform-specific.
    189  *
    190  * \sa pipe_loader_probe
    191  */
    192 int
    193 pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev);
    194 
    195 /**
    196  * Initialize a DRM device in an already opened fd.
    197  *
    198  * This function is platform-specific.
    199  *
    200  * \sa pipe_loader_probe
    201  */
    202 bool
    203 pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd);
    204 
    205 /**
    206  * Get the driinfo XML used for the DRM driver of the given name, if any.
    207  *
    208  * The returned string is heap-allocated.
    209  */
    210 char *
    211 pipe_loader_drm_get_driinfo_xml(const char *driver_name);
    212 
    213 extern const char gallium_driinfo_xml[];
    214 
    215 #ifdef __cplusplus
    216 }
    217 #endif
    218 
    219 #endif /* PIPE_LOADER_H */
    220