r600_resource.h revision cdc681c3ad746fe8adab4ea71358bcc54e024ff9
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	/* If this resource is a depth-stencil buffer on evergreen, this contains
49	 * the depth part of the format. There is a separate stencil resource
50	 * for the stencil buffer below. */
51	enum pipe_format		real_format;
52
53	unsigned			offset[PIPE_MAX_TEXTURE_LEVELS];
54	unsigned			pitch_in_bytes[PIPE_MAX_TEXTURE_LEVELS];  /* transfer */
55	unsigned			layer_size[PIPE_MAX_TEXTURE_LEVELS];
56	unsigned			array_mode[PIPE_MAX_TEXTURE_LEVELS];
57	unsigned			pitch_override;
58	unsigned			size;
59	unsigned			tile_type;
60	bool				is_depth;
61	bool				is_rat;
62	unsigned			dirty_db_mask; /* each bit says if that miplevel is dirty */
63	struct r600_resource_texture	*flushed_depth_texture;
64	boolean				is_flushing_texture;
65	struct radeon_surface		surface;
66};
67
68#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)
69
70struct r600_surface {
71	struct pipe_surface		base;
72
73	bool depth_initialized;
74
75	/* DB registers. */
76	unsigned db_depth_info;		/* DB_Z_INFO (EG) or DB_DEPTH_INFO (r600) */
77	unsigned db_depth_base;		/* DB_Z_READ/WRITE_BASE (EG) or DB_DEPTH_BASE (r600) */
78	unsigned db_depth_view;
79	unsigned db_depth_size;
80	unsigned db_depth_slice;	/* EG only */
81	unsigned db_stencil_base;	/* EG only */
82	unsigned db_stencil_info;	/* EG only */
83	unsigned db_prefetch_limit;	/* R600 only */
84};
85
86void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
87void r600_init_screen_resource_functions(struct pipe_screen *screen);
88
89/* r600_texture */
90struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
91					const struct pipe_resource *templ);
92struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
93						const struct pipe_resource *base,
94						struct winsys_handle *whandle);
95
96static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
97{
98	return (struct r600_resource*)r;
99}
100
101bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
102				     struct pipe_resource *texture,
103				     struct r600_resource_texture **staging);
104
105/* r600_texture.c texture transfer functions. */
106struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
107						struct pipe_resource *texture,
108						unsigned level,
109						unsigned usage,
110						const struct pipe_box *box);
111void r600_texture_transfer_destroy(struct pipe_context *ctx,
112				   struct pipe_transfer *trans);
113void* r600_texture_transfer_map(struct pipe_context *ctx,
114				struct pipe_transfer* transfer);
115void r600_texture_transfer_unmap(struct pipe_context *ctx,
116				 struct pipe_transfer* transfer);
117
118#endif
119