Go to most recent revision | Details | 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" |
||
36 | #include "util/u_debug.h" |
||
37 | #include "util/u_math.h" |
||
38 | |||
39 | #include "adreno_common.xml.h" |
||
40 | #include "adreno_pm4.xml.h" |
||
41 | |||
42 | enum adreno_rb_depth_format fd_pipe2depth(enum pipe_format format); |
||
43 | enum pc_di_index_size fd_pipe2index(enum pipe_format format); |
||
44 | enum adreno_rb_blend_factor fd_blend_factor(unsigned factor); |
||
45 | enum adreno_rb_blend_opcode fd_blend_func(unsigned func); |
||
46 | enum adreno_pa_su_sc_draw fd_polygon_mode(unsigned mode); |
||
47 | enum adreno_stencil_op fd_stencil_op(unsigned op); |
||
48 | |||
49 | |||
50 | #define FD_DBG_MSGS 0x1 |
||
51 | #define FD_DBG_DISASM 0x2 |
||
52 | #define FD_DBG_DCLEAR 0x4 |
||
53 | #define FD_DBG_DGMEM 0x8 |
||
54 | extern int fd_mesa_debug; |
||
55 | |||
56 | #define DBG(fmt, ...) \ |
||
57 | do { if (fd_mesa_debug & FD_DBG_MSGS) \ |
||
58 | debug_printf("%s:%d: "fmt "\n", \ |
||
59 | __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0) |
||
60 | |||
61 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) |
||
62 | |||
63 | /* for conditionally setting boolean flag(s): */ |
||
64 | #define COND(bool, val) ((bool) ? (val) : 0) |
||
65 | |||
66 | #define CP_REG(reg) ((0x4 << 16) | ((unsigned int)((reg) - (0x2000)))) |
||
67 | |||
68 | static inline uint32_t DRAW(enum pc_di_primtype prim_type, |
||
69 | enum pc_di_src_sel source_select, enum pc_di_index_size index_size, |
||
70 | enum pc_di_vis_cull_mode vis_cull_mode) |
||
71 | { |
||
72 | return (prim_type << 0) | |
||
73 | (source_select << 6) | |
||
74 | ((index_size & 1) << 11) | |
||
75 | ((index_size >> 1) << 13) | |
||
76 | (vis_cull_mode << 9) | |
||
77 | (1 << 14); |
||
78 | } |
||
79 | |||
80 | #define LOG_DWORDS 0 |
||
81 | |||
82 | |||
83 | static inline void |
||
84 | OUT_RING(struct fd_ringbuffer *ring, uint32_t data) |
||
85 | { |
||
86 | if (LOG_DWORDS) { |
||
87 | DBG("ring[%p]: OUT_RING %04x: %08x", ring, |
||
88 | (uint32_t)(ring->cur - ring->last_start), data); |
||
89 | } |
||
90 | *(ring->cur++) = data; |
||
91 | } |
||
92 | |||
93 | static inline void |
||
94 | OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo, |
||
95 | uint32_t offset, uint32_t or) |
||
96 | { |
||
97 | if (LOG_DWORDS) { |
||
98 | DBG("ring[%p]: OUT_RELOC %04x: %p+%u", ring, |
||
99 | (uint32_t)(ring->cur - ring->last_start), bo, offset); |
||
100 | } |
||
101 | fd_ringbuffer_emit_reloc(ring, bo, offset, or); |
||
102 | } |
||
103 | |||
104 | /* shifted reloc: */ |
||
105 | static inline void |
||
106 | OUT_RELOCS(struct fd_ringbuffer *ring, struct fd_bo *bo, |
||
107 | uint32_t offset, uint32_t or, int32_t shift) |
||
108 | { |
||
109 | if (LOG_DWORDS) { |
||
110 | DBG("ring[%p]: OUT_RELOCS %04x: %p+%u << %d", ring, |
||
111 | (uint32_t)(ring->cur - ring->last_start), bo, offset, shift); |
||
112 | } |
||
113 | fd_ringbuffer_emit_reloc_shift(ring, bo, offset, or, shift); |
||
114 | } |
||
115 | |||
116 | static inline void BEGIN_RING(struct fd_ringbuffer *ring, uint32_t ndwords) |
||
117 | { |
||
118 | if ((ring->cur + ndwords) >= ring->end) { |
||
119 | /* this probably won't really work if we have multiple tiles.. |
||
120 | * but it is ok for 2d.. we might need different behavior |
||
121 | * depending on 2d or 3d pipe. |
||
122 | */ |
||
123 | DBG("uh oh.."); |
||
124 | } |
||
125 | } |
||
126 | |||
127 | static inline void |
||
128 | OUT_PKT0(struct fd_ringbuffer *ring, uint16_t regindx, uint16_t cnt) |
||
129 | { |
||
130 | BEGIN_RING(ring, cnt+1); |
||
131 | OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF)); |
||
132 | } |
||
133 | |||
134 | static inline void |
||
135 | OUT_PKT3(struct fd_ringbuffer *ring, uint8_t opcode, uint16_t cnt) |
||
136 | { |
||
137 | BEGIN_RING(ring, cnt+1); |
||
138 | OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8)); |
||
139 | } |
||
140 | |||
141 | static inline void |
||
142 | OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, |
||
143 | struct fd_ringmarker *end) |
||
144 | { |
||
145 | OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2); |
||
146 | fd_ringbuffer_emit_reloc_ring(ring, start); |
||
147 | OUT_RING(ring, fd_ringmarker_dwords(start, end)); |
||
148 | } |
||
149 | |||
150 | #endif /* FREEDRENO_UTIL_H_ */><>><>><>><>><>><>><>><>><>><>><> |