Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5563 serge 1
/*
2
 * Copyright 2010 Marek Olšák 
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
#ifndef R600_RESOURCE_H
24
#define R600_RESOURCE_H
25
 
26
#include "../../winsys/radeon/drm/radeon_winsys.h"
27
#include "util/u_range.h"
28
 
29
struct r600_screen;
30
 
31
/* flag to indicate a resource is to be used as a transfer so should not be tiled */
32
#define R600_RESOURCE_FLAG_TRANSFER		PIPE_RESOURCE_FLAG_DRV_PRIV
33
#define R600_RESOURCE_FLAG_FLUSHED_DEPTH	(PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
34
#define R600_RESOURCE_FLAG_FORCE_TILING		(PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
35
 
36
struct r600_resource {
37
	struct u_resource		b;
38
 
39
	/* Winsys objects. */
40
	struct pb_buffer		*buf;
41
	struct radeon_winsys_cs_handle	*cs_buf;
42
 
43
	/* Resource state. */
44
	enum radeon_bo_domain		domains;
45
 
46
	/* The buffer range which is initialized (with a write transfer,
47
	 * streamout, DMA, or as a random access target). The rest of
48
	 * the buffer is considered invalid and can be mapped unsynchronized.
49
	 *
50
	 * This allows unsychronized mapping of a buffer range which hasn't
51
	 * been used yet. It's for applications which forget to use
52
	 * the unsynchronized map flag and expect the driver to figure it out.
53
         */
54
	struct util_range		valid_buffer_range;
55
};
56
 
57
struct r600_transfer {
58
	struct pipe_transfer		transfer;
59
	struct r600_resource		*staging;
60
	unsigned			offset;
61
};
62
 
63
struct compute_memory_item;
64
 
65
struct r600_resource_global {
66
	struct r600_resource base;
67
	struct compute_memory_item *chunk;
68
};
69
 
70
struct r600_texture {
71
	struct r600_resource		resource;
72
 
73
	unsigned			array_mode[PIPE_MAX_TEXTURE_LEVELS];
74
	unsigned			pitch_override;
75
	unsigned			size;
76
	bool				non_disp_tiling;
77
	bool				is_depth;
78
	bool				is_rat;
79
	unsigned			dirty_level_mask; /* each bit says if that mipmap is compressed */
80
	struct r600_texture		*flushed_depth_texture;
81
	boolean				is_flushing_texture;
82
	struct radeon_surface		surface;
83
 
84
	/* FMASK and CMASK can only be used with MSAA textures for now.
85
	 * MSAA textures cannot have mipmaps. */
86
	unsigned			fmask_offset, fmask_size, fmask_bank_height;
87
	unsigned			fmask_slice_tile_max;
88
	unsigned			cmask_offset, cmask_size;
89
	unsigned			cmask_slice_tile_max;
90
 
91
	struct r600_resource		*htile;
92
	/* use htile only for first level */
93
	float				depth_clear;
94
 
95
	unsigned			color_clear_value[2];
96
};
97
 
98
#define R600_TEX_IS_TILED(tex, level) ((tex)->array_mode[level] != V_038000_ARRAY_LINEAR_GENERAL && (tex)->array_mode[level] != V_038000_ARRAY_LINEAR_ALIGNED)
99
 
100
struct r600_fmask_info {
101
	unsigned size;
102
	unsigned alignment;
103
	unsigned bank_height;
104
	unsigned slice_tile_max;
105
};
106
 
107
struct r600_cmask_info {
108
	unsigned size;
109
	unsigned alignment;
110
	unsigned slice_tile_max;
111
};
112
 
113
struct r600_surface {
114
	struct pipe_surface		base;
115
 
116
	bool color_initialized;
117
	bool depth_initialized;
118
 
119
	/* Misc. color flags. */
120
	bool alphatest_bypass;
121
	bool export_16bpc;
122
 
123
	/* Color registers. */
124
	unsigned cb_color_info;
125
	unsigned cb_color_base;
126
	unsigned cb_color_view;
127
	unsigned cb_color_size;		/* R600 only */
128
	unsigned cb_color_dim;		/* EG only */
129
	unsigned cb_color_pitch;	/* EG only */
130
	unsigned cb_color_slice;	/* EG only */
131
	unsigned cb_color_attrib;	/* EG only */
132
	unsigned cb_color_fmask;	/* CB_COLORn_FMASK (EG) or CB_COLORn_FRAG (r600) */
133
	unsigned cb_color_fmask_slice;	/* EG only */
134
	unsigned cb_color_cmask;	/* CB_COLORn_CMASK (EG) or CB_COLORn_TILE (r600) */
135
	unsigned cb_color_cmask_slice;	/* EG only */
136
	unsigned cb_color_mask;		/* R600 only */
137
	struct r600_resource *cb_buffer_fmask; /* Used for FMASK relocations. R600 only */
138
	struct r600_resource *cb_buffer_cmask; /* Used for CMASK relocations. R600 only */
139
 
140
	/* DB registers. */
141
	unsigned db_depth_info;		/* DB_Z_INFO (EG) or DB_DEPTH_INFO (r600) */
142
	unsigned db_depth_base;		/* DB_Z_READ/WRITE_BASE (EG) or DB_DEPTH_BASE (r600) */
143
	unsigned db_depth_view;
144
	unsigned db_depth_size;
145
	unsigned db_depth_slice;	/* EG only */
146
	unsigned db_stencil_base;	/* EG only */
147
	unsigned db_stencil_info;	/* EG only */
148
	unsigned db_prefetch_limit;	/* R600 only */
149
	unsigned pa_su_poly_offset_db_fmt_cntl;
150
 
151
	unsigned			htile_enabled;
152
	unsigned			db_htile_surface;
153
	unsigned			db_htile_data_base;
154
	unsigned			db_preload_control;
155
};
156
 
157
/* Return if the depth format can be read without the DB->CB copy on r6xx-r7xx. */
158
static INLINE bool r600_can_read_depth(struct r600_texture *rtex)
159
{
160
	return rtex->resource.b.b.nr_samples <= 1 &&
161
	       (rtex->resource.b.b.format == PIPE_FORMAT_Z16_UNORM ||
162
		rtex->resource.b.b.format == PIPE_FORMAT_Z32_FLOAT);
163
}
164
 
165
void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
166
void r600_init_screen_resource_functions(struct pipe_screen *screen);
167
 
168
/* r600_texture */
169
void r600_texture_get_fmask_info(struct r600_screen *rscreen,
170
				 struct r600_texture *rtex,
171
				 unsigned nr_samples,
172
				 struct r600_fmask_info *out);
173
void r600_texture_get_cmask_info(struct r600_screen *rscreen,
174
				 struct r600_texture *rtex,
175
				 struct r600_cmask_info *out);
176
struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
177
					const struct pipe_resource *templ);
178
struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
179
						const struct pipe_resource *base,
180
						struct winsys_handle *whandle);
181
 
182
static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
183
{
184
	return (struct r600_resource*)r;
185
}
186
 
187
bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
188
				     struct pipe_resource *texture,
189
				     struct r600_texture **staging);
190
 
191
#endif