r600_pipe.h revision d81126b714cd4de0ab036bb22bf4103f5fcec015
1/* 2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 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 * Authors: 24 * Jerome Glisse 25 */ 26#ifndef R600_PIPE_H 27#define R600_PIPE_H 28 29#include <pipe/p_state.h> 30#include <pipe/p_screen.h> 31#include <pipe/p_context.h> 32#include <util/u_math.h> 33#include "util/u_slab.h" 34#include "util/u_vbuf_mgr.h" 35#include "r600.h" 36#include "r600_public.h" 37#include "r600_shader.h" 38#include "r600_resource.h" 39 40#define R600_MAX_CONST_BUFFERS 1 41#define R600_MAX_CONST_BUFFER_SIZE 4096 42 43#ifdef PIPE_ARCH_BIG_ENDIAN 44#define R600_BIG_ENDIAN 1 45#else 46#define R600_BIG_ENDIAN 0 47#endif 48 49enum r600_pipe_state_id { 50 R600_PIPE_STATE_BLEND = 0, 51 R600_PIPE_STATE_BLEND_COLOR, 52 R600_PIPE_STATE_CONFIG, 53 R600_PIPE_STATE_SEAMLESS_CUBEMAP, 54 R600_PIPE_STATE_CLIP, 55 R600_PIPE_STATE_SCISSOR, 56 R600_PIPE_STATE_VIEWPORT, 57 R600_PIPE_STATE_RASTERIZER, 58 R600_PIPE_STATE_VGT, 59 R600_PIPE_STATE_FRAMEBUFFER, 60 R600_PIPE_STATE_DSA, 61 R600_PIPE_STATE_STENCIL_REF, 62 R600_PIPE_STATE_PS_SHADER, 63 R600_PIPE_STATE_VS_SHADER, 64 R600_PIPE_STATE_CONSTANT, 65 R600_PIPE_STATE_SAMPLER, 66 R600_PIPE_STATE_RESOURCE, 67 R600_PIPE_STATE_POLYGON_OFFSET, 68 R600_PIPE_STATE_FETCH_SHADER, 69 R600_PIPE_STATE_SPI, 70 R600_PIPE_NSTATES 71}; 72 73struct r600_screen { 74 struct pipe_screen screen; 75 struct radeon *radeon; 76 struct r600_tiling_info *tiling_info; 77 struct util_slab_mempool pool_buffers; 78 unsigned num_contexts; 79 80 /* for thread-safe write accessing to num_contexts */ 81 pipe_mutex mutex_num_contexts; 82}; 83 84struct r600_pipe_sampler_view { 85 struct pipe_sampler_view base; 86 struct r600_pipe_resource_state state; 87}; 88 89struct r600_pipe_rasterizer { 90 struct r600_pipe_state rstate; 91 boolean flatshade; 92 unsigned sprite_coord_enable; 93 float offset_units; 94 float offset_scale; 95}; 96 97struct r600_pipe_blend { 98 struct r600_pipe_state rstate; 99 unsigned cb_target_mask; 100}; 101 102struct r600_pipe_dsa { 103 struct r600_pipe_state rstate; 104 unsigned alpha_ref; 105}; 106 107struct r600_vertex_element 108{ 109 unsigned count; 110 struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS]; 111 struct u_vbuf_mgr_elements *vmgr_elements; 112 struct r600_bo *fetch_shader; 113 unsigned fs_size; 114 struct r600_pipe_state rstate; 115 /* if offset is to big for fetch instructio we need to alterate 116 * offset of vertex buffer, record here the offset need to add 117 */ 118 unsigned vbuffer_need_offset; 119 unsigned vbuffer_offset[PIPE_MAX_ATTRIBS]; 120}; 121 122struct r600_pipe_shader { 123 struct r600_shader shader; 124 struct r600_pipe_state rstate; 125 struct r600_bo *bo; 126 struct r600_bo *bo_fetch; 127 struct r600_vertex_element vertex_elements; 128}; 129 130struct r600_pipe_sampler_state { 131 struct r600_pipe_state rstate; 132 boolean seamless_cube_map; 133}; 134 135/* needed for blitter save */ 136#define NUM_TEX_UNITS 16 137 138struct r600_textures_info { 139 struct r600_pipe_sampler_view *views[NUM_TEX_UNITS]; 140 unsigned n_views; 141 void *samplers[NUM_TEX_UNITS]; 142 unsigned n_samplers; 143}; 144 145struct r600_fence { 146 struct pipe_reference reference; 147 struct r600_pipe_context *ctx; 148 unsigned index; /* in the shared bo */ 149 struct list_head head; 150}; 151 152#define FENCE_BLOCK_SIZE 16 153 154struct r600_fence_block { 155 struct r600_fence fences[FENCE_BLOCK_SIZE]; 156 struct list_head head; 157}; 158 159struct r600_pipe_fences { 160 struct r600_bo *bo; 161 unsigned *data; 162 unsigned next_index; 163 /* linked list of preallocated blocks */ 164 struct list_head blocks; 165 /* linked list of freed fences */ 166 struct list_head pool; 167}; 168 169#define R600_CONSTANT_ARRAY_SIZE 256 170#define R600_RESOURCE_ARRAY_SIZE 160 171 172struct r600_pipe_context { 173 struct pipe_context context; 174 struct blitter_context *blitter; 175 unsigned family; 176 void *custom_dsa_flush; 177 struct r600_screen *screen; 178 struct radeon *radeon; 179 struct r600_pipe_state *states[R600_PIPE_NSTATES]; 180 struct r600_context ctx; 181 struct r600_vertex_element *vertex_elements; 182 struct r600_pipe_resource_state fs_resource[PIPE_MAX_ATTRIBS]; 183 struct pipe_framebuffer_state framebuffer; 184 struct pipe_index_buffer index_buffer; 185 unsigned cb_target_mask; 186 /* for saving when using blitter */ 187 struct pipe_stencil_ref stencil_ref; 188 struct pipe_viewport_state viewport; 189 struct pipe_clip_state clip; 190 struct r600_pipe_state config; 191 struct r600_pipe_shader *ps_shader; 192 struct r600_pipe_shader *vs_shader; 193 struct r600_pipe_state vs_const_buffer; 194 struct r600_pipe_resource_state vs_const_buffer_resource[R600_MAX_CONST_BUFFERS]; 195 struct r600_pipe_state ps_const_buffer; 196 struct r600_pipe_resource_state ps_const_buffer_resource[R600_MAX_CONST_BUFFERS]; 197 struct r600_pipe_rasterizer *rasterizer; 198 struct r600_pipe_state vgt; 199 struct r600_pipe_state spi; 200 struct pipe_query *current_render_cond; 201 unsigned current_render_cond_mode; 202 struct pipe_query *saved_render_cond; 203 unsigned saved_render_cond_mode; 204 /* shader information */ 205 boolean spi_dirty; 206 unsigned sprite_coord_enable; 207 boolean flatshade; 208 boolean export_16bpc; 209 unsigned alpha_ref; 210 boolean alpha_ref_dirty; 211 struct r600_textures_info ps_samplers; 212 213 struct r600_pipe_fences fences; 214 215 struct u_vbuf_mgr *vbuf_mgr; 216 struct util_slab_mempool pool_transfers; 217 boolean blit; 218 boolean have_depth_texture, have_depth_fb; 219 220 unsigned default_ps_gprs, default_vs_gprs; 221}; 222 223struct r600_drawl { 224 struct pipe_draw_info info; 225 struct pipe_context *ctx; 226 unsigned index_size; 227 unsigned index_buffer_offset; 228 struct pipe_resource *index_buffer; 229}; 230 231/* evergreen_state.c */ 232void evergreen_init_state_functions(struct r600_pipe_context *rctx); 233void evergreen_init_config(struct r600_pipe_context *rctx); 234void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader); 235void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader); 236void evergreen_fetch_shader(struct pipe_context *ctx, struct r600_vertex_element *ve); 237void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx); 238void evergreen_polygon_offset_update(struct r600_pipe_context *rctx); 239void evergreen_pipe_init_buffer_resource(struct r600_pipe_context *rctx, 240 struct r600_pipe_resource_state *rstate); 241void evergreen_pipe_mod_buffer_resource(struct r600_pipe_resource_state *rstate, 242 struct r600_resource *rbuffer, 243 unsigned offset, unsigned stride); 244 245/* r600_blit.c */ 246void r600_init_blit_functions(struct r600_pipe_context *rctx); 247void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture); 248void r600_blit_push_depth(struct pipe_context *ctx, struct r600_resource_texture *texture); 249void r600_flush_depth_textures(struct r600_pipe_context *rctx); 250 251/* r600_buffer.c */ 252struct pipe_resource *r600_buffer_create(struct pipe_screen *screen, 253 const struct pipe_resource *templ); 254struct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen, 255 void *ptr, unsigned bytes, 256 unsigned bind); 257struct pipe_resource *r600_buffer_from_handle(struct pipe_screen *screen, 258 struct winsys_handle *whandle); 259void r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl *draw); 260 261/* r600_query.c */ 262void r600_init_query_functions(struct r600_pipe_context *rctx); 263 264/* r600_resource.c */ 265void r600_init_context_resource_functions(struct r600_pipe_context *r600); 266 267/* r600_shader.c */ 268int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens); 269void r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader); 270int r600_find_vs_semantic_index(struct r600_shader *vs, 271 struct r600_shader *ps, int id); 272 273/* r600_state.c */ 274void r600_init_state_functions(struct r600_pipe_context *rctx); 275void r600_init_config(struct r600_pipe_context *rctx); 276void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader); 277void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader); 278void r600_fetch_shader(struct pipe_context *ctx, struct r600_vertex_element *ve); 279void *r600_create_db_flush_dsa(struct r600_pipe_context *rctx); 280void r600_polygon_offset_update(struct r600_pipe_context *rctx); 281void r600_pipe_init_buffer_resource(struct r600_pipe_context *rctx, 282 struct r600_pipe_resource_state *rstate); 283void r600_pipe_mod_buffer_resource(struct r600_pipe_resource_state *rstate, 284 struct r600_resource *rbuffer, 285 unsigned offset, unsigned stride); 286void r600_adjust_gprs(struct r600_pipe_context *rctx); 287 288/* r600_texture.c */ 289void r600_init_screen_texture_functions(struct pipe_screen *screen); 290void r600_init_surface_functions(struct r600_pipe_context *r600); 291uint32_t r600_translate_texformat(struct pipe_screen *screen, enum pipe_format format, 292 const unsigned char *swizzle_view, 293 uint32_t *word4_p, uint32_t *yuv_format_p); 294unsigned r600_texture_get_offset(struct r600_resource_texture *rtex, 295 unsigned level, unsigned layer); 296 297/* r600_translate.c */ 298void r600_translate_index_buffer(struct r600_pipe_context *r600, 299 struct pipe_resource **index_buffer, 300 unsigned *index_size, 301 unsigned *start, unsigned count); 302 303/* r600_state_common.c */ 304void r600_set_index_buffer(struct pipe_context *ctx, 305 const struct pipe_index_buffer *ib); 306void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count, 307 const struct pipe_vertex_buffer *buffers); 308void *r600_create_vertex_elements(struct pipe_context *ctx, 309 unsigned count, 310 const struct pipe_vertex_element *elements); 311void r600_delete_vertex_element(struct pipe_context *ctx, void *state); 312void r600_bind_blend_state(struct pipe_context *ctx, void *state); 313void r600_bind_dsa_state(struct pipe_context *ctx, void *state); 314void r600_bind_rs_state(struct pipe_context *ctx, void *state); 315void r600_delete_rs_state(struct pipe_context *ctx, void *state); 316void r600_sampler_view_destroy(struct pipe_context *ctx, 317 struct pipe_sampler_view *state); 318void r600_delete_state(struct pipe_context *ctx, void *state); 319void r600_bind_vertex_elements(struct pipe_context *ctx, void *state); 320void *r600_create_shader_state(struct pipe_context *ctx, 321 const struct pipe_shader_state *state); 322void r600_bind_ps_shader(struct pipe_context *ctx, void *state); 323void r600_bind_vs_shader(struct pipe_context *ctx, void *state); 324void r600_delete_ps_shader(struct pipe_context *ctx, void *state); 325void r600_delete_vs_shader(struct pipe_context *ctx, void *state); 326void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index, 327 struct pipe_resource *buffer); 328void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info); 329 330/* 331 * common helpers 332 */ 333static INLINE u32 S_FIXED(float value, u32 frac_bits) 334{ 335 return value * (1 << frac_bits); 336} 337#define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y)) 338 339static inline unsigned r600_tex_aniso_filter(unsigned filter) 340{ 341 if (filter <= 1) return 0; 342 if (filter <= 2) return 1; 343 if (filter <= 4) return 2; 344 if (filter <= 8) return 3; 345 /* else */ return 4; 346} 347 348#endif 349