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 42 struct fd_bo; 43 44 struct fd_screen { 45 struct pipe_screen base; 46 47 pipe_mutex lock; 48 49 /* it would be tempting to use pipe_reference here, but that 50 * really doesn't work well if it isn't the first member of 51 * the struct, so not quite so awesome to be adding refcnting 52 * further down the inheritance hierarchy: 53 */ 54 int refcnt; 55 56 /* place for winsys to stash it's own stuff: */ 57 void *winsys_priv; 58 59 struct slab_parent_pool transfer_pool; 60 61 uint32_t gmemsize_bytes; 62 uint32_t device_id; 63 uint32_t gpu_id; /* 220, 305, etc */ 64 uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */ 65 uint32_t max_freq; 66 uint32_t max_rts; /* max # of render targets */ 67 uint32_t gmem_alignw, gmem_alignh; 68 bool has_timestamp; 69 70 void *compiler; /* currently unused for a2xx */ 71 72 struct fd_device *dev; 73 struct fd_pipe *pipe; 74 75 int64_t cpu_gpu_time_delta; 76 77 struct fd_batch_cache batch_cache; 78 79 bool reorder; 80 }; 81 82 static inline struct fd_screen * 83 fd_screen(struct pipe_screen *pscreen) 84 { 85 return (struct fd_screen *)pscreen; 86 } 87 88 boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen, 89 struct fd_bo *bo, 90 unsigned stride, 91 struct winsys_handle *whandle); 92 struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen, 93 struct winsys_handle *whandle); 94 95 struct pipe_screen * fd_screen_create(struct fd_device *dev); 96 97 /* is a3xx patch revision 0? */ 98 /* TODO a306.0 probably doesn't need this.. be more clever?? */ 99 static inline boolean 100 is_a3xx_p0(struct fd_screen *screen) 101 { 102 return (screen->chip_id & 0xff0000ff) == 0x03000000; 103 } 104 105 static inline boolean 106 is_a3xx(struct fd_screen *screen) 107 { 108 return (screen->gpu_id >= 300) && (screen->gpu_id < 400); 109 } 110 111 static inline boolean 112 is_a4xx(struct fd_screen *screen) 113 { 114 return (screen->gpu_id >= 400) && (screen->gpu_id < 500); 115 } 116 117 static inline boolean 118 is_a5xx(struct fd_screen *screen) 119 { 120 return (screen->gpu_id >= 500) && (screen->gpu_id < 600); 121 } 122 123 /* is it using the ir3 compiler (shader isa introduced with a3xx)? */ 124 static inline boolean 125 is_ir3(struct fd_screen *screen) 126 { 127 return is_a3xx(screen) || is_a4xx(screen) || is_a5xx(screen); 128 } 129 130 #endif /* FREEDRENO_SCREEN_H_ */ 131