summaryrefslogtreecommitdiff
path: root/radeon_atom.h
blob: 9caeb73fa7d64c5d006c7bb9a41cd9ecd5d73cd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Copyright © 2010 Jerome Glisse <glisse@freedesktop.org>
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 */
#ifndef RADEON_ATOM_H
#define RADEON_ATOM_H

#include "r600_winsys.h"

struct radeon_device;
struct radeon_ib;
struct radeon_atom;

struct radeon_atom_flush {
	struct list_head	list;
	u32			flags;
	struct radeon_bo	*bo;
};

typedef int (*radeon_atom_emit_t)(struct radeon_device*,
					struct radeon_atom*,
					void *data,
					struct radeon_ib*);
typedef int (*radeon_atom_process_t)(struct radeon_device*,
					struct radeon_atom*,
					u32 last_id,
					void*);
typedef void (*radeon_atom_release_t)(struct kref *kref);

struct radeon_atom {
	struct list_head	list;
	struct kref		kref;
	u32			type;
	u32			id;
	u32			nflushes;
	u32			npkts;
	u32			*pkts;
	radeon_atom_emit_t	emit;
	radeon_atom_process_t	process;
	radeon_atom_release_t	release;
};

/* R600 */
#define R600_BATCH_NATOMS	11
struct r600_batch {
	struct list_head		list;
	struct list_head		pre_flushes;
	struct list_head		post_flushes;
	struct radeon_atom		*atoms[R600_BATCH_NATOMS];
	struct radeon_atom		*emit_atoms[R600_BATCH_NATOMS];
	u32				nemit_atoms;
	u32				nflushes;
	u32				npkts;
	struct radeon_bo		*shaders;
	u32				shaders_idx;
	struct drm_r600_vs_input	inputs;
	u32				nfs_resources;
};

#define R600_SHADER_SIZE (32 * 1024)

struct r600_batches {
	struct radeon_ib		*ib;
	u32				npkts;
	struct list_head		batches;
	u32				nfs_resources;
	struct drm_r600_vs_buffer	fs_resource[160];
	u32				last_id[R600_BATCH_NATOMS];
};

struct r600_atoms {
	struct list_head	blend_atoms;
	struct list_head	cb_atoms;
	struct list_head	cb_cntl_atoms;
	struct list_head	constants_atoms;
	struct list_head	db_atoms;
	struct list_head	db_cntl_atoms;
	struct list_head	pa_atoms;
	struct list_head	sq_atoms;
	struct list_head	vport_atoms;
	struct list_head	vs_shader_atoms;
	struct list_head	ps_shader_atoms;
	struct idr		idr;
	struct mutex		mutex;
	struct r600_batches	batches;
	unsigned		npipes;
	unsigned		nbanks;
	unsigned		group_bytes;
};

extern int radeon_atom_init(struct radeon_atom *atom,
				struct idr *idp,
				radeon_atom_release_t release,
				radeon_atom_emit_t emit,
				radeon_atom_process_t process,
				u32 *pkts);
extern void radeon_atom_flush_cleanup(struct list_head *flushes);
extern int radeon_atom_flush_add(struct list_head *flushes, struct radeon_bo *bo, u32 flags);
extern int radeon_atom_find_locked(struct list_head *atoms, u32 id,
					u32 type, struct radeon_atom **atom);
extern int radeon_atom_emit_default(struct radeon_device *rdev,
					struct radeon_atom *atom,
					void *data,
					struct radeon_ib *ib);
static inline void radeon_atom_put(struct radeon_atom *atom)
{
	kref_put(&atom->kref, atom->release);
}

/* R600 */
extern void r600_shader_disassemble(u32 *bytecode, u32 ndwords);
extern int r600_shader_build_fs(struct radeon_device *rdev,
				u32 *bytecode, u32 *ndwords,
				struct drm_r600_vs_input *inputs,
				struct drm_r600_vs_shader *vs);
extern int r600_atoms_init(struct radeon_device *rdev, struct r600_atoms *atoms);
extern void r600_atoms_release(struct radeon_device *rdev, struct r600_atoms *atoms);
extern int r600_atom_create(struct radeon_device *rdev,
				struct r600_atoms *atoms,
				struct drm_radeon_atom *patom,
				struct radeon_atom **atomptr);
extern int r600_batches_queue(struct radeon_device *rdev,
				struct r600_atoms *atoms,
				struct drm_r600_batch *batch);
extern int r600_batches_flush(struct radeon_device *rdev, struct r600_atoms *atoms);
/* R700 */
extern void r700_batches_states_default(struct radeon_device *rdev, struct r600_batches *batches);

#endif