Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2011 Marek Olšák <maraeo@gmail.com>
  3.  * All Rights Reserved.
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining
  6.  * a copy of this software and associated documentation files (the
  7.  * "Software"), to deal in the Software without restriction, including
  8.  * without limitation the rights to use, copy, modify, merge, publish,
  9.  * distribute, sub license, and/or sell copies of the Software, and to
  10.  * permit persons to whom the Software is furnished to do so, subject to
  11.  * the following conditions:
  12.  *
  13.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  14.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  15.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  16.  * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
  17.  * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  20.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  21.  *
  22.  * The above copyright notice and this permission notice (including the
  23.  * next paragraph) shall be included in all copies or substantial portions
  24.  * of the Software.
  25.  */
  26.  
  27. #ifndef RADEON_DRM_CS_H
  28. #define RADEON_DRM_CS_H
  29.  
  30. #include "radeon_drm_bo.h"
  31.  
  32. struct radeon_cs_context {
  33.     uint32_t                    buf[RADEON_MAX_CMDBUF_DWORDS];
  34.  
  35.     int                         fd;
  36.     struct drm_radeon_cs        cs;
  37.     struct drm_radeon_cs_chunk  chunks[3];
  38.     uint64_t                    chunk_array[3];
  39.     uint32_t                    flags[2];
  40.  
  41.     uint32_t                    cs_trace_id;
  42.  
  43.     /* Relocs. */
  44.     unsigned                    nrelocs;
  45.     unsigned                    crelocs;
  46.     unsigned                    validated_crelocs;
  47.     struct radeon_bo            **relocs_bo;
  48.     struct drm_radeon_cs_reloc  *relocs;
  49.  
  50.     int                         reloc_indices_hashlist[512];
  51.  
  52.     uint64_t                    used_vram;
  53.     uint64_t                    used_gart;
  54. };
  55.  
  56. struct radeon_drm_cs {
  57.     struct radeon_winsys_cs base;
  58.  
  59.     /* We flip between these two CS. While one is being consumed
  60.      * by the kernel in another thread, the other one is being filled
  61.      * by the pipe driver. */
  62.     struct radeon_cs_context csc1;
  63.     struct radeon_cs_context csc2;
  64.     /* The currently-used CS. */
  65.     struct radeon_cs_context *csc;
  66.     /* The CS being currently-owned by the other thread. */
  67.     struct radeon_cs_context *cst;
  68.  
  69.     /* The winsys. */
  70.     struct radeon_drm_winsys *ws;
  71.  
  72.     /* Flush CS. */
  73.     void (*flush_cs)(void *ctx, unsigned flags, struct pipe_fence_handle **fence);
  74.     void *flush_data;
  75.  
  76.     pipe_semaphore flush_completed;
  77.     struct radeon_bo                    *trace_buf;
  78. };
  79.  
  80. int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo);
  81.  
  82. static INLINE struct radeon_drm_cs *
  83. radeon_drm_cs(struct radeon_winsys_cs *base)
  84. {
  85.     return (struct radeon_drm_cs*)base;
  86. }
  87.  
  88. static INLINE boolean
  89. radeon_bo_is_referenced_by_cs(struct radeon_drm_cs *cs,
  90.                               struct radeon_bo *bo)
  91. {
  92.     int num_refs = bo->num_cs_references;
  93.     return num_refs == bo->rws->num_cs ||
  94.            (num_refs && radeon_get_reloc(cs->csc, bo) != -1);
  95. }
  96.  
  97. static INLINE boolean
  98. radeon_bo_is_referenced_by_cs_for_write(struct radeon_drm_cs *cs,
  99.                                         struct radeon_bo *bo)
  100. {
  101.     int index;
  102.  
  103.     if (!bo->num_cs_references)
  104.         return FALSE;
  105.  
  106.     index = radeon_get_reloc(cs->csc, bo);
  107.     if (index == -1)
  108.         return FALSE;
  109.  
  110.     return cs->csc->relocs[index].write_domain != 0;
  111. }
  112.  
  113. static INLINE boolean
  114. radeon_bo_is_referenced_by_any_cs(struct radeon_bo *bo)
  115. {
  116.     return bo->num_cs_references != 0;
  117. }
  118.  
  119. void radeon_drm_cs_sync_flush(struct radeon_winsys_cs *rcs);
  120. void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws);
  121. void radeon_drm_cs_emit_ioctl_oneshot(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
  122.  
  123. void radeon_dump_cs_on_lockup(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
  124.  
  125. #endif
  126.