Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
/*
2
 * Copyright 2010 Jerome Glisse 
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
7
 * on the rights to use, copy, modify, merge, publish, distribute, sub
8
 * license, and/or sell copies of the Software, and to permit persons to whom
9
 * the Software is furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18
 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22
 *
23
 * Authors:
24
 *      Jerome Glisse
25
 */
26
#ifndef SI_PIPE_H
27
#define SI_PIPE_H
28
 
29
#include "si_state.h"
30
 
31
#include 
32
 
33
#ifdef PIPE_ARCH_BIG_ENDIAN
34
#define SI_BIG_ENDIAN 1
35
#else
36
#define SI_BIG_ENDIAN 0
37
#endif
38
 
39
/* The base vertex and primitive restart can be any number, but we must pick
40
 * one which will mean "unknown" for the purpose of state tracking and
41
 * the number shouldn't be a commonly-used one. */
42
#define SI_BASE_VERTEX_UNKNOWN INT_MIN
43
#define SI_RESTART_INDEX_UNKNOWN INT_MIN
44
#define SI_NUM_SMOOTH_AA_SAMPLES 8
45
 
46
#define SI_TRACE_CS 0
47
#define SI_TRACE_CS_DWORDS		6
48
 
49
#define SI_MAX_DRAW_CS_DWORDS \
50
	(/*scratch:*/ 3 + /*derived prim state:*/ 3 + \
51
	 /*draw regs:*/ 16 + /*draw packets:*/ 31)
52
 
53
/* Instruction cache. */
54
#define SI_CONTEXT_INV_ICACHE		(R600_CONTEXT_PRIVATE_FLAG << 0)
55
/* Cache used by scalar memory (SMEM) instructions. They also use TC
56
 * as a second level cache, which isn't flushed by this.
57
 * Other names: constant cache, data cache, DCACHE */
58
#define SI_CONTEXT_INV_KCACHE		(R600_CONTEXT_PRIVATE_FLAG << 1)
59
/* Caches used by vector memory (VMEM) instructions.
60
 * L1 can optionally be bypassed (GLC=1) and can only be used by shaders.
61
 * L2 is used by shaders and can be used by other blocks (CP, sDMA). */
62
#define SI_CONTEXT_INV_TC_L1		(R600_CONTEXT_PRIVATE_FLAG << 2)
63
#define SI_CONTEXT_INV_TC_L2		(R600_CONTEXT_PRIVATE_FLAG << 3)
64
/* Framebuffer caches. */
65
#define SI_CONTEXT_FLUSH_AND_INV_CB_META (R600_CONTEXT_PRIVATE_FLAG << 4)
66
#define SI_CONTEXT_FLUSH_AND_INV_DB_META (R600_CONTEXT_PRIVATE_FLAG << 5)
67
#define SI_CONTEXT_FLUSH_AND_INV_DB	(R600_CONTEXT_PRIVATE_FLAG << 6)
68
#define SI_CONTEXT_FLUSH_AND_INV_CB	(R600_CONTEXT_PRIVATE_FLAG << 7)
69
/* Engine synchronization. */
70
#define SI_CONTEXT_VS_PARTIAL_FLUSH	(R600_CONTEXT_PRIVATE_FLAG << 8)
71
#define SI_CONTEXT_PS_PARTIAL_FLUSH	(R600_CONTEXT_PRIVATE_FLAG << 9)
72
#define SI_CONTEXT_CS_PARTIAL_FLUSH	(R600_CONTEXT_PRIVATE_FLAG << 10)
73
#define SI_CONTEXT_VGT_FLUSH		(R600_CONTEXT_PRIVATE_FLAG << 11)
74
#define SI_CONTEXT_VGT_STREAMOUT_SYNC	(R600_CONTEXT_PRIVATE_FLAG << 12)
75
/* Compute only. */
76
#define SI_CONTEXT_FLUSH_WITH_INV_L2	(R600_CONTEXT_PRIVATE_FLAG << 13) /* TODO: merge with TC? */
77
#define SI_CONTEXT_FLAG_COMPUTE		(R600_CONTEXT_PRIVATE_FLAG << 14)
78
 
79
#define SI_CONTEXT_FLUSH_AND_INV_FRAMEBUFFER (SI_CONTEXT_FLUSH_AND_INV_CB | \
80
					      SI_CONTEXT_FLUSH_AND_INV_CB_META | \
81
					      SI_CONTEXT_FLUSH_AND_INV_DB | \
82
					      SI_CONTEXT_FLUSH_AND_INV_DB_META)
83
 
84
struct si_compute;
85
 
86
struct si_screen {
87
	struct r600_common_screen	b;
88
};
89
 
90
struct si_sampler_view {
91
	struct pipe_sampler_view	base;
92
	struct list_head		list;
93
	struct r600_resource		*resource;
94
        /* [0..7] = image descriptor
95
         * [4..7] = buffer descriptor */
96
	uint32_t			state[8];
97
	uint32_t			fmask_state[8];
98
};
99
 
100
struct si_sampler_state {
101
	uint32_t			val[4];
102
	uint32_t			border_color[4];
103
};
104
 
105
struct si_cs_shader_state {
106
	struct si_compute		*program;
107
};
108
 
109
struct si_textures_info {
110
	struct si_sampler_views		views;
111
	struct si_sampler_states	states;
112
	uint32_t			depth_texture_mask; /* which textures are depth */
113
	uint32_t			compressed_colortex_mask;
114
};
115
 
116
struct si_framebuffer {
117
	struct r600_atom		atom;
118
	struct pipe_framebuffer_state	state;
119
	unsigned			nr_samples;
120
	unsigned			log_samples;
121
	unsigned			cb0_is_integer;
122
	unsigned			compressed_cb_mask;
123
	unsigned			export_16bpc;
124
};
125
 
126
#define SI_NUM_ATOMS(sctx) (sizeof((sctx)->atoms)/sizeof((sctx)->atoms.array[0]))
127
 
128
#define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1)
129
 
130
struct si_context {
131
	struct r600_common_context	b;
132
	struct blitter_context		*blitter;
133
	void				*custom_dsa_flush;
134
	void				*custom_blend_resolve;
135
	void				*custom_blend_decompress;
136
	void				*custom_blend_fastclear;
137
	void				*pstipple_sampler_state;
138
	struct si_screen		*screen;
139
	struct si_pm4_state		*init_config;
140
 
141
	union {
142
		struct {
143
			/* The order matters. */
144
			struct r600_atom *vertex_buffers;
145
			struct r600_atom *const_buffers[SI_NUM_SHADERS];
146
			struct r600_atom *rw_buffers[SI_NUM_SHADERS];
147
			struct r600_atom *sampler_views[SI_NUM_SHADERS];
148
			struct r600_atom *sampler_states[SI_NUM_SHADERS];
149
			/* Caches must be flushed after resource descriptors are
150
			 * updated in memory. */
151
			struct r600_atom *cache_flush;
152
			struct r600_atom *streamout_begin;
153
			struct r600_atom *streamout_enable; /* must be after streamout_begin */
154
			struct r600_atom *framebuffer;
155
			struct r600_atom *msaa_sample_locs;
156
			struct r600_atom *db_render_state;
157
			struct r600_atom *msaa_config;
158
			struct r600_atom *clip_regs;
159
		} s;
160
		struct r600_atom *array[0];
161
	} atoms;
162
 
163
	struct si_framebuffer		framebuffer;
164
	struct si_vertex_element	*vertex_elements;
165
	/* for saving when using blitter */
166
	struct pipe_stencil_ref		stencil_ref;
167
	/* shaders */
168
	struct si_shader_selector	*ps_shader;
169
	struct si_shader_selector	*gs_shader;
170
	struct si_shader_selector	*vs_shader;
171
	struct si_cs_shader_state	cs_shader_state;
172
	/* shader information */
173
	unsigned			sprite_coord_enable;
174
	bool				flatshade;
175
	struct si_descriptors		vertex_buffers;
176
	struct si_buffer_resources	const_buffers[SI_NUM_SHADERS];
177
	struct si_buffer_resources	rw_buffers[SI_NUM_SHADERS];
178
	struct si_textures_info		samplers[SI_NUM_SHADERS];
179
	struct r600_resource		*scratch_buffer;
180
	struct r600_resource		*border_color_table;
181
	unsigned			border_color_offset;
182
 
183
	struct r600_atom		clip_regs;
184
	struct r600_atom		msaa_sample_locs;
185
	struct r600_atom		msaa_config;
186
	int				ps_iter_samples;
187
	bool				smoothing_enabled;
188
 
189
	/* Vertex and index buffers. */
190
	bool			vertex_buffers_dirty;
191
	struct pipe_index_buffer index_buffer;
192
	struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS];
193
 
194
	/* With rasterizer discard, there doesn't have to be a pixel shader.
195
	 * In that case, we bind this one: */
196
	void			*dummy_pixel_shader;
197
	struct si_pm4_state	*gs_on;
198
	struct si_pm4_state	*gs_off;
199
	struct si_pm4_state	*gs_rings;
200
	struct r600_atom	cache_flush;
201
	struct pipe_constant_buffer null_const_buf; /* used for set_constant_buffer(NULL) on CIK */
202
	struct pipe_resource	*esgs_ring;
203
	struct pipe_resource	*gsvs_ring;
204
 
205
	LLVMTargetMachineRef		tm;
206
 
207
	/* SI state handling */
208
	union si_state	queued;
209
	union si_state	emitted;
210
 
211
	/* DB render state. */
212
	struct r600_atom	db_render_state;
213
	bool			dbcb_depth_copy_enabled;
214
	bool			dbcb_stencil_copy_enabled;
215
	unsigned		dbcb_copy_sample;
216
	bool			db_inplace_flush_enabled;
217
	bool			db_depth_clear;
218
	bool			db_depth_disable_expclear;
219
	unsigned		ps_db_shader_control;
220
 
221
	/* Draw state. */
222
	int			last_base_vertex;
223
	int			last_start_instance;
224
	int			last_sh_base_reg;
225
	int			last_primitive_restart_en;
226
	int			last_restart_index;
227
	int			last_gs_out_prim;
228
	int			last_prim;
229
	int			last_multi_vgt_param;
230
	int			last_rast_prim;
231
	unsigned		last_sc_line_stipple;
232
	int			current_rast_prim; /* primitive type after TES, GS */
233
 
234
	/* Scratch buffer */
235
	boolean                 emit_scratch_reloc;
236
	unsigned		scratch_waves;
237
	unsigned		spi_tmpring_size;
238
};
239
 
240
/* si_blit.c */
241
void si_init_blit_functions(struct si_context *sctx);
242
void si_flush_depth_textures(struct si_context *sctx,
243
			     struct si_textures_info *textures);
244
void si_decompress_color_textures(struct si_context *sctx,
245
				  struct si_textures_info *textures);
246
void si_resource_copy_region(struct pipe_context *ctx,
247
			     struct pipe_resource *dst,
248
			     unsigned dst_level,
249
			     unsigned dstx, unsigned dsty, unsigned dstz,
250
			     struct pipe_resource *src,
251
			     unsigned src_level,
252
			     const struct pipe_box *src_box);
253
 
254
/* si_dma.c */
255
void si_dma_copy(struct pipe_context *ctx,
256
		 struct pipe_resource *dst,
257
		 unsigned dst_level,
258
		 unsigned dstx, unsigned dsty, unsigned dstz,
259
		 struct pipe_resource *src,
260
		 unsigned src_level,
261
		 const struct pipe_box *src_box);
262
 
263
/* si_hw_context.c */
264
void si_context_gfx_flush(void *context, unsigned flags,
265
			  struct pipe_fence_handle **fence);
266
void si_begin_new_cs(struct si_context *ctx);
267
void si_need_cs_space(struct si_context *ctx, unsigned num_dw, boolean count_draw_in);
268
 
269
#if SI_TRACE_CS
270
void si_trace_emit(struct si_context *sctx);
271
#endif
272
 
273
/* si_compute.c */
274
void si_init_compute_functions(struct si_context *sctx);
275
 
276
/* si_uvd.c */
277
struct pipe_video_codec *si_uvd_create_decoder(struct pipe_context *context,
278
					       const struct pipe_video_codec *templ);
279
 
280
struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe,
281
						 const struct pipe_video_buffer *tmpl);
282
 
283
/*
284
 * common helpers
285
 */
286
 
287
static INLINE struct r600_resource *
288
si_resource_create_custom(struct pipe_screen *screen,
289
			  unsigned usage, unsigned size)
290
{
291
	assert(size);
292
	return r600_resource(pipe_buffer_create(screen,
293
		PIPE_BIND_CUSTOM, usage, size));
294
}
295
 
296
static INLINE void
297
si_invalidate_draw_sh_constants(struct si_context *sctx)
298
{
299
	sctx->last_base_vertex = SI_BASE_VERTEX_UNKNOWN;
300
	sctx->last_start_instance = -1; /* reset to an unknown value */
301
	sctx->last_sh_base_reg = -1; /* reset to an unknown value */
302
}
303
 
304
#endif