1/*
2 * Copyright 2010 Marek Olšák <maraeo@gmail.com
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 "r600.h"
27
28/* flag to indicate a resource is to be used as a transfer so should not be tiled */
29#define R600_RESOURCE_FLAG_TRANSFER		PIPE_RESOURCE_FLAG_DRV_PRIV
30#define R600_RESOURCE_FLAG_FLUSHED_DEPTH	(PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
31#define R600_RESOURCE_FLAG_FORCE_TILING		(PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
32
33struct r600_transfer {
34	struct pipe_transfer		transfer;
35	struct r600_resource		*staging;
36	unsigned			offset;
37};
38
39struct compute_memory_item;
40
41struct r600_resource_global {
42	struct r600_resource base;
43	struct compute_memory_item *chunk;
44};
45
46struct r600_texture {
47	struct r600_resource		resource;
48
49	unsigned			array_mode[PIPE_MAX_TEXTURE_LEVELS];
50	unsigned			pitch_override;
51	unsigned			size;
52	unsigned			tile_type;
53	bool				is_depth;
54	bool				is_rat;
55	unsigned			dirty_level_mask; /* each bit says if that mipmap is compressed */
56	struct r600_texture		*flushed_depth_texture;
57	boolean				is_flushing_texture;
58	struct radeon_surface		surface;
59
60	/* FMASK and CMASK can only be used with MSAA textures for now.
61	 * MSAA textures cannot have mipmaps. */
62	unsigned			fmask_offset, fmask_size, fmask_bank_height;
63	unsigned			cmask_offset, cmask_size, cmask_slice_tile_max;
64};
65
66#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)
67
68struct r600_fmask_info {
69	unsigned size;
70	unsigned alignment;
71	unsigned bank_height;
72};
73
74struct r600_cmask_info {
75	unsigned size;
76	unsigned alignment;
77	unsigned slice_tile_max;
78};
79
80struct r600_surface {
81	struct pipe_surface		base;
82
83	bool color_initialized;
84	bool depth_initialized;
85
86	/* Misc. color flags. */
87	bool alphatest_bypass;
88	bool export_16bpc;
89
90	/* Color registers. */
91	unsigned cb_color_info;
92	unsigned cb_color_base;
93	unsigned cb_color_view;
94	unsigned cb_color_size;		/* R600 only */
95	unsigned cb_color_dim;		/* EG only */
96	unsigned cb_color_pitch;	/* EG only */
97	unsigned cb_color_slice;	/* EG only */
98	unsigned cb_color_attrib;	/* EG only */
99	unsigned cb_color_fmask;	/* CB_COLORn_FMASK (EG) or CB_COLORn_FRAG (r600) */
100	unsigned cb_color_fmask_slice;	/* EG only */
101	unsigned cb_color_cmask;	/* CB_COLORn_CMASK (EG) or CB_COLORn_TILE (r600) */
102	unsigned cb_color_cmask_slice;	/* EG only */
103	unsigned cb_color_mask;		/* R600 only */
104	struct r600_resource *cb_buffer_fmask; /* Used for FMASK relocations. R600 only */
105	struct r600_resource *cb_buffer_cmask; /* Used for CMASK relocations. R600 only */
106
107	/* DB registers. */
108	unsigned db_depth_info;		/* DB_Z_INFO (EG) or DB_DEPTH_INFO (r600) */
109	unsigned db_depth_base;		/* DB_Z_READ/WRITE_BASE (EG) or DB_DEPTH_BASE (r600) */
110	unsigned db_depth_view;
111	unsigned db_depth_size;
112	unsigned db_depth_slice;	/* EG only */
113	unsigned db_stencil_base;	/* EG only */
114	unsigned db_stencil_info;	/* EG only */
115	unsigned db_prefetch_limit;	/* R600 only */
116};
117
118void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
119void r600_init_screen_resource_functions(struct pipe_screen *screen);
120
121/* r600_texture */
122void r600_texture_get_fmask_info(struct r600_screen *rscreen,
123				 struct r600_texture *rtex,
124				 unsigned nr_samples,
125				 struct r600_fmask_info *out);
126void r600_texture_get_cmask_info(struct r600_screen *rscreen,
127				 struct r600_texture *rtex,
128				 struct r600_cmask_info *out);
129struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
130					const struct pipe_resource *templ);
131struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
132						const struct pipe_resource *base,
133						struct winsys_handle *whandle);
134
135static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
136{
137	return (struct r600_resource*)r;
138}
139
140bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
141				     struct pipe_resource *texture,
142				     struct r600_texture **staging);
143
144/* r600_texture.c texture transfer functions. */
145struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
146						struct pipe_resource *texture,
147						unsigned level,
148						unsigned usage,
149						const struct pipe_box *box);
150void r600_texture_transfer_destroy(struct pipe_context *ctx,
151				   struct pipe_transfer *trans);
152void* r600_texture_transfer_map(struct pipe_context *ctx,
153				struct pipe_transfer* transfer);
154void r600_texture_transfer_unmap(struct pipe_context *ctx,
155				 struct pipe_transfer* transfer);
156
157#endif
158