si_state.h revision 84fdda280f4361add3802476ce9a30ac1c0b4c69
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright 2012 Advanced Micro Devices, Inc. 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * copy of this software and associated documentation files (the "Software"), 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * to deal in the Software without restriction, including without limitation 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * on the rights to use, copy, modify, merge, publish, distribute, sub 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * license, and/or sell copies of the Software, and to permit persons to whom 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the Software is furnished to do so, subject to the following conditions: 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The above copyright notice and this permission notice (including the next 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * paragraph) shall be included in all copies or substantial portions of the 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Software. 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * USE OR OTHER DEALINGS IN THE SOFTWARE. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Authors: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Christian König <christian.koenig@amd.com> 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SI_STATE_H 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SI_STATE_H 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "radeonsi_pm4.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_blend { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state pm4; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t cb_target_mask; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t cb_color_control; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_viewport { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state pm4; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct pipe_viewport_state viewport; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_rasterizer { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state pm4; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flatshade; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned sprite_coord_enable; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned pa_sc_line_stipple; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned pa_su_sc_mode_cntl; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned pa_cl_clip_cntl; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned pa_cl_vs_out_cntl; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float offset_units; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float offset_scale; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_dsa { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state pm4; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned alpha_ref; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned db_render_override; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned db_render_control; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8_t valuemask[2]; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8_t writemask[2]; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_vertex_element 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned count; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t rsrc_word3[PIPE_MAX_ATTRIBS]; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS]; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)union si_state { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *sync; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *init; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_state_blend *blend; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *blend_color; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *clip; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *scissor; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_state_viewport *viewport; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *framebuffer; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_state_rasterizer *rasterizer; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_state_dsa *dsa; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *fb_rs; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *fb_blend; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *dsa_stencil_ref; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *vs; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *vs_const; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct si_pm4_state *ps; 89 struct si_pm4_state *ps_sampler_views; 90 struct si_pm4_state *ps_sampler; 91 struct si_pm4_state *ps_const; 92 struct si_pm4_state *spi; 93 struct si_pm4_state *vertex_buffers; 94 struct si_pm4_state *texture_barrier; 95 struct si_pm4_state *draw_info; 96 struct si_pm4_state *draw; 97 } named; 98 struct si_pm4_state *array[0]; 99}; 100 101#define si_pm4_block_idx(member) \ 102 (offsetof(union si_state, named.member) / sizeof(struct si_pm4_state *)) 103 104#define si_pm4_bind_state(rctx, member, value) \ 105 do { \ 106 (rctx)->queued.named.member = (value); \ 107 } while(0) 108 109#define si_pm4_delete_state(rctx, member, value) \ 110 do { \ 111 if ((rctx)->queued.named.member == (value)) { \ 112 (rctx)->queued.named.member = NULL; \ 113 } \ 114 si_pm4_free_state(rctx, (struct si_pm4_state *)(value), \ 115 si_pm4_block_idx(member)); \ 116 } while(0) 117 118#define si_pm4_set_state(rctx, member, value) \ 119 do { \ 120 if ((rctx)->queued.named.member != (value)) { \ 121 si_pm4_free_state(rctx, \ 122 (struct si_pm4_state *)(rctx)->queued.named.member, \ 123 si_pm4_block_idx(member)); \ 124 (rctx)->queued.named.member = (value); \ 125 } \ 126 } while(0) 127 128/* si_state.c */ 129bool si_is_format_supported(struct pipe_screen *screen, 130 enum pipe_format format, 131 enum pipe_texture_target target, 132 unsigned sample_count, 133 unsigned usage); 134void si_init_state_functions(struct r600_context *rctx); 135void si_init_config(struct r600_context *rctx); 136 137/* si_state_streamout.c */ 138struct pipe_stream_output_target * 139si_create_so_target(struct pipe_context *ctx, 140 struct pipe_resource *buffer, 141 unsigned buffer_offset, 142 unsigned buffer_size); 143void si_so_target_destroy(struct pipe_context *ctx, 144 struct pipe_stream_output_target *target); 145void si_set_so_targets(struct pipe_context *ctx, 146 unsigned num_targets, 147 struct pipe_stream_output_target **targets, 148 unsigned append_bitmask); 149 150/* si_state_draw.c */ 151void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo); 152 153/* si_commands.c */ 154void si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl); 155 156#endif 157