1/* 2 * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robclark@freedesktop.org> 25 */ 26 27#ifndef FREEDRENO_SCREEN_H_ 28#define FREEDRENO_SCREEN_H_ 29 30#include "drm/freedreno_drmif.h" 31#include "drm/freedreno_ringbuffer.h" 32 33#include "pipe/p_screen.h" 34#include "util/u_memory.h" 35#include "util/slab.h" 36#include "os/os_thread.h" 37#include "renderonly/renderonly.h" 38 39#include "freedreno_batch_cache.h" 40#include "freedreno_perfcntr.h" 41#include "freedreno_util.h" 42 43struct fd_bo; 44 45struct fd_screen { 46 struct pipe_screen base; 47 48 mtx_t lock; 49 50 /* it would be tempting to use pipe_reference here, but that 51 * really doesn't work well if it isn't the first member of 52 * the struct, so not quite so awesome to be adding refcnting 53 * further down the inheritance hierarchy: 54 */ 55 int refcnt; 56 57 /* place for winsys to stash it's own stuff: */ 58 void *winsys_priv; 59 60 struct slab_parent_pool transfer_pool; 61 62 uint64_t gmem_base; 63 uint32_t gmemsize_bytes; 64 uint32_t device_id; 65 uint32_t gpu_id; /* 220, 305, etc */ 66 uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */ 67 uint32_t max_freq; 68 uint32_t ram_size; 69 uint32_t max_rts; /* max # of render targets */ 70 uint32_t gmem_alignw, gmem_alignh; 71 uint32_t num_vsc_pipes; 72 uint32_t priority_mask; 73 bool has_timestamp; 74 bool has_robustness; 75 76 unsigned num_perfcntr_groups; 77 const struct fd_perfcntr_group *perfcntr_groups; 78 79 /* generated at startup from the perfcntr groups: */ 80 unsigned num_perfcntr_queries; 81 struct pipe_driver_query_info *perfcntr_queries; 82 83 void *compiler; /* currently unused for a2xx */ 84 85 struct fd_device *dev; 86 87 /* NOTE: we still need a pipe associated with the screen in a few 88 * places, like screen->get_timestamp(). For anything context 89 * related, use ctx->pipe instead. 90 */ 91 struct fd_pipe *pipe; 92 93 uint32_t (*fill_ubwc_buffer_sizes)(struct fd_resource *rsc); 94 uint32_t (*setup_slices)(struct fd_resource *rsc); 95 unsigned (*tile_mode)(const struct pipe_resource *prsc); 96 97 int64_t cpu_gpu_time_delta; 98 99 struct fd_batch_cache batch_cache; 100 101 bool reorder; 102 103 uint16_t rsc_seqno; 104 105 unsigned num_supported_modifiers; 106 const uint64_t *supported_modifiers; 107 108 struct renderonly *ro; 109}; 110 111static inline struct fd_screen * 112fd_screen(struct pipe_screen *pscreen) 113{ 114 return (struct fd_screen *)pscreen; 115} 116 117boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen, 118 struct fd_bo *bo, 119 struct renderonly_scanout *scanout, 120 unsigned stride, 121 struct winsys_handle *whandle); 122struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen, 123 struct winsys_handle *whandle); 124 125struct pipe_screen * 126fd_screen_create(struct fd_device *dev, struct renderonly *ro); 127 128static inline boolean 129is_a20x(struct fd_screen *screen) 130{ 131 return (screen->gpu_id >= 200) && (screen->gpu_id < 210); 132} 133 134static inline boolean 135is_a2xx(struct fd_screen *screen) 136{ 137 return (screen->gpu_id >= 200) && (screen->gpu_id < 300); 138} 139 140/* is a3xx patch revision 0? */ 141/* TODO a306.0 probably doesn't need this.. be more clever?? */ 142static inline boolean 143is_a3xx_p0(struct fd_screen *screen) 144{ 145 return (screen->chip_id & 0xff0000ff) == 0x03000000; 146} 147 148static inline boolean 149is_a3xx(struct fd_screen *screen) 150{ 151 return (screen->gpu_id >= 300) && (screen->gpu_id < 400); 152} 153 154static inline boolean 155is_a4xx(struct fd_screen *screen) 156{ 157 return (screen->gpu_id >= 400) && (screen->gpu_id < 500); 158} 159 160static inline boolean 161is_a5xx(struct fd_screen *screen) 162{ 163 return (screen->gpu_id >= 500) && (screen->gpu_id < 600); 164} 165 166static inline boolean 167is_a6xx(struct fd_screen *screen) 168{ 169 return (screen->gpu_id >= 600) && (screen->gpu_id < 700); 170} 171 172/* is it using the ir3 compiler (shader isa introduced with a3xx)? */ 173static inline boolean 174is_ir3(struct fd_screen *screen) 175{ 176 return is_a3xx(screen) || is_a4xx(screen) || is_a5xx(screen) || is_a6xx(screen); 177} 178 179static inline bool 180has_compute(struct fd_screen *screen) 181{ 182 return is_a5xx(screen) || is_a6xx(screen); 183} 184 185#endif /* FREEDRENO_SCREEN_H_ */ 186