ac: add load_tess_level() to the abi
[mesa.git] / src / gallium / drivers / radeonsi / si_state.h
index 7b7d96c06658e3fdb513427b86b9800e6da1925c..5233be72462203ca88aa25c5102df2bd4c60a800 100644 (file)
@@ -19,9 +19,6 @@
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *      Christian König <christian.koenig@amd.com>
  */
 
 #ifndef SI_STATE_H
@@ -49,15 +46,17 @@ struct si_shader_selector;
 struct si_state_blend {
        struct si_pm4_state     pm4;
        uint32_t                cb_target_mask;
-       bool                    alpha_to_coverage;
-       bool                    alpha_to_one;
-       bool                    dual_src_blend;
        /* Set 0xf or 0x0 (4 bits) per render target if the following is
         * true. ANDed with spi_shader_col_format.
         */
        unsigned                cb_target_enabled_4bit;
        unsigned                blend_enable_4bit;
        unsigned                need_src_alpha_4bit;
+       unsigned                commutative_4bit;
+       bool                    alpha_to_coverage:1;
+       bool                    alpha_to_one:1;
+       bool                    dual_src_blend:1;
+       bool                    logicop_enable:1;
 };
 
 struct si_state_rasterizer {
@@ -66,6 +65,8 @@ struct si_state_rasterizer {
        struct si_pm4_state     *pm4_poly_offset;
        unsigned                pa_sc_line_stipple;
        unsigned                pa_cl_clip_cntl;
+       float                   line_width;
+       float                   max_point_size;
        unsigned                sprite_coord_enable:8;
        unsigned                clip_plane_enable:8;
        unsigned                flatshade:1;
@@ -89,10 +90,36 @@ struct si_dsa_stencil_ref_part {
        uint8_t                 writemask[2];
 };
 
+struct si_dsa_order_invariance {
+       /** Whether the final result in Z/S buffers is guaranteed to be
+        * invariant under changes to the order in which fragments arrive. */
+       bool zs:1;
+
+       /** Whether the set of fragments that pass the combined Z/S test is
+        * guaranteed to be invariant under changes to the order in which
+        * fragments arrive. */
+       bool pass_set:1;
+
+       /** Whether the last fragment that passes the combined Z/S test at each
+        * sample is guaranteed to be invariant under changes to the order in
+        * which fragments arrive. */
+       bool pass_last:1;
+};
+
 struct si_state_dsa {
        struct si_pm4_state             pm4;
-       unsigned                        alpha_func;
        struct si_dsa_stencil_ref_part  stencil_ref;
+
+       /* 0 = without stencil buffer, 1 = when both Z and S buffers are present */
+       struct si_dsa_order_invariance  order_invariance[2];
+
+       ubyte                           alpha_func:3;
+       bool                            depth_enabled:1;
+       bool                            depth_write_enabled:1;
+       bool                            stencil_enabled:1;
+       bool                            stencil_write_enabled:1;
+       bool                            db_can_write:1;
+
 };
 
 struct si_stencil_ref {
@@ -148,6 +175,7 @@ union si_state_atoms {
                struct r600_atom *framebuffer;
                struct r600_atom *msaa_sample_locs;
                struct r600_atom *db_render_state;
+               struct r600_atom *dpbb_state;
                struct r600_atom *msaa_config;
                struct r600_atom *sample_mask;
                struct r600_atom *cb_render_state;
@@ -216,6 +244,11 @@ enum {
 #define SI_NUM_DESCS                   (SI_DESCS_FIRST_SHADER + \
                                         SI_NUM_SHADERS * SI_NUM_SHADER_DESCS)
 
+#define SI_DESCS_SHADER_MASK(name) \
+       u_bit_consecutive(SI_DESCS_FIRST_SHADER + \
+                         PIPE_SHADER_##name * SI_NUM_SHADER_DESCS, \
+                         SI_NUM_SHADER_DESCS)
+
 /* This represents descriptors in memory, such as buffer resources,
  * image resources, and sampler states.
  */
@@ -227,10 +260,8 @@ struct si_descriptors {
 
        /* The buffer where the descriptors have been uploaded. */
        struct r600_resource *buffer;
-       int buffer_offset; /* can be negative if not using lower slots */
+       uint64_t gpu_address;
 
-       /* The size of one descriptor. */
-       ubyte element_dw_size;
        /* The maximum number of descriptors. */
        uint32_t num_elements;
 
@@ -243,14 +274,11 @@ struct si_descriptors {
        /* The SGPR index where the 64-bit pointer to the descriptor array will
         * be stored. */
        ubyte shader_userdata_offset;
-};
-
-struct si_sampler_views {
-       struct pipe_sampler_view        *views[SI_NUM_SAMPLERS];
-       struct si_sampler_state         *sampler_states[SI_NUM_SAMPLERS];
-
-       /* The i-th bit is set if that element is enabled (non-NULL resource). */
-       unsigned                        enabled_mask;
+       /* The size of one descriptor. */
+       ubyte element_dw_size;
+       /* If there is only one slot enabled, bind it directly instead of
+        * uploading descriptors. -1 if disabled. */
+       signed char slot_index_to_bind_directly;
 };
 
 struct si_buffer_resources {
@@ -368,22 +396,44 @@ si_create_sampler_view_custom(struct pipe_context *ctx,
                              unsigned force_level);
 void si_update_fb_dirtiness_after_rendering(struct si_context *sctx);
 
-/* si_state_shader.c */
+/* si_state_binning.c */
+void si_emit_dpbb_state(struct si_context *sctx, struct r600_atom *state);
+
+/* si_state_shaders.c */
 bool si_update_shaders(struct si_context *sctx);
 void si_init_shader_functions(struct si_context *sctx);
 bool si_init_shader_cache(struct si_screen *sscreen);
 void si_destroy_shader_cache(struct si_screen *sscreen);
-void si_init_shader_selector_async(void *job, int thread_index);
 void si_get_active_slot_masks(const struct tgsi_shader_info *info,
                              uint32_t *const_and_shader_buffers,
                              uint64_t *samplers_and_images);
+void *si_get_blit_vs(struct si_context *sctx, enum blitter_attrib_type type,
+                    unsigned num_layers);
 
 /* si_state_draw.c */
 void si_init_ia_multi_vgt_param_table(struct si_context *sctx);
 void si_emit_cache_flush(struct si_context *sctx);
 void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
+void si_draw_rectangle(struct blitter_context *blitter,
+                      void *vertex_elements_cso,
+                      blitter_get_vs_func get_vs,
+                      int x1, int y1, int x2, int y2,
+                      float depth, unsigned num_instances,
+                      enum blitter_attrib_type type,
+                      const union blitter_attrib *attrib);
 void si_trace_emit(struct si_context *sctx);
 
+/* si_state_msaa.c */
+void si_init_msaa_functions(struct si_context *sctx);
+void si_emit_sample_locations(struct radeon_winsys_cs *cs, int nr_samples);
+
+/* si_state_streamout.c */
+void si_streamout_buffers_dirty(struct si_context *sctx);
+void si_emit_streamout_end(struct si_context *sctx);
+void si_update_prims_generated_query_state(struct si_context *sctx,
+                                          unsigned type, int diff);
+void si_init_streamout_functions(struct si_context *sctx);
+
 
 static inline unsigned
 si_tile_mode_index(struct r600_texture *rtex, unsigned level, bool stencil)