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 
     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