Home | History | Annotate | Download | only in radeon
      1 /*
      2  * Copyright 2008 Corbin Simpson <MostAwesomeDude (at) gmail.com>
      3  * Copyright 2010 Marek Olk <maraeo (at) gmail.com>
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * on the rights to use, copy, modify, merge, publish, distribute, sub
      9  * license, and/or sell copies of the Software, and to permit persons to whom
     10  * the Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * 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 NON-INFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     22  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
     23 
     24 #ifndef RADEON_WINSYS_H
     25 #define RADEON_WINSYS_H
     26 
     27 /* The public winsys interface header for the radeon driver. */
     28 
     29 #include "pipebuffer/pb_buffer.h"
     30 
     31 #include "amd/common/amd_family.h"
     32 
     33 #define RADEON_FLUSH_ASYNC		(1 << 0)
     34 #define RADEON_FLUSH_END_OF_FRAME       (1 << 1)
     35 
     36 /* Tiling flags. */
     37 enum radeon_bo_layout {
     38     RADEON_LAYOUT_LINEAR = 0,
     39     RADEON_LAYOUT_TILED,
     40     RADEON_LAYOUT_SQUARETILED,
     41 
     42     RADEON_LAYOUT_UNKNOWN
     43 };
     44 
     45 enum radeon_bo_domain { /* bitfield */
     46     RADEON_DOMAIN_GTT  = 2,
     47     RADEON_DOMAIN_VRAM = 4,
     48     RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT
     49 };
     50 
     51 enum radeon_bo_flag { /* bitfield */
     52     RADEON_FLAG_GTT_WC =        (1 << 0),
     53     RADEON_FLAG_CPU_ACCESS =    (1 << 1),
     54     RADEON_FLAG_NO_CPU_ACCESS = (1 << 2),
     55     RADEON_FLAG_HANDLE =        (1 << 3), /* the buffer most not be suballocated */
     56 };
     57 
     58 enum radeon_bo_usage { /* bitfield */
     59     RADEON_USAGE_READ = 2,
     60     RADEON_USAGE_WRITE = 4,
     61     RADEON_USAGE_READWRITE = RADEON_USAGE_READ | RADEON_USAGE_WRITE,
     62 
     63     /* The winsys ensures that the CS submission will be scheduled after
     64      * previously flushed CSs referencing this BO in a conflicting way.
     65      */
     66     RADEON_USAGE_SYNCHRONIZED = 8
     67 };
     68 
     69 enum ring_type {
     70     RING_GFX = 0,
     71     RING_COMPUTE,
     72     RING_DMA,
     73     RING_UVD,
     74     RING_VCE,
     75     RING_LAST,
     76 };
     77 
     78 enum radeon_value_id {
     79     RADEON_REQUESTED_VRAM_MEMORY,
     80     RADEON_REQUESTED_GTT_MEMORY,
     81     RADEON_MAPPED_VRAM,
     82     RADEON_MAPPED_GTT,
     83     RADEON_BUFFER_WAIT_TIME_NS,
     84     RADEON_TIMESTAMP,
     85     RADEON_NUM_GFX_IBS,
     86     RADEON_NUM_SDMA_IBS,
     87     RADEON_NUM_BYTES_MOVED,
     88     RADEON_NUM_EVICTIONS,
     89     RADEON_VRAM_USAGE,
     90     RADEON_GTT_USAGE,
     91     RADEON_GPU_TEMPERATURE, /* DRM 2.42.0 */
     92     RADEON_CURRENT_SCLK,
     93     RADEON_CURRENT_MCLK,
     94     RADEON_GPU_RESET_COUNTER, /* DRM 2.43.0 */
     95 };
     96 
     97 /* Each group of four has the same priority. */
     98 enum radeon_bo_priority {
     99     RADEON_PRIO_FENCE = 0,
    100     RADEON_PRIO_TRACE,
    101     RADEON_PRIO_SO_FILLED_SIZE,
    102     RADEON_PRIO_QUERY,
    103 
    104     RADEON_PRIO_IB1 = 4, /* main IB submitted to the kernel */
    105     RADEON_PRIO_IB2, /* IB executed with INDIRECT_BUFFER */
    106     RADEON_PRIO_DRAW_INDIRECT,
    107     RADEON_PRIO_INDEX_BUFFER,
    108 
    109     RADEON_PRIO_VCE = 8,
    110     RADEON_PRIO_UVD,
    111     RADEON_PRIO_SDMA_BUFFER,
    112     RADEON_PRIO_SDMA_TEXTURE,
    113 
    114     RADEON_PRIO_CP_DMA = 12,
    115 
    116     RADEON_PRIO_CONST_BUFFER = 16,
    117     RADEON_PRIO_DESCRIPTORS,
    118     RADEON_PRIO_BORDER_COLORS,
    119 
    120     RADEON_PRIO_SAMPLER_BUFFER = 20,
    121     RADEON_PRIO_VERTEX_BUFFER,
    122 
    123     RADEON_PRIO_SHADER_RW_BUFFER = 24,
    124     RADEON_PRIO_COMPUTE_GLOBAL,
    125 
    126     RADEON_PRIO_SAMPLER_TEXTURE = 28,
    127     RADEON_PRIO_SHADER_RW_IMAGE,
    128 
    129     RADEON_PRIO_SAMPLER_TEXTURE_MSAA = 32,
    130 
    131     RADEON_PRIO_COLOR_BUFFER = 36,
    132 
    133     RADEON_PRIO_DEPTH_BUFFER = 40,
    134 
    135     RADEON_PRIO_COLOR_BUFFER_MSAA = 44,
    136 
    137     RADEON_PRIO_DEPTH_BUFFER_MSAA = 48,
    138 
    139     RADEON_PRIO_CMASK = 52,
    140     RADEON_PRIO_DCC,
    141     RADEON_PRIO_HTILE,
    142     RADEON_PRIO_SHADER_BINARY, /* the hw can't hide instruction cache misses */
    143 
    144     RADEON_PRIO_SHADER_RINGS = 56,
    145 
    146     RADEON_PRIO_SCRATCH_BUFFER = 60,
    147     /* 63 is the maximum value */
    148 };
    149 
    150 struct winsys_handle;
    151 struct radeon_winsys_ctx;
    152 
    153 struct radeon_winsys_cs_chunk {
    154     unsigned cdw;  /* Number of used dwords. */
    155     unsigned max_dw; /* Maximum number of dwords. */
    156     uint32_t *buf; /* The base pointer of the chunk. */
    157 };
    158 
    159 struct radeon_winsys_cs {
    160     struct radeon_winsys_cs_chunk current;
    161     struct radeon_winsys_cs_chunk *prev;
    162     unsigned                      num_prev; /* Number of previous chunks. */
    163     unsigned                      max_prev; /* Space in array pointed to by prev. */
    164     unsigned                      prev_dw; /* Total number of dwords in previous chunks. */
    165 
    166     /* Memory usage of the buffer list. These are always 0 for CE and preamble
    167      * IBs. */
    168     uint64_t                      used_vram;
    169     uint64_t                      used_gart;
    170 };
    171 
    172 struct radeon_info {
    173     /* PCI info: domain:bus:dev:func */
    174     uint32_t                    pci_domain;
    175     uint32_t                    pci_bus;
    176     uint32_t                    pci_dev;
    177     uint32_t                    pci_func;
    178 
    179     /* Device info. */
    180     uint32_t                    pci_id;
    181     enum radeon_family          family;
    182     enum chip_class             chip_class;
    183     uint32_t                    gart_page_size;
    184     uint64_t                    gart_size;
    185     uint64_t                    vram_size;
    186     uint64_t                    max_alloc_size;
    187     uint32_t                    min_alloc_size;
    188     bool                        has_dedicated_vram;
    189     bool                        has_virtual_memory;
    190     bool                        gfx_ib_pad_with_type2;
    191     bool                        has_sdma;
    192     bool                        has_uvd;
    193     uint32_t                    uvd_fw_version;
    194     uint32_t                    vce_fw_version;
    195     uint32_t                    me_fw_version;
    196     uint32_t                    pfp_fw_version;
    197     uint32_t                    ce_fw_version;
    198     uint32_t                    vce_harvest_config;
    199     uint32_t                    clock_crystal_freq;
    200 
    201     /* Kernel info. */
    202     uint32_t                    drm_major; /* version */
    203     uint32_t                    drm_minor;
    204     uint32_t                    drm_patchlevel;
    205     bool                        has_userptr;
    206 
    207     /* Shader cores. */
    208     uint32_t                    r600_max_quad_pipes; /* wave size / 16 */
    209     uint32_t                    max_shader_clock;
    210     uint32_t                    num_good_compute_units;
    211     uint32_t                    max_se; /* shader engines */
    212     uint32_t                    max_sh_per_se; /* shader arrays per shader engine */
    213 
    214     /* Render backends (color + depth blocks). */
    215     uint32_t                    r300_num_gb_pipes;
    216     uint32_t                    r300_num_z_pipes;
    217     uint32_t                    r600_gb_backend_map; /* R600 harvest config */
    218     bool                        r600_gb_backend_map_valid;
    219     uint32_t                    r600_num_banks;
    220     uint32_t                    num_render_backends;
    221     uint32_t                    num_tile_pipes; /* pipe count from PIPE_CONFIG */
    222     uint32_t                    pipe_interleave_bytes;
    223     uint32_t                    enabled_rb_mask; /* GCN harvest config */
    224 
    225     /* Tile modes. */
    226     uint32_t                    si_tile_mode_array[32];
    227     uint32_t                    cik_macrotile_mode_array[16];
    228 };
    229 
    230 /* Tiling info for display code, DRI sharing, and other data. */
    231 struct radeon_bo_metadata {
    232     /* Tiling flags describing the texture layout for display code
    233      * and DRI sharing.
    234      */
    235     enum radeon_bo_layout   microtile;
    236     enum radeon_bo_layout   macrotile;
    237     unsigned                pipe_config;
    238     unsigned                bankw;
    239     unsigned                bankh;
    240     unsigned                tile_split;
    241     unsigned                mtilea;
    242     unsigned                num_banks;
    243     unsigned                stride;
    244     bool                    scanout;
    245 
    246     /* Additional metadata associated with the buffer, in bytes.
    247      * The maximum size is 64 * 4. This is opaque for the winsys & kernel.
    248      * Supported by amdgpu only.
    249      */
    250     uint32_t                size_metadata;
    251     uint32_t                metadata[64];
    252 };
    253 
    254 enum radeon_feature_id {
    255     RADEON_FID_R300_HYPERZ_ACCESS,     /* ZMask + HiZ */
    256     RADEON_FID_R300_CMASK_ACCESS,
    257 };
    258 
    259 #define RADEON_SURF_MAX_LEVELS                  15
    260 
    261 enum radeon_surf_mode {
    262     RADEON_SURF_MODE_LINEAR_ALIGNED = 1,
    263     RADEON_SURF_MODE_1D = 2,
    264     RADEON_SURF_MODE_2D = 3,
    265 };
    266 
    267 /* These are defined exactly like GB_TILE_MODEn.MICRO_TILE_MODE_NEW. */
    268 enum radeon_micro_mode {
    269     RADEON_MICRO_MODE_DISPLAY = 0,
    270     RADEON_MICRO_MODE_THIN = 1,
    271     RADEON_MICRO_MODE_DEPTH = 2,
    272     RADEON_MICRO_MODE_ROTATED = 3,
    273 };
    274 
    275 /* the first 16 bits are reserved for libdrm_radeon, don't use them */
    276 #define RADEON_SURF_SCANOUT                     (1 << 16)
    277 #define RADEON_SURF_ZBUFFER                     (1 << 17)
    278 #define RADEON_SURF_SBUFFER                     (1 << 18)
    279 #define RADEON_SURF_Z_OR_SBUFFER                (RADEON_SURF_ZBUFFER | RADEON_SURF_SBUFFER)
    280 /* bits 19 and 20 are reserved for libdrm_radeon, don't use them */
    281 #define RADEON_SURF_FMASK                       (1 << 21)
    282 #define RADEON_SURF_DISABLE_DCC                 (1 << 22)
    283 #define RADEON_SURF_TC_COMPATIBLE_HTILE         (1 << 23)
    284 #define RADEON_SURF_IMPORTED                    (1 << 24)
    285 #define RADEON_SURF_OPTIMIZE_FOR_SPACE          (1 << 25)
    286 
    287 struct radeon_surf_level {
    288     uint64_t                    offset;
    289     uint64_t                    slice_size;
    290     uint64_t                    dcc_offset;
    291     uint64_t                    dcc_fast_clear_size;
    292     uint16_t                    nblk_x;
    293     uint16_t                    nblk_y;
    294     enum radeon_surf_mode       mode;
    295 };
    296 
    297 struct radeon_surf {
    298     /* Format properties. */
    299     unsigned                    blk_w:4;
    300     unsigned                    blk_h:4;
    301     unsigned                    bpe:5;
    302     /* Number of mipmap levels where DCC is enabled starting from level 0.
    303      * Non-zero levels may be disabled due to alignment constraints, but not
    304      * the first level.
    305      */
    306     unsigned                    num_dcc_levels:4;
    307     unsigned                    is_linear:1;
    308     uint32_t                    flags;
    309 
    310     /* These are return values. Some of them can be set by the caller, but
    311      * they will be treated as hints (e.g. bankw, bankh) and might be
    312      * changed by the calculator.
    313      */
    314     uint64_t                    surf_size;
    315     uint64_t                    dcc_size;
    316     uint64_t                    htile_size;
    317 
    318     uint32_t                    surf_alignment;
    319     uint32_t                    dcc_alignment;
    320     uint32_t                    htile_alignment;
    321 
    322     /* This applies to EG and later. */
    323     unsigned                    bankw:4;  /* max 8 */
    324     unsigned                    bankh:4;  /* max 8 */
    325     unsigned                    mtilea:4; /* max 8 */
    326     unsigned                    tile_split:13;         /* max 4K */
    327     unsigned                    stencil_tile_split:13; /* max 4K */
    328     unsigned                    pipe_config:5;      /* max 17 */
    329     unsigned                    num_banks:5;        /* max 16 */
    330     unsigned                    macro_tile_index:4; /* max 15 */
    331     unsigned                    micro_tile_mode:3; /* displayable, thin, depth, rotated */
    332 
    333     /* Whether the depth miptree or stencil miptree as used by the DB are
    334      * adjusted from their TC compatible form to ensure depth/stencil
    335      * compatibility. If either is true, the corresponding plane cannot be
    336      * sampled from.
    337      */
    338     unsigned                    depth_adjusted:1;
    339     unsigned                    stencil_adjusted:1;
    340 
    341     struct radeon_surf_level    level[RADEON_SURF_MAX_LEVELS];
    342     struct radeon_surf_level    stencil_level[RADEON_SURF_MAX_LEVELS];
    343     uint8_t                     tiling_index[RADEON_SURF_MAX_LEVELS];
    344     uint8_t                     stencil_tiling_index[RADEON_SURF_MAX_LEVELS];
    345 };
    346 
    347 struct radeon_bo_list_item {
    348     uint64_t bo_size;
    349     uint64_t vm_address;
    350     uint64_t priority_usage; /* mask of (1 << RADEON_PRIO_*) */
    351 };
    352 
    353 struct radeon_winsys {
    354     /**
    355      * The screen object this winsys was created for
    356      */
    357     struct pipe_screen *screen;
    358 
    359     /**
    360      * Decrement the winsys reference count.
    361      *
    362      * \param ws  The winsys this function is called for.
    363      * \return    True if the winsys and screen should be destroyed.
    364      */
    365     bool (*unref)(struct radeon_winsys *ws);
    366 
    367     /**
    368      * Destroy this winsys.
    369      *
    370      * \param ws        The winsys this function is called from.
    371      */
    372     void (*destroy)(struct radeon_winsys *ws);
    373 
    374     /**
    375      * Query an info structure from winsys.
    376      *
    377      * \param ws        The winsys this function is called from.
    378      * \param info      Return structure
    379      */
    380     void (*query_info)(struct radeon_winsys *ws,
    381                        struct radeon_info *info);
    382 
    383     /**************************************************************************
    384      * Buffer management. Buffer attributes are mostly fixed over its lifetime.
    385      *
    386      * Remember that gallium gets to choose the interface it needs, and the
    387      * window systems must then implement that interface (rather than the
    388      * other way around...).
    389      *************************************************************************/
    390 
    391     /**
    392      * Create a buffer object.
    393      *
    394      * \param ws        The winsys this function is called from.
    395      * \param size      The size to allocate.
    396      * \param alignment An alignment of the buffer in memory.
    397      * \param use_reusable_pool Whether the cache buffer manager should be used.
    398      * \param domain    A bitmask of the RADEON_DOMAIN_* flags.
    399      * \return          The created buffer object.
    400      */
    401     struct pb_buffer *(*buffer_create)(struct radeon_winsys *ws,
    402                                        uint64_t size,
    403                                        unsigned alignment,
    404                                        enum radeon_bo_domain domain,
    405                                        enum radeon_bo_flag flags);
    406 
    407     /**
    408      * Map the entire data store of a buffer object into the client's address
    409      * space.
    410      *
    411      * \param buf       A winsys buffer object to map.
    412      * \param cs        A command stream to flush if the buffer is referenced by it.
    413      * \param usage     A bitmask of the PIPE_TRANSFER_* flags.
    414      * \return          The pointer at the beginning of the buffer.
    415      */
    416     void *(*buffer_map)(struct pb_buffer *buf,
    417                         struct radeon_winsys_cs *cs,
    418                         enum pipe_transfer_usage usage);
    419 
    420     /**
    421      * Unmap a buffer object from the client's address space.
    422      *
    423      * \param buf       A winsys buffer object to unmap.
    424      */
    425     void (*buffer_unmap)(struct pb_buffer *buf);
    426 
    427     /**
    428      * Wait for the buffer and return true if the buffer is not used
    429      * by the device.
    430      *
    431      * The timeout of 0 will only return the status.
    432      * The timeout of PIPE_TIMEOUT_INFINITE will always wait until the buffer
    433      * is idle.
    434      */
    435     bool (*buffer_wait)(struct pb_buffer *buf, uint64_t timeout,
    436                         enum radeon_bo_usage usage);
    437 
    438     /**
    439      * Return buffer metadata.
    440      * (tiling info for display code, DRI sharing, and other data)
    441      *
    442      * \param buf       A winsys buffer object to get the flags from.
    443      * \param md        Metadata
    444      */
    445     void (*buffer_get_metadata)(struct pb_buffer *buf,
    446                                 struct radeon_bo_metadata *md);
    447 
    448     /**
    449      * Set buffer metadata.
    450      * (tiling info for display code, DRI sharing, and other data)
    451      *
    452      * \param buf       A winsys buffer object to set the flags for.
    453      * \param md        Metadata
    454      */
    455     void (*buffer_set_metadata)(struct pb_buffer *buf,
    456                                 struct radeon_bo_metadata *md);
    457 
    458     /**
    459      * Get a winsys buffer from a winsys handle. The internal structure
    460      * of the handle is platform-specific and only a winsys should access it.
    461      *
    462      * \param ws        The winsys this function is called from.
    463      * \param whandle   A winsys handle pointer as was received from a state
    464      *                  tracker.
    465      * \param stride    The returned buffer stride in bytes.
    466      */
    467     struct pb_buffer *(*buffer_from_handle)(struct radeon_winsys *ws,
    468                                             struct winsys_handle *whandle,
    469                                             unsigned *stride, unsigned *offset);
    470 
    471     /**
    472      * Get a winsys buffer from a user pointer. The resulting buffer can't
    473      * be exported. Both pointer and size must be page aligned.
    474      *
    475      * \param ws        The winsys this function is called from.
    476      * \param pointer   User pointer to turn into a buffer object.
    477      * \param Size      Size in bytes for the new buffer.
    478      */
    479     struct pb_buffer *(*buffer_from_ptr)(struct radeon_winsys *ws,
    480                                          void *pointer, uint64_t size);
    481 
    482     /**
    483      * Whether the buffer was created from a user pointer.
    484      *
    485      * \param buf       A winsys buffer object
    486      * \return          whether \p buf was created via buffer_from_ptr
    487      */
    488     bool (*buffer_is_user_ptr)(struct pb_buffer *buf);
    489 
    490     /**
    491      * Get a winsys handle from a winsys buffer. The internal structure
    492      * of the handle is platform-specific and only a winsys should access it.
    493      *
    494      * \param buf       A winsys buffer object to get the handle from.
    495      * \param whandle   A winsys handle pointer.
    496      * \param stride    A stride of the buffer in bytes, for texturing.
    497      * \return          true on success.
    498      */
    499     bool (*buffer_get_handle)(struct pb_buffer *buf,
    500                               unsigned stride, unsigned offset,
    501                               unsigned slice_size,
    502                               struct winsys_handle *whandle);
    503 
    504     /**
    505      * Return the virtual address of a buffer.
    506      *
    507      * When virtual memory is not in use, this is the offset relative to the
    508      * relocation base (non-zero for sub-allocated buffers).
    509      *
    510      * \param buf       A winsys buffer object
    511      * \return          virtual address
    512      */
    513     uint64_t (*buffer_get_virtual_address)(struct pb_buffer *buf);
    514 
    515     /**
    516      * Return the offset of this buffer relative to the relocation base.
    517      * This is only non-zero for sub-allocated buffers.
    518      *
    519      * This is only supported in the radeon winsys, since amdgpu uses virtual
    520      * addresses in submissions even for the video engines.
    521      *
    522      * \param buf      A winsys buffer object
    523      * \return         the offset for relocations
    524      */
    525     unsigned (*buffer_get_reloc_offset)(struct pb_buffer *buf);
    526 
    527     /**
    528      * Query the initial placement of the buffer from the kernel driver.
    529      */
    530     enum radeon_bo_domain (*buffer_get_initial_domain)(struct pb_buffer *buf);
    531 
    532     /**************************************************************************
    533      * Command submission.
    534      *
    535      * Each pipe context should create its own command stream and submit
    536      * commands independently of other contexts.
    537      *************************************************************************/
    538 
    539     /**
    540      * Create a command submission context.
    541      * Various command streams can be submitted to the same context.
    542      */
    543     struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws);
    544 
    545     /**
    546      * Destroy a context.
    547      */
    548     void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
    549 
    550     /**
    551      * Query a GPU reset status.
    552      */
    553     enum pipe_reset_status (*ctx_query_reset_status)(struct radeon_winsys_ctx *ctx);
    554 
    555     /**
    556      * Create a command stream.
    557      *
    558      * \param ctx       The submission context
    559      * \param ring_type The ring type (GFX, DMA, UVD)
    560      * \param flush     Flush callback function associated with the command stream.
    561      * \param user      User pointer that will be passed to the flush callback.
    562      */
    563     struct radeon_winsys_cs *(*cs_create)(struct radeon_winsys_ctx *ctx,
    564                                           enum ring_type ring_type,
    565                                           void (*flush)(void *ctx, unsigned flags,
    566 							struct pipe_fence_handle **fence),
    567                                           void *flush_ctx);
    568 
    569     /**
    570      * Add a constant engine IB to a graphics CS. This makes the graphics CS
    571      * from "cs_create" a group of two IBs that share a buffer list and are
    572      * flushed together.
    573      *
    574      * The returned constant CS is only a stream for writing packets to the new
    575      * IB. Calling other winsys functions with it is not allowed, not even
    576      * "cs_destroy".
    577      *
    578      * In order to add buffers and check memory usage, use the graphics CS.
    579      * In order to flush it, use the graphics CS, which will flush both IBs.
    580      * Destroying the graphics CS will destroy both of them.
    581      *
    582      * \param cs  The graphics CS from "cs_create" that will hold the buffer
    583      *            list and will be used for flushing.
    584      */
    585     struct radeon_winsys_cs *(*cs_add_const_ib)(struct radeon_winsys_cs *cs);
    586 
    587      /**
    588      * Add a constant engine preamble IB to a graphics CS. This add an extra IB
    589      * in similar manner to cs_add_const_ib. This should always be called after
    590      * cs_add_const_ib.
    591      *
    592      * The returned IB is a constant engine IB that only gets flushed if the
    593      * context changed.
    594      *
    595      * \param cs  The graphics CS from "cs_create" that will hold the buffer
    596      *            list and will be used for flushing.
    597      */
    598     struct radeon_winsys_cs *(*cs_add_const_preamble_ib)(struct radeon_winsys_cs *cs);
    599     /**
    600      * Destroy a command stream.
    601      *
    602      * \param cs        A command stream to destroy.
    603      */
    604     void (*cs_destroy)(struct radeon_winsys_cs *cs);
    605 
    606     /**
    607      * Add a buffer. Each buffer used by a CS must be added using this function.
    608      *
    609      * \param cs      Command stream
    610      * \param buf     Buffer
    611      * \param usage   Whether the buffer is used for read and/or write.
    612      * \param domain  Bitmask of the RADEON_DOMAIN_* flags.
    613      * \param priority  A higher number means a greater chance of being
    614      *                  placed in the requested domain. 15 is the maximum.
    615      * \return Buffer index.
    616      */
    617     unsigned (*cs_add_buffer)(struct radeon_winsys_cs *cs,
    618                              struct pb_buffer *buf,
    619                              enum radeon_bo_usage usage,
    620                              enum radeon_bo_domain domain,
    621                              enum radeon_bo_priority priority);
    622 
    623     /**
    624      * Return the index of an already-added buffer.
    625      *
    626      * Not supported on amdgpu. Drivers with GPUVM should not care about
    627      * buffer indices.
    628      *
    629      * \param cs        Command stream
    630      * \param buf       Buffer
    631      * \return          The buffer index, or -1 if the buffer has not been added.
    632      */
    633     int (*cs_lookup_buffer)(struct radeon_winsys_cs *cs,
    634                             struct pb_buffer *buf);
    635 
    636     /**
    637      * Return true if there is enough memory in VRAM and GTT for the buffers
    638      * added so far. If the validation fails, all buffers which have
    639      * been added since the last call of cs_validate will be removed and
    640      * the CS will be flushed (provided there are still any buffers).
    641      *
    642      * \param cs        A command stream to validate.
    643      */
    644     bool (*cs_validate)(struct radeon_winsys_cs *cs);
    645 
    646     /**
    647      * Check whether the given number of dwords is available in the IB.
    648      * Optionally chain a new chunk of the IB if necessary and supported.
    649      *
    650      * \param cs        A command stream.
    651      * \param dw        Number of CS dwords requested by the caller.
    652      */
    653     bool (*cs_check_space)(struct radeon_winsys_cs *cs, unsigned dw);
    654 
    655     /**
    656      * Return the buffer list.
    657      *
    658      * This is the buffer list as passed to the kernel, i.e. it only contains
    659      * the parent buffers of sub-allocated buffers.
    660      *
    661      * \param cs    Command stream
    662      * \param list  Returned buffer list. Set to NULL to query the count only.
    663      * \return      The buffer count.
    664      */
    665     unsigned (*cs_get_buffer_list)(struct radeon_winsys_cs *cs,
    666                                    struct radeon_bo_list_item *list);
    667 
    668     /**
    669      * Flush a command stream.
    670      *
    671      * \param cs          A command stream to flush.
    672      * \param flags,      RADEON_FLUSH_ASYNC or 0.
    673      * \param fence       Pointer to a fence. If non-NULL, a fence is inserted
    674      *                    after the CS and is returned through this parameter.
    675      * \return Negative POSIX error code or 0 for success.
    676      *         Asynchronous submissions never return an error.
    677      */
    678     int (*cs_flush)(struct radeon_winsys_cs *cs,
    679                     unsigned flags,
    680                     struct pipe_fence_handle **fence);
    681 
    682     /**
    683      * Create a fence before the CS is flushed.
    684      * The user must flush manually to complete the initializaton of the fence.
    685      * The fence must not be used before the flush.
    686      */
    687     struct pipe_fence_handle *(*cs_get_next_fence)(struct radeon_winsys_cs *cs);
    688 
    689     /**
    690      * Return true if a buffer is referenced by a command stream.
    691      *
    692      * \param cs        A command stream.
    693      * \param buf       A winsys buffer.
    694      */
    695     bool (*cs_is_buffer_referenced)(struct radeon_winsys_cs *cs,
    696                                     struct pb_buffer *buf,
    697                                     enum radeon_bo_usage usage);
    698 
    699     /**
    700      * Request access to a feature for a command stream.
    701      *
    702      * \param cs        A command stream.
    703      * \param fid       Feature ID, one of RADEON_FID_*
    704      * \param enable    Whether to enable or disable the feature.
    705      */
    706     bool (*cs_request_feature)(struct radeon_winsys_cs *cs,
    707                                enum radeon_feature_id fid,
    708                                bool enable);
    709      /**
    710       * Make sure all asynchronous flush of the cs have completed
    711       *
    712       * \param cs        A command stream.
    713       */
    714     void (*cs_sync_flush)(struct radeon_winsys_cs *cs);
    715 
    716     /**
    717      * Wait for the fence and return true if the fence has been signalled.
    718      * The timeout of 0 will only return the status.
    719      * The timeout of PIPE_TIMEOUT_INFINITE will always wait until the fence
    720      * is signalled.
    721      */
    722     bool (*fence_wait)(struct radeon_winsys *ws,
    723                        struct pipe_fence_handle *fence,
    724                        uint64_t timeout);
    725 
    726     /**
    727      * Reference counting for fences.
    728      */
    729     void (*fence_reference)(struct pipe_fence_handle **dst,
    730                             struct pipe_fence_handle *src);
    731 
    732     /**
    733      * Initialize surface
    734      *
    735      * \param ws        The winsys this function is called from.
    736      * \param tex       Input texture description
    737      * \param flags     Bitmask of RADEON_SURF_* flags
    738      * \param bpe       Bytes per pixel, it can be different for Z buffers.
    739      * \param mode      Preferred tile mode. (linear, 1D, or 2D)
    740      * \param surf      Output structure
    741      */
    742     int (*surface_init)(struct radeon_winsys *ws,
    743                         const struct pipe_resource *tex,
    744                         unsigned flags, unsigned bpe,
    745                         enum radeon_surf_mode mode,
    746                         struct radeon_surf *surf);
    747 
    748     uint64_t (*query_value)(struct radeon_winsys *ws,
    749                             enum radeon_value_id value);
    750 
    751     bool (*read_registers)(struct radeon_winsys *ws, unsigned reg_offset,
    752                            unsigned num_registers, uint32_t *out);
    753 };
    754 
    755 static inline bool radeon_emitted(struct radeon_winsys_cs *cs, unsigned num_dw)
    756 {
    757     return cs && (cs->prev_dw + cs->current.cdw > num_dw);
    758 }
    759 
    760 static inline void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
    761 {
    762     cs->current.buf[cs->current.cdw++] = value;
    763 }
    764 
    765 static inline void radeon_emit_array(struct radeon_winsys_cs *cs,
    766 				     const uint32_t *values, unsigned count)
    767 {
    768     memcpy(cs->current.buf + cs->current.cdw, values, count * 4);
    769     cs->current.cdw += count;
    770 }
    771 
    772 #endif
    773