Home | History | Annotate | Download | only in freedreno
      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