r600g: Close a memory leak of llvm byte streams
[mesa.git] / src / gallium / drivers / r600 / r600_pipe.h
index 8fb0972bfd0d327a7b34647dde3d5f37f1b5f92b..a60a498c9f956e30e35af59a5a8c9d8a5aaf63f4 100644 (file)
@@ -35,7 +35,7 @@
 #include "r600_resource.h"
 #include "evergreen_compute.h"
 
-#define R600_MAX_ATOM                                          17
+#define R600_NUM_ATOMS 28
 
 #define R600_MAX_CONST_BUFFERS 2
 #define R600_MAX_CONST_BUFFER_SIZE 4096
@@ -84,6 +84,14 @@ struct r600_cb_misc_state {
        bool dual_src_blend;
 };
 
+struct r600_clip_misc_state {
+       struct r600_atom atom;
+       unsigned pa_cl_clip_cntl;   /* from rasterizer    */
+       unsigned pa_cl_vs_out_cntl; /* from vertex shader */
+       unsigned clip_plane_enable; /* from rasterizer    */
+       unsigned clip_dist_write;   /* from vertex shader */
+};
+
 struct r600_alphatest_state {
        struct r600_atom atom;
        unsigned sx_alpha_test_control; /* this comes from dsa state */
@@ -92,6 +100,27 @@ struct r600_alphatest_state {
        bool cb0_export_16bpc; /* from set_framebuffer_state */
 };
 
+struct r600_vgt_state {
+       struct r600_atom atom;
+       uint32_t vgt_multi_prim_ib_reset_en;
+       uint32_t vgt_multi_prim_ib_reset_indx;
+};
+
+struct r600_vgt2_state {
+       struct r600_atom atom;
+       uint32_t vgt_indx_offset;
+};
+
+struct r600_blend_color {
+       struct r600_atom atom;
+       struct pipe_blend_color state;
+};
+
+struct r600_clip_state {
+       struct r600_atom atom;
+       struct pipe_clip_state state;
+};
+
 struct r600_cs_shader_state {
        struct r600_atom atom;
        struct r600_pipe_compute *shader;
@@ -102,27 +131,32 @@ struct r600_sample_mask {
        uint16_t sample_mask; /* there are only 8 bits on EG, 16 bits on Cayman */
 };
 
+struct r600_stencil_ref
+{
+       ubyte ref_value[2];
+       ubyte valuemask[2];
+       ubyte writemask[2];
+};
+
+struct r600_stencil_ref_state {
+       struct r600_atom atom;
+       struct r600_stencil_ref state;
+       struct pipe_stencil_ref pipe_state;
+};
+
+struct r600_viewport_state {
+       struct r600_atom atom;
+       struct pipe_viewport_state state;
+};
+
 enum r600_pipe_state_id {
        R600_PIPE_STATE_BLEND = 0,
-       R600_PIPE_STATE_BLEND_COLOR,
-       R600_PIPE_STATE_CONFIG,
-       R600_PIPE_STATE_SEAMLESS_CUBEMAP,
-       R600_PIPE_STATE_CLIP,
        R600_PIPE_STATE_SCISSOR,
-       R600_PIPE_STATE_VIEWPORT,
        R600_PIPE_STATE_RASTERIZER,
-       R600_PIPE_STATE_VGT,
        R600_PIPE_STATE_FRAMEBUFFER,
        R600_PIPE_STATE_DSA,
-       R600_PIPE_STATE_STENCIL_REF,
-       R600_PIPE_STATE_PS_SHADER,
-       R600_PIPE_STATE_VS_SHADER,
-       R600_PIPE_STATE_CONSTANT,
-       R600_PIPE_STATE_SAMPLER,
-       R600_PIPE_STATE_RESOURCE,
        R600_PIPE_STATE_POLYGON_OFFSET,
        R600_PIPE_STATE_FETCH_SHADER,
-       R600_PIPE_STATE_SPI,
        R600_PIPE_NSTATES
 };
 
@@ -261,11 +295,17 @@ struct r600_samplerview_state {
        uint32_t                        compressed_colortex_mask;
 };
 
+struct r600_sampler_states {
+       struct r600_atom                atom;
+       struct r600_pipe_sampler_state  *states[NUM_TEX_UNITS];
+       uint32_t                        enabled_mask;
+       uint32_t                        dirty_mask;
+       uint32_t                        has_bordercolor_mask; /* which states contain the border color */
+};
+
 struct r600_textures_info {
        struct r600_samplerview_state   views;
-       struct r600_atom                atom_sampler;
-       struct r600_pipe_sampler_state  *samplers[NUM_TEX_UNITS];
-       unsigned                        n_samplers;
+       struct r600_sampler_states      states;
        bool                            is_array_sampler[NUM_TEX_UNITS];
 };
 
@@ -286,13 +326,6 @@ struct r600_fence_block {
 #define R600_CONSTANT_ARRAY_SIZE 256
 #define R600_RESOURCE_ARRAY_SIZE 160
 
-struct r600_stencil_ref
-{
-       ubyte ref_value[2];
-       ubyte valuemask[2];
-       ubyte writemask[2];
-};
-
 struct r600_constbuf_state
 {
        struct r600_atom                atom;
@@ -329,15 +362,10 @@ struct r600_context {
        unsigned                        compute_cb_target_mask;
        unsigned                        db_shader_control;
        unsigned                        pa_sc_line_stipple;
-       unsigned                        pa_cl_clip_cntl;
        /* for saving when using blitter */
-       struct pipe_stencil_ref         stencil_ref;
-       struct pipe_viewport_state      viewport;
-       struct pipe_clip_state          clip;
        struct r600_pipe_shader_selector        *ps_shader;
        struct r600_pipe_shader_selector        *vs_shader;
        struct r600_pipe_rasterizer     *rasterizer;
-       struct r600_pipe_state          vgt;
        struct r600_pipe_state          spi;
        struct pipe_query               *current_render_cond;
        unsigned                        current_render_cond_mode;
@@ -359,26 +387,36 @@ struct r600_context {
 
        unsigned default_ps_gprs, default_vs_gprs;
 
+       /******************************/
        /* States based on r600_atom. */
+       struct r600_atom                *atoms[R600_NUM_ATOMS];
+       /* States for CS initialization. */
        struct r600_command_buffer      start_cs_cmd; /* invariant state mostly */
-       struct r600_atom                *atoms[R600_MAX_ATOM];
        /** Compute specific registers initializations.  The start_cs_cmd atom
         *  must be emitted before start_compute_cs_cmd. */
-        struct r600_command_buffer      start_compute_cs_cmd;
+       struct r600_command_buffer      start_compute_cs_cmd;
+       /* Register states. */
        struct r600_alphatest_state     alphatest_state;
+       struct r600_blend_color         blend_color;
        struct r600_cb_misc_state       cb_misc_state;
+       struct r600_clip_misc_state     clip_misc_state;
+       struct r600_clip_state          clip_state;
        struct r600_db_misc_state       db_misc_state;
+       struct r600_seamless_cube_map   seamless_cube_map;
+       struct r600_stencil_ref_state   stencil_ref;
+       struct r600_vgt_state           vgt_state;
+       struct r600_vgt2_state          vgt2_state;
+       struct r600_sample_mask         sample_mask;
+       struct r600_viewport_state      viewport;
+       /* Shaders and shader resources. */
+       struct r600_cs_shader_state     cs_shader_state;
+       struct r600_constbuf_state      constbuf_state[PIPE_SHADER_TYPES];
+       struct r600_textures_info       samplers[PIPE_SHADER_TYPES];
        /** Vertex buffers for fetch shaders */
        struct r600_vertexbuf_state     vertex_buffer_state;
        /** Vertex buffers for compute shaders */
        struct r600_vertexbuf_state     cs_vertex_buffer_state;
-       struct r600_constbuf_state      vs_constbuf_state;
-       struct r600_constbuf_state      ps_constbuf_state;
-       struct r600_textures_info       vs_samplers;
-       struct r600_textures_info       ps_samplers;
-       struct r600_seamless_cube_map   seamless_cube_map;
-       struct r600_cs_shader_state     cs_shader_state;
-       struct r600_sample_mask         sample_mask;
+       /******************************/
 
        /* current external blend state (from state tracker) */
        struct r600_pipe_blend          *blend;
@@ -412,6 +450,10 @@ struct r600_context {
        struct list_head        active_nontimer_queries;
        unsigned                num_cs_dw_nontimer_queries_suspend;
 
+       bool                    timer_queries_suspended;
+       bool                    nontimer_queries_suspended;
+       bool                    streamout_suspended;
+
        unsigned                num_cs_dw_streamout_end;
 
        unsigned                backend_mask;
@@ -444,6 +486,10 @@ struct r600_context {
         * for anything useful. */
        struct r600_resource *dummy_fmask;
        struct r600_resource *dummy_cmask;
+
+       /* Last draw state (-1 = unset). */
+       int                     last_primitive_type; /* Last primitive type used in draw_vbo. */
+       int                     last_start_instance;
 };
 
 static INLINE void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
@@ -566,17 +612,20 @@ void r600_translate_index_buffer(struct r600_context *r600,
 /* r600_state_common.c */
 void r600_init_common_state_functions(struct r600_context *rctx);
 void r600_emit_alphatest_state(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_blend_color(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_vgt_state(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_vgt2_state(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_clip_misc_state(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_stencil_ref(struct r600_context *rctx, struct r600_atom *atom);
+void r600_emit_viewport_state(struct r600_context *rctx, struct r600_atom *atom);
 void r600_init_atom(struct r600_context *rctx, struct r600_atom *atom, unsigned id,
                    void (*emit)(struct r600_context *ctx, struct r600_atom *state),
                    unsigned num_dw);
 void r600_vertex_buffers_dirty(struct r600_context *rctx);
 void r600_sampler_views_dirty(struct r600_context *rctx,
                              struct r600_samplerview_state *state);
-void r600_set_sampler_views(struct pipe_context *pipe,
-                            unsigned shader,
-                            unsigned start,
-                           unsigned count,
-                           struct pipe_sampler_view **views);
+void r600_sampler_states_dirty(struct r600_context *rctx,
+                              struct r600_sampler_states *state);
 void r600_set_max_scissor(struct r600_context *rctx);
 void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state);
 void r600_draw_rectangle(struct blitter_context *blitter,