1/*
2 * Copyright © 2014 Broadcom
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
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24#ifndef VC4_SCREEN_H
25#define VC4_SCREEN_H
26
27#include "pipe/p_screen.h"
28#include "renderonly/renderonly.h"
29#include "os/os_thread.h"
30#include "frontend/drm_driver.h"
31#include "util/list.h"
32#include "util/slab.h"
33
34#ifndef DRM_VC4_PARAM_SUPPORTS_ETC1
35#define DRM_VC4_PARAM_SUPPORTS_ETC1		4
36#endif
37
38struct vc4_bo;
39
40#define VC4_DEBUG_CL        0x0001
41#define VC4_DEBUG_QPU       0x0002
42#define VC4_DEBUG_QIR       0x0004
43#define VC4_DEBUG_TGSI      0x0008
44#define VC4_DEBUG_SHADERDB  0x0010
45#define VC4_DEBUG_PERF      0x0020
46#define VC4_DEBUG_NORAST    0x0040
47#define VC4_DEBUG_ALWAYS_FLUSH 0x0080
48#define VC4_DEBUG_ALWAYS_SYNC  0x0100
49#define VC4_DEBUG_NIR       0x0200
50#define VC4_DEBUG_DUMP      0x0400
51#define VC4_DEBUG_SURFACE   0x0800
52
53#define VC4_MAX_MIP_LEVELS 12
54#define VC4_MAX_TEXTURE_SAMPLERS 16
55
56struct vc4_simulator_file;
57
58struct vc4_screen {
59        struct pipe_screen base;
60        struct renderonly *ro;
61
62        int fd;
63
64        int v3d_ver;
65
66        const char *name;
67
68        /** The last seqno we've completed a wait for.
69         *
70         * This lets us slightly optimize our waits by skipping wait syscalls
71         * if we know the job's already done.
72         */
73        uint64_t finished_seqno;
74
75        struct slab_parent_pool transfer_pool;
76
77        struct vc4_bo_cache {
78                /** List of struct vc4_bo freed, by age. */
79                struct list_head time_list;
80                /** List of struct vc4_bo freed, per size, by age. */
81                struct list_head *size_list;
82                uint32_t size_list_size;
83
84                mtx_t lock;
85
86                uint32_t bo_size;
87                uint32_t bo_count;
88        } bo_cache;
89
90        struct hash_table *bo_handles;
91        mtx_t bo_handles_mutex;
92
93        uint32_t bo_size;
94        uint32_t bo_count;
95        uint32_t prim_types;
96        bool has_control_flow;
97        bool has_etc1;
98        bool has_threaded_fs;
99        bool has_madvise;
100        bool has_tiling_ioctl;
101        bool has_perfmon_ioctl;
102        bool has_syncobj;
103
104        struct vc4_simulator_file *sim_file;
105};
106
107static inline struct vc4_screen *
108vc4_screen(struct pipe_screen *screen)
109{
110        return (struct vc4_screen *)screen;
111}
112
113struct pipe_screen *vc4_screen_create(int fd, struct renderonly *ro);
114
115const void *
116vc4_screen_get_compiler_options(struct pipe_screen *pscreen,
117                                enum pipe_shader_ir ir,
118                                enum pipe_shader_type shader);
119
120extern uint32_t vc4_debug;
121
122void
123vc4_fence_screen_init(struct vc4_screen *screen);
124
125struct vc4_fence *
126vc4_fence_create(struct vc4_screen *screen, uint64_t seqno, int fd);
127
128#endif /* VC4_SCREEN_H */
129