r600_resource.h revision 773ff5705f3b2d88fb7094b8d2e051bb684c2323
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_resource_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_db_mask; /* each bit says if that miplevel is dirty */
55	struct r600_resource_texture	*flushed_depth_texture;
56	boolean				is_flushing_texture;
57	struct radeon_surface		surface;
58};
59
60#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)
61
62struct r600_surface {
63	struct pipe_surface		base;
64
65	bool color_initialized;
66	bool depth_initialized;
67
68	/* Misc. color flags. */
69	bool alphatest_bypass;
70	bool export_16bpc;
71
72	/* Color registers. */
73	unsigned cb_color_info;
74	unsigned cb_color_base;
75	unsigned cb_color_view;
76	unsigned cb_color_size;		/* R600 only */
77	unsigned cb_color_frag;		/* R600 only */
78	unsigned cb_color_tile;		/* R600 only */
79	unsigned cb_color_dim;		/* EG only */
80	unsigned cb_color_pitch;	/* EG only */
81	unsigned cb_color_slice;	/* EG only */
82	unsigned cb_color_attrib;	/* EG only */
83
84	/* DB registers. */
85	unsigned db_depth_info;		/* DB_Z_INFO (EG) or DB_DEPTH_INFO (r600) */
86	unsigned db_depth_base;		/* DB_Z_READ/WRITE_BASE (EG) or DB_DEPTH_BASE (r600) */
87	unsigned db_depth_view;
88	unsigned db_depth_size;
89	unsigned db_depth_slice;	/* EG only */
90	unsigned db_stencil_base;	/* EG only */
91	unsigned db_stencil_info;	/* EG only */
92	unsigned db_prefetch_limit;	/* R600 only */
93};
94
95void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
96void r600_init_screen_resource_functions(struct pipe_screen *screen);
97
98/* r600_texture */
99struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
100					const struct pipe_resource *templ);
101struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
102						const struct pipe_resource *base,
103						struct winsys_handle *whandle);
104
105static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
106{
107	return (struct r600_resource*)r;
108}
109
110bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
111				     struct pipe_resource *texture,
112				     struct r600_resource_texture **staging);
113
114/* r600_texture.c texture transfer functions. */
115struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
116						struct pipe_resource *texture,
117						unsigned level,
118						unsigned usage,
119						const struct pipe_box *box);
120void r600_texture_transfer_destroy(struct pipe_context *ctx,
121				   struct pipe_transfer *trans);
122void* r600_texture_transfer_map(struct pipe_context *ctx,
123				struct pipe_transfer* transfer);
124void r600_texture_transfer_unmap(struct pipe_context *ctx,
125				 struct pipe_transfer* transfer);
126
127#endif
128