Home | History | Annotate | Download | only in r600
      1 /*
      2  * Copyright 2010 Marek Olk <maraeo (at) 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 
     33 struct r600_transfer {
     34 	struct pipe_transfer		transfer;
     35 	struct r600_resource		*staging;
     36 	unsigned			offset;
     37 };
     38 
     39 struct compute_memory_item;
     40 
     41 struct r600_resource_global {
     42 	struct r600_resource base;
     43 	struct compute_memory_item *chunk;
     44 };
     45 
     46 struct 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 
     68 struct r600_fmask_info {
     69 	unsigned size;
     70 	unsigned alignment;
     71 	unsigned bank_height;
     72 };
     73 
     74 struct r600_cmask_info {
     75 	unsigned size;
     76 	unsigned alignment;
     77 	unsigned slice_tile_max;
     78 };
     79 
     80 struct 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 
    118 void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res);
    119 void r600_init_screen_resource_functions(struct pipe_screen *screen);
    120 
    121 /* r600_texture */
    122 void r600_texture_get_fmask_info(struct r600_screen *rscreen,
    123 				 struct r600_texture *rtex,
    124 				 unsigned nr_samples,
    125 				 struct r600_fmask_info *out);
    126 void r600_texture_get_cmask_info(struct r600_screen *rscreen,
    127 				 struct r600_texture *rtex,
    128 				 struct r600_cmask_info *out);
    129 struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
    130 					const struct pipe_resource *templ);
    131 struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
    132 						const struct pipe_resource *base,
    133 						struct winsys_handle *whandle);
    134 
    135 static INLINE struct r600_resource *r600_resource(struct pipe_resource *r)
    136 {
    137 	return (struct r600_resource*)r;
    138 }
    139 
    140 bool 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. */
    145 struct 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);
    150 void r600_texture_transfer_destroy(struct pipe_context *ctx,
    151 				   struct pipe_transfer *trans);
    152 void* r600_texture_transfer_map(struct pipe_context *ctx,
    153 				struct pipe_transfer* transfer);
    154 void r600_texture_transfer_unmap(struct pipe_context *ctx,
    155 				 struct pipe_transfer* transfer);
    156 
    157 #endif
    158