radeon_winsys.h revision 28a336dc38c478b809544e7404c4d1fddd873333
1/* 2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3 * Copyright 2010 Marek Olšák <maraeo@gmail.com> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * on the rights to use, copy, modify, merge, publish, distribute, sub 9 * license, and/or sell copies of the Software, and to permit persons to whom 10 * the Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22 * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23 24#ifndef RADEON_WINSYS_H 25#define RADEON_WINSYS_H 26 27/* The public winsys interface header for the radeon driver. */ 28 29/* R300 features in DRM. 30 * 31 * 2.6.0: 32 * - Hyper-Z 33 * - GB_Z_PEQ_CONFIG on rv350->r4xx 34 * - R500 FG_ALPHA_VALUE 35 * 36 * 2.8.0: 37 * - R500 US_FORMAT regs 38 * - R500 ARGB2101010 colorbuffer 39 * - CMask and AA regs 40 * - R16F/RG16F 41 */ 42 43#include "pipebuffer/pb_bufmgr.h" 44#include "pipe/p_defines.h" 45#include "pipe/p_state.h" 46 47#define RADEON_MAX_CMDBUF_DWORDS (16 * 1024) 48#define RADEON_FLUSH_ASYNC (1 << 0) 49 50/* Tiling flags. */ 51enum radeon_bo_layout { 52 RADEON_LAYOUT_LINEAR = 0, 53 RADEON_LAYOUT_TILED, 54 RADEON_LAYOUT_SQUARETILED, 55 56 RADEON_LAYOUT_UNKNOWN 57}; 58 59enum radeon_bo_domain { /* bitfield */ 60 RADEON_DOMAIN_GTT = 2, 61 RADEON_DOMAIN_VRAM = 4 62}; 63 64struct winsys_handle; 65struct radeon_winsys_cs_handle; /* for write_reloc etc. */ 66 67struct radeon_winsys_cs { 68 unsigned cdw; /* Number of used dwords. */ 69 uint32_t *buf; /* The command buffer. */ 70}; 71 72struct radeon_info { 73 uint32_t pci_id; 74 uint32_t gart_size; 75 uint32_t vram_size; 76 77 uint32_t drm_major; /* version */ 78 uint32_t drm_minor; 79 uint32_t drm_patchlevel; 80 81 uint32_t r300_num_gb_pipes; 82 uint32_t r300_num_z_pipes; 83}; 84 85enum radeon_feature_id { 86 RADEON_FID_HYPERZ_RAM_ACCESS, /* ZMask + HiZ */ 87 RADEON_FID_CMASK_RAM_ACCESS, 88}; 89 90struct radeon_winsys { 91 /** 92 * Destroy this winsys. 93 * 94 * \param ws The winsys this function is called from. 95 */ 96 void (*destroy)(struct radeon_winsys *ws); 97 98 /** 99 * Query an info structure from winsys. 100 * 101 * \param ws The winsys this function is called from. 102 * \param info Return structure 103 */ 104 void (*query_info)(struct radeon_winsys *ws, 105 struct radeon_info *info); 106 107 /************************************************************************** 108 * Buffer management. Buffer attributes are mostly fixed over its lifetime. 109 * 110 * Remember that gallium gets to choose the interface it needs, and the 111 * window systems must then implement that interface (rather than the 112 * other way around...). 113 *************************************************************************/ 114 115 /** 116 * Create a buffer object. 117 * 118 * \param ws The winsys this function is called from. 119 * \param size The size to allocate. 120 * \param alignment An alignment of the buffer in memory. 121 * \param bind A bitmask of the PIPE_BIND_* flags. 122 * \param usage A bitmask of the PIPE_USAGE_* flags. 123 * \param domain A bitmask of the RADEON_DOMAIN_* flags. 124 * \return The created buffer object. 125 */ 126 struct pb_buffer *(*buffer_create)(struct radeon_winsys *ws, 127 unsigned size, 128 unsigned alignment, 129 unsigned bind, 130 unsigned usage, 131 enum radeon_bo_domain domain); 132 133 struct radeon_winsys_cs_handle *(*buffer_get_cs_handle)( 134 struct pb_buffer *buf); 135 136 /** 137 * Map the entire data store of a buffer object into the client's address 138 * space. 139 * 140 * \param buf A winsys buffer object to map. 141 * \param cs A command stream to flush if the buffer is referenced by it. 142 * \param usage A bitmask of the PIPE_TRANSFER_* flags. 143 * \return The pointer at the beginning of the buffer. 144 */ 145 void *(*buffer_map)(struct pb_buffer *buf, 146 struct radeon_winsys_cs *cs, 147 enum pipe_transfer_usage usage); 148 149 /** 150 * Unmap a buffer object from the client's address space. 151 * 152 * \param buf A winsys buffer object to unmap. 153 */ 154 void (*buffer_unmap)(struct pb_buffer *buf); 155 156 /** 157 * Return TRUE if a buffer object is being used by the GPU. 158 * 159 * \param buf A winsys buffer object. 160 */ 161 boolean (*buffer_is_busy)(struct pb_buffer *buf); 162 163 /** 164 * Wait for a buffer object until it is not used by a GPU. This is 165 * equivalent to a fence placed after the last command using the buffer, 166 * and synchronizing to the fence. 167 * 168 * \param buf A winsys buffer object to wait for. 169 */ 170 void (*buffer_wait)(struct pb_buffer *buf); 171 172 /** 173 * Return tiling flags describing a memory layout of a buffer object. 174 * 175 * \param buf A winsys buffer object to get the flags from. 176 * \param macrotile A pointer to the return value of the microtile flag. 177 * \param microtile A pointer to the return value of the macrotile flag. 178 * 179 * \note microtile and macrotile are not bitmasks! 180 */ 181 void (*buffer_get_tiling)(struct pb_buffer *buf, 182 enum radeon_bo_layout *microtile, 183 enum radeon_bo_layout *macrotile); 184 185 /** 186 * Set tiling flags describing a memory layout of a buffer object. 187 * 188 * \param buf A winsys buffer object to set the flags for. 189 * \param cs A command stream to flush if the buffer is referenced by it. 190 * \param macrotile A macrotile flag. 191 * \param microtile A microtile flag. 192 * \param stride A stride of the buffer in bytes, for texturing. 193 * 194 * \note microtile and macrotile are not bitmasks! 195 */ 196 void (*buffer_set_tiling)(struct pb_buffer *buf, 197 struct radeon_winsys_cs *cs, 198 enum radeon_bo_layout microtile, 199 enum radeon_bo_layout macrotile, 200 unsigned stride); 201 202 /** 203 * Get a winsys buffer from a winsys handle. The internal structure 204 * of the handle is platform-specific and only a winsys should access it. 205 * 206 * \param ws The winsys this function is called from. 207 * \param whandle A winsys handle pointer as was received from a state 208 * tracker. 209 * \param stride The returned buffer stride in bytes. 210 * \param size The returned buffer size. 211 */ 212 struct pb_buffer *(*buffer_from_handle)(struct radeon_winsys *ws, 213 struct winsys_handle *whandle, 214 unsigned *stride, 215 unsigned *size); 216 217 /** 218 * Get a winsys handle from a winsys buffer. The internal structure 219 * of the handle is platform-specific and only a winsys should access it. 220 * 221 * \param buf A winsys buffer object to get the handle from. 222 * \param whandle A winsys handle pointer. 223 * \param stride A stride of the buffer in bytes, for texturing. 224 * \return TRUE on success. 225 */ 226 boolean (*buffer_get_handle)(struct pb_buffer *buf, 227 unsigned stride, 228 struct winsys_handle *whandle); 229 230 /************************************************************************** 231 * Command submission. 232 * 233 * Each pipe context should create its own command stream and submit 234 * commands independently of other contexts. 235 *************************************************************************/ 236 237 /** 238 * Create a command stream. 239 * 240 * \param ws The winsys this function is called from. 241 */ 242 struct radeon_winsys_cs *(*cs_create)(struct radeon_winsys *ws); 243 244 /** 245 * Destroy a command stream. 246 * 247 * \param cs A command stream to destroy. 248 */ 249 void (*cs_destroy)(struct radeon_winsys_cs *cs); 250 251 /** 252 * Add a new buffer relocation. Every relocation must first be added 253 * before it can be written. 254 * 255 * \param cs A command stream to add buffer for validation against. 256 * \param buf A winsys buffer to validate. 257 * \param rd A read domain containing a bitmask of the RADEON_DOMAIN_* flags. 258 * \param wd A write domain containing a bitmask of the RADEON_DOMAIN_* flags. 259 */ 260 void (*cs_add_reloc)(struct radeon_winsys_cs *cs, 261 struct radeon_winsys_cs_handle *buf, 262 enum radeon_bo_domain rd, 263 enum radeon_bo_domain wd); 264 265 /** 266 * Return TRUE if there is enough memory in VRAM and GTT for the relocs 267 * added so far. 268 * 269 * \param cs A command stream to validate. 270 */ 271 boolean (*cs_validate)(struct radeon_winsys_cs *cs); 272 273 /** 274 * Write a relocated dword to a command buffer. 275 * 276 * \param cs A command stream the relocation is written to. 277 * \param buf A winsys buffer to write the relocation for. 278 * \param rd A read domain containing a bitmask of the RADEON_DOMAIN_* flags. 279 * \param wd A write domain containing a bitmask of the RADEON_DOMAIN_* flags. 280 */ 281 void (*cs_write_reloc)(struct radeon_winsys_cs *cs, 282 struct radeon_winsys_cs_handle *buf); 283 284 /** 285 * Flush a command stream. 286 * 287 * \param cs A command stream to flush. 288 * \param flags, RADEON_FLUSH_ASYNC or 0. 289 */ 290 void (*cs_flush)(struct radeon_winsys_cs *cs, unsigned flags); 291 292 /** 293 * Set a flush callback which is called from winsys when flush is 294 * required. 295 * 296 * \param cs A command stream to set the callback for. 297 * \param flush A flush callback function associated with the command stream. 298 * \param user A user pointer that will be passed to the flush callback. 299 */ 300 void (*cs_set_flush)(struct radeon_winsys_cs *cs, 301 void (*flush)(void *ctx, unsigned flags), 302 void *user); 303 304 /** 305 * Return TRUE if a buffer is referenced by a command stream. 306 * 307 * \param cs A command stream. 308 * \param buf A winsys buffer. 309 */ 310 boolean (*cs_is_buffer_referenced)(struct radeon_winsys_cs *cs, 311 struct radeon_winsys_cs_handle *buf); 312 313 /** 314 * Request access to a feature for a command stream. 315 * 316 * \param cs A command stream. 317 * \param fid A winsys buffer. 318 */ 319 boolean (*cs_request_feature)(struct radeon_winsys_cs *cs, 320 enum radeon_feature_id fid, 321 boolean enable); 322}; 323 324#endif 325