20
20
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21
21
* USE OR OTHER DEALINGS IN THE SOFTWARE. */
24
* This file contains macros for immediate command submission.
26
#include "util/u_math.h"
28
30
#include "r300_reg.h"
30
#include "radeon_winsys.h"
31
#include "r300_context.h"
32
#include "r300_winsys.h"
32
34
/* Yes, I know macros are ugly. However, they are much prettier than the code
33
35
* that they neatly hide away, and don't have the cost of function setup,so
34
36
* we're going to use them. */
36
#define MAX_CS_SIZE 64 * 1024 / 4
38
#define VERY_VERBOSE_CS 1
39
#define VERY_VERBOSE_REGISTERS 1
41
/* XXX stolen from radeon_drm.h */
42
#define RADEON_GEM_DOMAIN_CPU 0x1
43
#define RADEON_GEM_DOMAIN_GTT 0x2
44
#define RADEON_GEM_DOMAIN_VRAM 0x4
46
/* XXX stolen from radeon_reg.h */
47
#define RADEON_CP_PACKET0 0x0
49
#define CP_PACKET0(register, count) \
50
(RADEON_CP_PACKET0 | ((count) << 16) | ((register) >> 2))
45
* Command submission setup.
52
48
#define CS_LOCALS(context) \
53
struct r300_context* const cs_context_copy = (context); \
54
struct radeon_winsys* cs_winsys = cs_context_copy->winsys; \
55
int cs_count = 0; (void) cs_count;
57
#define CHECK_CS(size) \
58
assert(cs_winsys->check_cs(cs_winsys, (size)))
49
struct r300_winsys_cs *cs_copy = (context)->cs; \
50
struct r300_winsys_screen *cs_winsys = (context)->rws; \
51
int cs_count = 0; (void) cs_count; (void) cs_winsys;
60
53
#define BEGIN_CS(size) do { \
62
if (VERY_VERBOSE_CS) { \
63
DBG(cs_context_copy, DBG_CS, "r300: BEGIN_CS, count %d, in %s (%s:%d)\n", \
64
size, __FUNCTION__, __FILE__, __LINE__); \
66
cs_winsys->begin_cs(cs_winsys, (size), \
67
__FILE__, __FUNCTION__, __LINE__); \
54
assert(size <= (cs_copy->ndw - cs_copy->cdw)); \
55
CS_DEBUG(cs_count = size;) \
61
debug_printf("r300: Warning: cs_count off by %d at (%s, %s:%i)\n", \
62
cs_count, __FUNCTION__, __FILE__, __LINE__); \
71
* Writing pure DWORDs.
71
74
#define OUT_CS(value) do { \
72
if (VERY_VERBOSE_CS || VERY_VERBOSE_REGISTERS) { \
73
DBG(cs_context_copy, DBG_CS, "r300: writing %08x\n", value); \
75
cs_winsys->write_cs_dword(cs_winsys, (value)); \
75
cs_copy->ptr[cs_copy->cdw++] = (value); \
76
CS_DEBUG(cs_count--;) \
79
#define OUT_CS_32F(value) do { \
80
if (VERY_VERBOSE_CS || VERY_VERBOSE_REGISTERS) { \
81
DBG(cs_context_copy, DBG_CS, "r300: writing %f\n", value); \
83
cs_winsys->write_cs_dword(cs_winsys, fui(value)); \
79
#define OUT_CS_32F(value) \
87
82
#define OUT_CS_REG(register, value) do { \
88
if (VERY_VERBOSE_REGISTERS) \
89
DBG(cs_context_copy, DBG_CS, "r300: writing 0x%08X to register 0x%04X\n", \
92
cs_winsys->write_cs_dword(cs_winsys, CP_PACKET0(register, 0)); \
93
cs_winsys->write_cs_dword(cs_winsys, value); \
83
OUT_CS(CP_PACKET0(register, 0)); \
97
87
/* Note: This expects count to be the number of registers,
98
88
* not the actual packet0 count! */
99
#define OUT_CS_REG_SEQ(register, count) do { \
100
if (VERY_VERBOSE_REGISTERS) \
101
DBG(cs_context_copy, DBG_CS, "r300: writing register sequence of %d to 0x%04X\n", \
104
cs_winsys->write_cs_dword(cs_winsys, CP_PACKET0((register), ((count) - 1))); \
108
#define OUT_CS_RELOC(bo, offset, rd, wd, flags) do { \
109
DBG(cs_context_copy, DBG_CS, "r300: writing relocation for buffer %p, offset %d, " \
110
"domains (%d, %d, %d)\n", \
111
bo, offset, rd, wd, flags); \
113
cs_winsys->write_cs_dword(cs_winsys, offset); \
114
cs_winsys->write_cs_reloc(cs_winsys, bo, rd, wd, flags); \
118
#define OUT_CS_RELOC_NO_OFFSET(bo, rd, wd, flags) do { \
119
DBG(cs_context_copy, DBG_CS, "r300: writing relocation for buffer %p, " \
120
"domains (%d, %d, %d)\n", \
121
bo, rd, wd, flags); \
123
cs_winsys->write_cs_reloc(cs_winsys, bo, rd, wd, flags); \
127
#define END_CS do { \
128
if (VERY_VERBOSE_CS) { \
129
DBG(cs_context_copy, DBG_CS, "r300: END_CS in %s (%s:%d)\n", __FUNCTION__, \
130
__FILE__, __LINE__); \
133
debug_printf("r300: Warning: cs_count off by %d\n", cs_count); \
134
cs_winsys->end_cs(cs_winsys, __FILE__, __FUNCTION__, __LINE__); \
137
#define FLUSH_CS do { \
138
if (VERY_VERBOSE_CS) { \
139
DBG(cs_context_copy, DBG_CS, "r300: FLUSH_CS in %s (%s:%d)\n\n", __FUNCTION__, \
140
__FILE__, __LINE__); \
142
cs_winsys->flush_cs(cs_winsys); \
145
#define RADEON_ONE_REG_WR (1 << 15)
147
#define OUT_CS_ONE_REG(register, count) do { \
148
if (VERY_VERBOSE_REGISTERS) \
149
DBG(cs_context_copy, DBG_CS, "r300: writing data sequence of %d to 0x%04X\n", \
152
cs_winsys->write_cs_dword(cs_winsys, CP_PACKET0((register), ((count) - 1)) | RADEON_ONE_REG_WR); \
156
#define CP_PACKET3(op, count) \
157
(RADEON_CP_PACKET3 | (op) | ((count) << 16))
159
#define OUT_CS_PKT3(op, count) do { \
160
cs_winsys->write_cs_dword(cs_winsys, CP_PACKET3(op, count)); \
164
#define OUT_CS_INDEX_RELOC(bo, offset, count, rd, wd, flags) do { \
165
DBG(cs_context_copy, DBG_CS, "r300: writing relocation for index buffer %p," \
166
"offset %d\n", bo, offset); \
168
cs_winsys->write_cs_dword(cs_winsys, offset); \
169
cs_winsys->write_cs_dword(cs_winsys, count); \
170
cs_winsys->write_cs_reloc(cs_winsys, bo, rd, wd, flags); \
89
#define OUT_CS_REG_SEQ(register, count) \
90
OUT_CS(CP_PACKET0((register), ((count) - 1)))
92
#define OUT_CS_ONE_REG(register, count) \
93
OUT_CS(CP_PACKET0((register), ((count) - 1)) | RADEON_ONE_REG_WR)
95
#define OUT_CS_PKT3(op, count) \
96
OUT_CS(CP_PACKET3(op, count))
98
#define OUT_CS_TABLE(values, count) do { \
99
memcpy(cs_copy->ptr + cs_copy->cdw, values, count * 4); \
100
cs_copy->cdw += count; \
101
CS_DEBUG(cs_count -= count;) \
106
* Writing relocations.
109
#define OUT_CS_RELOC(bo, offset, rd, wd) do { \
112
cs_winsys->cs_write_reloc(cs_copy, bo, rd, wd); \
113
CS_DEBUG(cs_count -= 2;) \
116
#define OUT_CS_BUF_RELOC(bo, offset, rd, wd) do { \
118
OUT_CS_RELOC(r300_buffer(bo)->buf, offset, rd, wd); \
121
#define OUT_CS_TEX_RELOC(tex, offset, rd, wd) do { \
123
OUT_CS_RELOC(tex->buffer, offset, rd, wd); \
126
#define OUT_CS_BUF_RELOC_NO_OFFSET(bo, rd, wd) do { \
128
cs_winsys->cs_write_reloc(cs_copy, r300_buffer(bo)->buf, rd, wd); \
129
CS_DEBUG(cs_count -= 2;) \
134
* Command buffer emission.
137
#define WRITE_CS_TABLE(values, count) do { \
138
CS_DEBUG(assert(cs_count == 0);) \
139
memcpy(cs_copy->ptr + cs_copy->cdw, (values), (count) * 4); \
140
cs_copy->cdw += (count); \
174
143
#endif /* R300_CS_H */