si_pipe.h revision 848b8605
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 SI_PIPE_H 27#define SI_PIPE_H 28 29#include "si_state.h" 30 31#ifdef PIPE_ARCH_BIG_ENDIAN 32#define SI_BIG_ENDIAN 1 33#else 34#define SI_BIG_ENDIAN 0 35#endif 36 37#define SI_TRACE_CS 0 38#define SI_TRACE_CS_DWORDS 6 39 40#define SI_MAX_DRAW_CS_DWORDS 18 41 42struct si_pipe_compute; 43 44struct si_screen { 45 struct r600_common_screen b; 46}; 47 48struct si_pipe_sampler_view { 49 struct pipe_sampler_view base; 50 struct list_head list; 51 struct r600_resource *resource; 52 uint32_t state[8]; 53 uint32_t fmask_state[8]; 54}; 55 56struct si_pipe_sampler_state { 57 uint32_t val[4]; 58 uint32_t border_color[4]; 59}; 60 61struct si_cs_shader_state { 62 struct si_pipe_compute *program; 63}; 64 65struct si_textures_info { 66 struct si_sampler_views views; 67 struct si_sampler_states states; 68 uint32_t depth_texture_mask; /* which textures are depth */ 69 uint32_t compressed_colortex_mask; 70}; 71 72struct si_framebuffer { 73 struct r600_atom atom; 74 struct pipe_framebuffer_state state; 75 unsigned nr_samples; 76 unsigned log_samples; 77 unsigned cb0_is_integer; 78 unsigned compressed_cb_mask; 79 unsigned export_16bpc; 80}; 81 82#define SI_NUM_ATOMS(sctx) (sizeof((sctx)->atoms)/sizeof((sctx)->atoms.array[0])) 83 84#define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1) 85 86struct si_context { 87 struct r600_common_context b; 88 struct blitter_context *blitter; 89 void *custom_dsa_flush_depth_stencil[8]; 90 void *custom_dsa_flush_depth[8]; 91 void *custom_dsa_flush_stencil[8]; 92 void *custom_dsa_flush_inplace; 93 void *custom_blend_resolve; 94 void *custom_blend_decompress; 95 void *custom_blend_fastclear; 96 struct si_screen *screen; 97 98 union { 99 struct { 100 /* The order matters. */ 101 struct r600_atom *vertex_buffers; 102 struct r600_atom *const_buffers[SI_NUM_SHADERS]; 103 struct r600_atom *rw_buffers[SI_NUM_SHADERS]; 104 struct r600_atom *sampler_views[SI_NUM_SHADERS]; 105 struct r600_atom *sampler_states[SI_NUM_SHADERS]; 106 /* Caches must be flushed after resource descriptors are 107 * updated in memory. */ 108 struct r600_atom *cache_flush; 109 struct r600_atom *streamout_begin; 110 struct r600_atom *streamout_enable; /* must be after streamout_begin */ 111 struct r600_atom *framebuffer; 112 struct r600_atom *msaa_config; 113 } s; 114 struct r600_atom *array[0]; 115 } atoms; 116 117 struct si_framebuffer framebuffer; 118 struct si_vertex_element *vertex_elements; 119 unsigned pa_sc_line_stipple; 120 unsigned pa_su_sc_mode_cntl; 121 /* for saving when using blitter */ 122 struct pipe_stencil_ref stencil_ref; 123 struct si_pipe_shader_selector *ps_shader; 124 struct si_pipe_shader_selector *gs_shader; 125 struct si_pipe_shader_selector *vs_shader; 126 struct si_cs_shader_state cs_shader_state; 127 /* shader information */ 128 unsigned sprite_coord_enable; 129 struct si_descriptors vertex_buffers; 130 struct si_buffer_resources const_buffers[SI_NUM_SHADERS]; 131 struct si_buffer_resources rw_buffers[SI_NUM_SHADERS]; 132 struct si_textures_info samplers[SI_NUM_SHADERS]; 133 struct r600_resource *border_color_table; 134 unsigned border_color_offset; 135 136 struct r600_atom msaa_config; 137 int ps_iter_samples; 138 139 unsigned default_ps_gprs, default_vs_gprs; 140 141 /* Below are variables from the old r600_context. 142 */ 143 unsigned pm4_dirty_cdwords; 144 145 /* Vertex and index buffers. */ 146 bool vertex_buffers_dirty; 147 struct pipe_index_buffer index_buffer; 148 struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS]; 149 150 /* With rasterizer discard, there doesn't have to be a pixel shader. 151 * In that case, we bind this one: */ 152 void *dummy_pixel_shader; 153 struct si_pm4_state *gs_on; 154 struct si_pm4_state *gs_off; 155 struct si_pm4_state *gs_rings; 156 struct r600_atom cache_flush; 157 struct pipe_constant_buffer null_const_buf; /* used for set_constant_buffer(NULL) on CIK */ 158 struct pipe_constant_buffer esgs_ring; 159 struct pipe_constant_buffer gsvs_ring; 160 161 /* SI state handling */ 162 union si_state queued; 163 union si_state emitted; 164}; 165 166/* si_blit.c */ 167void si_init_blit_functions(struct si_context *sctx); 168void si_flush_depth_textures(struct si_context *sctx, 169 struct si_textures_info *textures); 170void si_decompress_color_textures(struct si_context *sctx, 171 struct si_textures_info *textures); 172 173/* si_dma.c */ 174void si_dma_copy(struct pipe_context *ctx, 175 struct pipe_resource *dst, 176 unsigned dst_level, 177 unsigned dstx, unsigned dsty, unsigned dstz, 178 struct pipe_resource *src, 179 unsigned src_level, 180 const struct pipe_box *src_box); 181 182/* si_hw_context.c */ 183void si_context_gfx_flush(void *context, unsigned flags, 184 struct pipe_fence_handle **fence); 185void si_begin_new_cs(struct si_context *ctx); 186void si_need_cs_space(struct si_context *ctx, unsigned num_dw, boolean count_draw_in); 187 188#if SI_TRACE_CS 189void si_trace_emit(struct si_context *sctx); 190#endif 191 192/* si_compute.c */ 193void si_init_compute_functions(struct si_context *sctx); 194 195/* si_uvd.c */ 196struct pipe_video_codec *si_uvd_create_decoder(struct pipe_context *context, 197 const struct pipe_video_codec *templ); 198 199struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe, 200 const struct pipe_video_buffer *tmpl); 201 202/* 203 * common helpers 204 */ 205 206static INLINE struct r600_resource * 207si_resource_create_custom(struct pipe_screen *screen, 208 unsigned usage, unsigned size) 209{ 210 assert(size); 211 return r600_resource(pipe_buffer_create(screen, 212 PIPE_BIND_CUSTOM, usage, size)); 213} 214 215#endif 216