da25cdce88a49cc9be0e6e5cdeeaf8f56550b3c4
[mesa.git] / src / gallium / drivers / freedreno / a3xx / fd3_compiler.h
1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
2
3 /*
4 * Copyright (C) 2013 Rob Clark <robclark@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@freedesktop.org>
27 */
28
29 #ifndef FD3_COMPILER_H_
30 #define FD3_COMPILER_H_
31
32 #include "fd3_program.h"
33 #include "fd3_util.h"
34
35
36 /* ************************************************************************* */
37 /* split this out or find some helper to use.. like main/bitset.h.. */
38
39 #define MAX_REG 256
40
41 typedef uint8_t regmask_t[2 * MAX_REG / 8];
42
43 static inline unsigned regmask_idx(struct ir3_register *reg)
44 {
45 unsigned num = reg->num;
46 assert(num < MAX_REG);
47 if (reg->flags & IR3_REG_HALF)
48 num += MAX_REG;
49 return num;
50 }
51
52 static inline void regmask_init(regmask_t *regmask)
53 {
54 memset(regmask, 0, sizeof(*regmask));
55 }
56
57 static inline void regmask_set(regmask_t *regmask, struct ir3_register *reg)
58 {
59 unsigned idx = regmask_idx(reg);
60 unsigned i;
61 for (i = 0; i < 4; i++, idx++)
62 if (reg->wrmask & (1 << i))
63 (*regmask)[idx / 8] |= 1 << (idx % 8);
64 }
65
66 static inline unsigned regmask_get(regmask_t *regmask,
67 struct ir3_register *reg)
68 {
69 unsigned idx = regmask_idx(reg);
70 unsigned i;
71 for (i = 0; i < 4; i++, idx++)
72 if (reg->wrmask & (1 << i))
73 if ((*regmask)[idx / 8] & (1 << (idx % 8)))
74 return true;
75 return false;
76 }
77
78 /* comp:
79 * 0 - x
80 * 1 - y
81 * 2 - z
82 * 3 - w
83 */
84 static inline uint32_t regid(int num, int comp)
85 {
86 return (num << 2) | (comp & 0x3);
87 }
88
89 /* ************************************************************************* */
90
91 int fd3_compile_shader(struct fd3_shader_stateobj *so,
92 const struct tgsi_token *tokens);
93
94 #endif /* FD3_COMPILER_H_ */