1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ 2 3 /* 4 * Copyright (C) 2012 Rob Clark <robclark (at) freedesktop.org> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the next 14 * paragraph) shall be included in all copies or substantial portions of the 15 * Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 * 25 * Authors: 26 * Rob Clark <robclark (at) freedesktop.org> 27 */ 28 29 #ifndef FREEDRENO_SCREEN_H_ 30 #define FREEDRENO_SCREEN_H_ 31 32 #include <freedreno_drmif.h> 33 #include <freedreno_ringbuffer.h> 34 35 #include "pipe/p_screen.h" 36 #include "util/u_memory.h" 37 #include "util/slab.h" 38 #include "os/os_thread.h" 39 40 #include "freedreno_batch_cache.h" 41 #include "freedreno_util.h" 42 43 struct fd_bo; 44 45 struct 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 uint32_t gmemsize_bytes; 63 uint32_t device_id; 64 uint32_t gpu_id; /* 220, 305, etc */ 65 uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */ 66 uint32_t max_freq; 67 uint32_t max_rts; /* max # of render targets */ 68 uint32_t gmem_alignw, gmem_alignh; 69 uint32_t num_vsc_pipes; 70 uint32_t priority_mask; 71 bool has_timestamp; 72 73 void *compiler; /* currently unused for a2xx */ 74 75 struct fd_device *dev; 76 77 /* NOTE: we still need a pipe associated with the screen in a few 78 * places, like screen->get_timestamp(). For anything context 79 * related, use ctx->pipe instead. 80 */ 81 struct fd_pipe *pipe; 82 83 uint32_t (*setup_slices)(struct fd_resource *rsc); 84 unsigned (*tile_mode)(const struct pipe_resource *prsc); 85 86 int64_t cpu_gpu_time_delta; 87 88 struct fd_batch_cache batch_cache; 89 90 bool reorder; 91 }; 92 93 static inline struct fd_screen * 94 fd_screen(struct pipe_screen *pscreen) 95 { 96 return (struct fd_screen *)pscreen; 97 } 98 99 boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen, 100 struct fd_bo *bo, 101 unsigned stride, 102 struct winsys_handle *whandle); 103 struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen, 104 struct winsys_handle *whandle); 105 106 struct pipe_screen * fd_screen_create(struct fd_device *dev); 107 108 /* is a3xx patch revision 0? */ 109 /* TODO a306.0 probably doesn't need this.. be more clever?? */ 110 static inline boolean 111 is_a3xx_p0(struct fd_screen *screen) 112 { 113 return (screen->chip_id & 0xff0000ff) == 0x03000000; 114 } 115 116 static inline boolean 117 is_a3xx(struct fd_screen *screen) 118 { 119 return (screen->gpu_id >= 300) && (screen->gpu_id < 400); 120 } 121 122 static inline boolean 123 is_a4xx(struct fd_screen *screen) 124 { 125 return (screen->gpu_id >= 400) && (screen->gpu_id < 500); 126 } 127 128 static inline boolean 129 is_a5xx(struct fd_screen *screen) 130 { 131 return (screen->gpu_id >= 500) && (screen->gpu_id < 600); 132 } 133 134 /* is it using the ir3 compiler (shader isa introduced with a3xx)? */ 135 static inline boolean 136 is_ir3(struct fd_screen *screen) 137 { 138 return is_a3xx(screen) || is_a4xx(screen) || is_a5xx(screen); 139 } 140 141 static inline bool 142 has_compute(struct fd_screen *screen) 143 { 144 return is_a5xx(screen); 145 } 146 147 #endif /* FREEDRENO_SCREEN_H_ */ 148