Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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. #include <radeon_drm.h>
  32.  
  33. struct radeon_cs_context {
  34.     uint32_t                    buf[RADEON_MAX_CMDBUF_DWORDS];
  35.  
  36.     int                         fd;
  37.     struct drm_radeon_cs        cs;
  38.     struct drm_radeon_cs_chunk  chunks[3];
  39.     uint64_t                    chunk_array[3];
  40.     uint32_t                    flags[2];
  41.  
  42.     uint32_t                    cs_trace_id;
  43.  
  44.     /* Relocs. */
  45.     unsigned                    nrelocs;
  46.     unsigned                    crelocs;
  47.     unsigned                    validated_crelocs;
  48.     struct radeon_bo            **relocs_bo;
  49.     struct drm_radeon_cs_reloc  *relocs;
  50.  
  51.     /* 0 = BO not added, 1 = BO added */
  52.     char                        is_handle_added[512];
  53.     unsigned                    reloc_indices_hashlist[512];
  54.  
  55.     unsigned                    used_vram;
  56.     unsigned                    used_gart;
  57. };
  58.  
  59. struct radeon_drm_cs {
  60.     struct radeon_winsys_cs base;
  61.  
  62.     /* We flip between these two CS. While one is being consumed
  63.      * by the kernel in another thread, the other one is being filled
  64.      * by the pipe driver. */
  65.     struct radeon_cs_context csc1;
  66.     struct radeon_cs_context csc2;
  67.     /* The currently-used CS. */
  68.     struct radeon_cs_context *csc;
  69.     /* The CS being currently-owned by the other thread. */
  70.     struct radeon_cs_context *cst;
  71.  
  72.     /* The winsys. */
  73.     struct radeon_drm_winsys *ws;
  74.  
  75.     /* Flush CS. */
  76.     void (*flush_cs)(void *ctx, unsigned flags);
  77.     void *flush_data;
  78.  
  79.     int flush_started;
  80.     pipe_semaphore flush_completed;
  81.     struct radeon_bo                    *trace_buf;
  82. };
  83.  
  84. int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo);
  85.  
  86. static INLINE struct radeon_drm_cs *
  87. radeon_drm_cs(struct radeon_winsys_cs *base)
  88. {
  89.     return (struct radeon_drm_cs*)base;
  90. }
  91.  
  92. static INLINE boolean
  93. radeon_bo_is_referenced_by_cs(struct radeon_drm_cs *cs,
  94.                               struct radeon_bo *bo)
  95. {
  96.     int num_refs = bo->num_cs_references;
  97.     return num_refs == bo->rws->num_cs ||
  98.            (num_refs && radeon_get_reloc(cs->csc, bo) != -1);
  99. }
  100.  
  101. static INLINE boolean
  102. radeon_bo_is_referenced_by_cs_for_write(struct radeon_drm_cs *cs,
  103.                                         struct radeon_bo *bo)
  104. {
  105.     int index;
  106.  
  107.     if (!bo->num_cs_references)
  108.         return FALSE;
  109.  
  110.     index = radeon_get_reloc(cs->csc, bo);
  111.     if (index == -1)
  112.         return FALSE;
  113.  
  114.     return cs->csc->relocs[index].write_domain != 0;
  115. }
  116.  
  117. static INLINE boolean
  118. radeon_bo_is_referenced_by_any_cs(struct radeon_bo *bo)
  119. {
  120.     return bo->num_cs_references != 0;
  121. }
  122.  
  123. void radeon_drm_cs_sync_flush(struct radeon_winsys_cs *rcs);
  124. void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws);
  125. void radeon_drm_cs_emit_ioctl_oneshot(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
  126.  
  127. void radeon_dump_cs_on_lockup(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
  128.  
  129. #endif
  130.