Rev 4358 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ |
2 | |||
3 | /* |
||
4 | * Copyright (C) 2012 Rob Clark |
||
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 |
||
27 | */ |
||
28 | |||
29 | #ifndef FREEDRENO_UTIL_H_ |
||
30 | #define FREEDRENO_UTIL_H_ |
||
31 | |||
32 | #include |
||
33 | #include |
||
34 | |||
35 | #include "pipe/p_format.h" |
||
4401 | Serge | 36 | #include "pipe/p_state.h" |
4358 | Serge | 37 | #include "util/u_debug.h" |
38 | #include "util/u_math.h" |
||
4401 | Serge | 39 | #include "util/u_half.h" |
4358 | Serge | 40 | |
41 | #include "adreno_common.xml.h" |
||
42 | #include "adreno_pm4.xml.h" |
||
43 | |||
44 | enum adreno_rb_depth_format fd_pipe2depth(enum pipe_format format); |
||
45 | enum pc_di_index_size fd_pipe2index(enum pipe_format format); |
||
46 | enum adreno_rb_blend_factor fd_blend_factor(unsigned factor); |
||
47 | enum adreno_rb_blend_opcode fd_blend_func(unsigned func); |
||
48 | enum adreno_pa_su_sc_draw fd_polygon_mode(unsigned mode); |
||
49 | enum adreno_stencil_op fd_stencil_op(unsigned op); |
||
50 | |||
51 | |||
4401 | Serge | 52 | #define FD_DBG_MSGS 0x01 |
53 | #define FD_DBG_DISASM 0x02 |
||
54 | #define FD_DBG_DCLEAR 0x04 |
||
55 | #define FD_DBG_DGMEM 0x08 |
||
56 | #define FD_DBG_DSCIS 0x10 |
||
4358 | Serge | 57 | extern int fd_mesa_debug; |
58 | |||
59 | #define DBG(fmt, ...) \ |
||
60 | do { if (fd_mesa_debug & FD_DBG_MSGS) \ |
||
61 | debug_printf("%s:%d: "fmt "\n", \ |
||
62 | __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0) |
||
63 | |||
64 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) |
||
65 | |||
66 | /* for conditionally setting boolean flag(s): */ |
||
67 | #define COND(bool, val) ((bool) ? (val) : 0) |
||
68 | |||
69 | #define CP_REG(reg) ((0x4 << 16) | ((unsigned int)((reg) - (0x2000)))) |
||
70 | |||
71 | static inline uint32_t DRAW(enum pc_di_primtype prim_type, |
||
72 | enum pc_di_src_sel source_select, enum pc_di_index_size index_size, |
||
73 | enum pc_di_vis_cull_mode vis_cull_mode) |
||
74 | { |
||
75 | return (prim_type << 0) | |
||
76 | (source_select << 6) | |
||
77 | ((index_size & 1) << 11) | |
||
78 | ((index_size >> 1) << 13) | |
||
79 | (vis_cull_mode << 9) | |
||
80 | (1 << 14); |
||
81 | } |
||
82 | |||
4401 | Serge | 83 | |
84 | static inline enum pipe_format |
||
85 | pipe_surface_format(struct pipe_surface *psurf) |
||
86 | { |
||
87 | if (!psurf) |
||
88 | return PIPE_FORMAT_NONE; |
||
89 | return psurf->format; |
||
90 | } |
||
91 | |||
4358 | Serge | 92 | #define LOG_DWORDS 0 |
93 | |||
94 | |||
95 | static inline void |
||
96 | OUT_RING(struct fd_ringbuffer *ring, uint32_t data) |
||
97 | { |
||
98 | if (LOG_DWORDS) { |
||
99 | DBG("ring[%p]: OUT_RING %04x: %08x", ring, |
||
100 | (uint32_t)(ring->cur - ring->last_start), data); |
||
101 | } |
||
102 | *(ring->cur++) = data; |
||
103 | } |
||
104 | |||
105 | static inline void |
||
106 | OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo, |
||
4401 | Serge | 107 | uint32_t offset, uint32_t or, int32_t shift) |
4358 | Serge | 108 | { |
109 | if (LOG_DWORDS) { |
||
4401 | Serge | 110 | DBG("ring[%p]: OUT_RELOC %04x: %p+%u << %d", ring, |
111 | (uint32_t)(ring->cur - ring->last_start), bo, offset, shift); |
||
4358 | Serge | 112 | } |
4401 | Serge | 113 | fd_ringbuffer_reloc(ring, &(struct fd_reloc){ |
114 | .bo = bo, |
||
115 | .flags = FD_RELOC_READ, |
||
116 | .offset = offset, |
||
117 | .or = or, |
||
118 | .shift = shift, |
||
119 | }); |
||
4358 | Serge | 120 | } |
121 | |||
122 | static inline void |
||
4401 | Serge | 123 | OUT_RELOCW(struct fd_ringbuffer *ring, struct fd_bo *bo, |
4358 | Serge | 124 | uint32_t offset, uint32_t or, int32_t shift) |
125 | { |
||
126 | if (LOG_DWORDS) { |
||
4401 | Serge | 127 | DBG("ring[%p]: OUT_RELOC %04x: %p+%u << %d", ring, |
4358 | Serge | 128 | (uint32_t)(ring->cur - ring->last_start), bo, offset, shift); |
129 | } |
||
4401 | Serge | 130 | fd_ringbuffer_reloc(ring, &(struct fd_reloc){ |
131 | .bo = bo, |
||
132 | .flags = FD_RELOC_READ | FD_RELOC_WRITE, |
||
133 | .offset = offset, |
||
134 | .or = or, |
||
135 | .shift = shift, |
||
136 | }); |
||
4358 | Serge | 137 | } |
138 | |||
139 | static inline void BEGIN_RING(struct fd_ringbuffer *ring, uint32_t ndwords) |
||
140 | { |
||
141 | if ((ring->cur + ndwords) >= ring->end) { |
||
142 | /* this probably won't really work if we have multiple tiles.. |
||
143 | * but it is ok for 2d.. we might need different behavior |
||
144 | * depending on 2d or 3d pipe. |
||
145 | */ |
||
146 | DBG("uh oh.."); |
||
147 | } |
||
148 | } |
||
149 | |||
150 | static inline void |
||
151 | OUT_PKT0(struct fd_ringbuffer *ring, uint16_t regindx, uint16_t cnt) |
||
152 | { |
||
153 | BEGIN_RING(ring, cnt+1); |
||
154 | OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF)); |
||
155 | } |
||
156 | |||
157 | static inline void |
||
158 | OUT_PKT3(struct fd_ringbuffer *ring, uint8_t opcode, uint16_t cnt) |
||
159 | { |
||
160 | BEGIN_RING(ring, cnt+1); |
||
161 | OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8)); |
||
162 | } |
||
163 | |||
164 | static inline void |
||
165 | OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, |
||
166 | struct fd_ringmarker *end) |
||
167 | { |
||
168 | OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2); |
||
4401 | Serge | 169 | fd_ringbuffer_emit_reloc_ring(ring, start, end); |
4358 | Serge | 170 | OUT_RING(ring, fd_ringmarker_dwords(start, end)); |
171 | } |
||
172 | |||
173 | #endif /* FREEDRENO_UTIL_H_ */><>><>><>><>><>><>><>><>><>><>><>><> |