r600_resource.h revision a3d9d7ec79d6f7205fab2324e47d8ea185431de0
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
32struct r600_transfer {
33	struct pipe_transfer		transfer;
34	struct r600_resource		*staging;
35	unsigned			offset;
36};
37
38struct compute_memory_item;
39
40struct r600_resource_global {
41	struct r600_resource base;
42	struct compute_memory_item *chunk;
43};
44
45struct r600_texture {
46	struct r600_resource		resource;
47
48	unsigned			array_mode[PIPE_MAX_TEXTURE_LEVELS];
49	unsigned			pitch_override;
50	unsigned			size;
51	unsigned			tile_type;
52	bool				is_depth;
53	bool				is_rat;
54	unsigned			dirty_level_mask; /* each bit says if that mipmap is compressed */
55	struct r600_texture		*flushed_depth_texture;
56	boolean				is_flushing_texture;
57	struct radeon_surface		surface;
58
59	/* FMASK and CMASK can only be used with MSAA textures for now.
60	 * MSAA textures cannot have mipmaps. */
61	unsigned			fmask_offset, fmask_size, fmask_bank_height;
62	unsigned			cmask_offset, cmask_size, cmask_slice_tile_max;
63};
64
65#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)
66
67struct r600_surface {
68	struct pipe_surface		base;
69
70	bool color_initialized;
71	bool depth_initialized;
72
73	/* Misc. color flags. */
74	bool alphatest_bypass;
75	bool export_16bpc;
76
77	/* Color registers. */
78	unsigned cb_color_info;
79	unsigned cb_color_base;
80	unsigned cb_color_view;
81	unsigned cb_color_size;		/* R600 only */
82	unsigned cb_color_dim;		/* EG only */
83	unsigned cb_color_pitch;	/* EG only */
84	unsigned cb_color_slice;	/* EG only */
85	unsigned cb_color_attrib;	/* EG only */
86	unsigned cb_color_fmask;	/* CB_COLORn_FMASK (EG) or CB_COLORn_FRAG (r600) */
87	unsigned cb_color_fmask_slice;	/* EG only */
88	unsigned cb_color_cmask;	/* CB_COLORn_CMASK (EG) or CB_COLORn_TILE (r600) */
89	unsigned cb_color_cmask_slice;	/* EG only */
90
91	/* DB registers. */
92	unsigned db_depth_info;		/* DB_Z_INFO (EG) or DB_DEPTH_INFO (r600) */
93	unsigned db_depth_base;		/* DB_Z_READ/WRITE_BASE (EG) or DB_DEPTH_BASE (r600) */
94	unsigned db_depth_view;
95	unsigned db_depth_size;
96	unsigned db_depth_slice;	/* EG only */
97	unsigned db_stencil_base;	/* EG only */
98	unsigned db_stencil_info;	/* EG only */
99	unsigned db_prefetch_limit;	/* R600 only */
100};
101
102void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
103void r600_init_screen_resource_functions(struct pipe_screen *screen);
104
105/* r600_texture */
106struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
107					const struct pipe_resource *templ);
108struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
109						const struct pipe_resource *base,
110						struct winsys_handle *whandle);
111
112static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
113{
114	return (struct r600_resource*)r;
115}
116
117bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
118				     struct pipe_resource *texture,
119				     struct r600_texture **staging);
120
121/* r600_texture.c texture transfer functions. */
122struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
123						struct pipe_resource *texture,
124						unsigned level,
125						unsigned usage,
126						const struct pipe_box *box);
127void r600_texture_transfer_destroy(struct pipe_context *ctx,
128				   struct pipe_transfer *trans);
129void* r600_texture_transfer_map(struct pipe_context *ctx,
130				struct pipe_transfer* transfer);
131void r600_texture_transfer_unmap(struct pipe_context *ctx,
132				 struct pipe_transfer* transfer);
133
134#endif
135