r600g: use TGSI_PROPERTY to disable viewport and clipping
[mesa.git] / src / gallium / drivers / r600 / r600_pipe.h
index 85bebc3bbf8325fbf5ad6211312d20bc1279ca30..4585ace155e5f55f0ce86d310a920ed43c0c43a3 100644 (file)
 
 #include "r600_llvm.h"
 #include "r600_public.h"
-#include "r600_resource.h"
 
 #include "util/u_blitter.h"
 #include "util/u_suballoc.h"
 #include "util/u_double_list.h"
 #include "util/u_transfer.h"
 
-#define R600_NUM_ATOMS 41
+#define R600_NUM_ATOMS 73
 
 /* the number of CS dwords for flushing and drawing */
 #define R600_MAX_FLUSH_CS_DWORDS       16
-#define R600_MAX_DRAW_CS_DWORDS                34
+#define R600_MAX_DRAW_CS_DWORDS                37
 #define R600_TRACE_CS_DWORDS           7
 
 #define R600_MAX_USER_CONST_BUFFERS 13
-#define R600_MAX_DRIVER_CONST_BUFFERS 3
+#define R600_MAX_DRIVER_CONST_BUFFERS 4
 #define R600_MAX_CONST_BUFFERS (R600_MAX_USER_CONST_BUFFERS + R600_MAX_DRIVER_CONST_BUFFERS)
 
 /* start driver buffers after user buffers */
 #define R600_UCP_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS)
 #define R600_TXQ_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 1)
 #define R600_BUFFER_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 2)
+#define R600_GS_RING_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 3)
 
 #define R600_MAX_CONST_BUFFER_SIZE 4096
 
@@ -108,6 +108,7 @@ struct r600_clip_misc_state {
        unsigned pa_cl_vs_out_cntl; /* from vertex shader */
        unsigned clip_plane_enable; /* from rasterizer    */
        unsigned clip_dist_write;   /* from vertex shader */
+       boolean clip_disable;       /* from vertex shader */
 };
 
 struct r600_alphatest_state {
@@ -159,6 +160,7 @@ struct r600_sample_mask {
 struct r600_config_state {
        struct r600_atom atom;
        unsigned sq_gpr_resource_mgmt_1;
+       unsigned sq_gpr_resource_mgmt_2;
 };
 
 struct r600_stencil_ref
@@ -177,13 +179,25 @@ struct r600_stencil_ref_state {
 struct r600_viewport_state {
        struct r600_atom atom;
        struct pipe_viewport_state state;
+       int idx;
+};
+
+struct r600_shader_stages_state {
+       struct r600_atom atom;
+       unsigned geom_enable;
+};
+
+struct r600_gs_rings_state {
+       struct r600_atom atom;
+       unsigned enable;
+       struct pipe_constant_buffer esgs_ring;
+       struct pipe_constant_buffer gsvs_ring;
 };
 
 /* This must start from 16. */
 /* features */
-#define DBG_NO_LLVM            (1 << 17)
+#define DBG_LLVM               (1 << 17)
 #define DBG_NO_CP_DMA          (1 << 18)
-#define DBG_NO_ASYNC_DMA       (1 << 19)
 /* shader backend */
 #define DBG_NO_SB              (1 << 21)
 #define DBG_SB_CS              (1 << 22)
@@ -204,9 +218,6 @@ struct r600_screen {
         * XXX: Not sure if this is the best place for global_pool.  Also,
         * it's not thread safe, so it won't work with multiple contexts. */
        struct compute_memory_pool *global_pool;
-       struct r600_resource            *trace_bo;
-       uint32_t                        *trace_ptr;
-       unsigned                        cs_count;
 };
 
 struct r600_pipe_sampler_view {
@@ -224,6 +235,7 @@ struct r600_rasterizer_state {
        unsigned                        clip_plane_enable;
        unsigned                        pa_sc_line_stipple;
        unsigned                        pa_cl_clip_cntl;
+       unsigned                        pa_su_sc_mode_cntl;
        float                           offset_units;
        float                           offset_scale;
        bool                            offset_enable;
@@ -347,6 +359,7 @@ struct r600_scissor_state
        struct r600_atom                atom;
        struct pipe_scissor_state       scissor;
        bool                            enable; /* r6xx only */
+       int idx;
 };
 
 struct r600_fetch_shader {
@@ -356,7 +369,7 @@ struct r600_fetch_shader {
 
 struct r600_shader_state {
        struct r600_atom                atom;
-       struct r600_pipe_shader_selector *shader;
+       struct r600_pipe_shader *shader;
 };
 
 struct r600_context {
@@ -364,7 +377,6 @@ struct r600_context {
        struct r600_screen              *screen;
        struct blitter_context          *blitter;
        struct u_suballocator           *allocator_fetch_shader;
-       unsigned                        initial_gfx_cs_size;
 
        /* Hardware info. */
        boolean                         has_vertex_cache;
@@ -408,17 +420,21 @@ struct r600_context {
        struct r600_poly_offset_state   poly_offset_state;
        struct r600_cso_state           rasterizer_state;
        struct r600_sample_mask         sample_mask;
-       struct r600_scissor_state       scissor;
+       struct r600_scissor_state       scissor[16];
        struct r600_seamless_cube_map   seamless_cube_map;
        struct r600_config_state        config_state;
        struct r600_stencil_ref_state   stencil_ref;
        struct r600_vgt_state           vgt_state;
-       struct r600_viewport_state      viewport;
+       struct r600_viewport_state      viewport[16];
        /* Shaders and shader resources. */
        struct r600_cso_state           vertex_fetch_shader;
        struct r600_shader_state        vertex_shader;
        struct r600_shader_state        pixel_shader;
+       struct r600_shader_state        geometry_shader;
+       struct r600_shader_state        export_shader;
        struct r600_cs_shader_state     cs_shader_state;
+       struct r600_shader_stages_state shader_stages;
+       struct r600_gs_rings_state      gs_rings;
        struct r600_constbuf_state      constbuf_state[PIPE_SHADER_TYPES];
        struct r600_textures_info       samplers[PIPE_SHADER_TYPES];
        /** Vertex buffers for fetch shaders */
@@ -430,6 +446,7 @@ struct r600_context {
        unsigned                        compute_cb_target_mask;
        struct r600_pipe_shader_selector *ps_shader;
        struct r600_pipe_shader_selector *vs_shader;
+       struct r600_pipe_shader_selector *gs_shader;
        struct r600_rasterizer_state    *rasterizer;
        bool                            alpha_to_one;
        bool                            force_blend_disable;
@@ -461,7 +478,7 @@ static INLINE void r600_emit_atom(struct r600_context *rctx, struct r600_atom *a
 {
        atom->emit(&rctx->b, atom);
        atom->dirty = false;
-       if (rctx->screen->trace_bo) {
+       if (rctx->screen->b.trace_bo) {
                r600_trace_emit(rctx);
        }
 }
@@ -496,7 +513,8 @@ struct pipe_sampler_view *
 evergreen_create_sampler_view_custom(struct pipe_context *ctx,
                                     struct pipe_resource *texture,
                                     const struct pipe_sampler_view *state,
-                                    unsigned width0, unsigned height0);
+                                    unsigned width0, unsigned height0,
+                                    unsigned force_level);
 void evergreen_init_common_regs(struct r600_command_buffer *cb,
                                enum chip_class ctx_chip_class,
                                enum radeon_family ctx_family,
@@ -509,6 +527,8 @@ void cayman_init_common_regs(struct r600_command_buffer *cb,
 void evergreen_init_state_functions(struct r600_context *rctx);
 void evergreen_init_atom_start_cs(struct r600_context *rctx);
 void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
+void evergreen_update_es_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
+void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
 void evergreen_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
 void *evergreen_create_db_flush_dsa(struct r600_context *rctx);
 void *evergreen_create_resolve_blend(struct r600_context *rctx);
@@ -532,12 +552,6 @@ void r600_decompress_depth_textures(struct r600_context *rctx,
 void r600_decompress_color_textures(struct r600_context *rctx,
                                    struct r600_samplerview_state *textures);
 
-/* r600_pipe.c */
-const char * r600_llvm_gpu_string(enum radeon_family family);
-
-/* r600_resource.c */
-void r600_init_context_resource_functions(struct r600_context *r600);
-
 /* r600_shader.c */
 int r600_pipe_shader_create(struct pipe_context *ctx,
                            struct r600_pipe_shader *shader,
@@ -554,6 +568,8 @@ r600_create_sampler_view_custom(struct pipe_context *ctx,
 void r600_init_state_functions(struct r600_context *rctx);
 void r600_init_atom_start_cs(struct r600_context *rctx);
 void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
+void r600_update_es_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
+void r600_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
 void r600_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
 void *r600_create_db_flush_dsa(struct r600_context *rctx);
 void *r600_create_resolve_blend(struct r600_context *rctx);
@@ -568,11 +584,11 @@ boolean r600_is_format_supported(struct pipe_screen *screen,
 void r600_update_db_shader_control(struct r600_context * rctx);
 
 /* r600_hw_context.c */
-void r600_context_flush(struct r600_context *ctx, unsigned flags);
+void r600_context_gfx_flush(void *context, unsigned flags,
+                           struct pipe_fence_handle **fence);
 void r600_begin_new_cs(struct r600_context *ctx);
 void r600_flush_emit(struct r600_context *ctx);
 void r600_need_cs_space(struct r600_context *ctx, unsigned num_dw, boolean count_draw_in);
-void r600_need_dma_space(struct r600_context *ctx, unsigned num_dw);
 void r600_cp_dma_copy_buffer(struct r600_context *rctx,
                             struct pipe_resource *dst, uint64_t dst_offset,
                             struct pipe_resource *src, uint64_t src_offset,
@@ -580,22 +596,22 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx,
 void evergreen_cp_dma_clear_buffer(struct r600_context *rctx,
                                   struct pipe_resource *dst, uint64_t offset,
                                   unsigned size, uint32_t clear_value);
-void r600_dma_copy(struct r600_context *rctx,
-               struct pipe_resource *dst,
-               struct pipe_resource *src,
-               uint64_t dst_offset,
-               uint64_t src_offset,
-               uint64_t size);
+void r600_dma_copy_buffer(struct r600_context *rctx,
+                         struct pipe_resource *dst,
+                         struct pipe_resource *src,
+                         uint64_t dst_offset,
+                         uint64_t src_offset,
+                         uint64_t size);
 
 /*
  * evergreen_hw_context.c
  */
-void evergreen_dma_copy(struct r600_context *rctx,
-               struct pipe_resource *dst,
-               struct pipe_resource *src,
-               uint64_t dst_offset,
-               uint64_t src_offset,
-               uint64_t size);
+void evergreen_dma_copy_buffer(struct r600_context *rctx,
+                              struct pipe_resource *dst,
+                              struct pipe_resource *src,
+                              uint64_t dst_offset,
+                              uint64_t src_offset,
+                              uint64_t size);
 
 /* r600_state_common.c */
 void r600_init_common_state_functions(struct r600_context *rctx);
@@ -636,6 +652,8 @@ unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
 uint32_t r600_translate_texformat(struct pipe_screen *screen, enum pipe_format format,
                                  const unsigned char *swizzle_view,
                                  uint32_t *word4_p, uint32_t *yuv_format_p);
+uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format format);
+uint32_t r600_colorformat_endian_swap(uint32_t colorformat);
 
 /* r600_uvd.c */
 struct pipe_video_codec *r600_uvd_create_decoder(struct pipe_context *context,
@@ -812,15 +830,6 @@ static INLINE uint32_t S_FIXED(float value, uint32_t frac_bits)
 }
 #define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y))
 
-static inline unsigned r600_tex_aniso_filter(unsigned filter)
-{
-       if (filter <= 1)   return 0;
-       if (filter <= 2)   return 1;
-       if (filter <= 4)   return 2;
-       if (filter <= 8)   return 3;
-        /* else */        return 4;
-}
-
 /* 12.4 fixed-point */
 static INLINE unsigned r600_pack_float_12p4(float x)
 {
@@ -828,4 +837,40 @@ static INLINE unsigned r600_pack_float_12p4(float x)
               x >= 4096 ? 0xffff : x * 16;
 }
 
+/* Return if the depth format can be read without the DB->CB copy on r6xx-r7xx. */
+static INLINE bool r600_can_read_depth(struct r600_texture *rtex)
+{
+       return rtex->resource.b.b.nr_samples <= 1 &&
+              (rtex->resource.b.b.format == PIPE_FORMAT_Z16_UNORM ||
+               rtex->resource.b.b.format == PIPE_FORMAT_Z32_FLOAT);
+}
+
+#define     V_028A6C_OUTPRIM_TYPE_POINTLIST            0
+#define     V_028A6C_OUTPRIM_TYPE_LINESTRIP            1
+#define     V_028A6C_OUTPRIM_TYPE_TRISTRIP             2
+
+static INLINE unsigned r600_conv_prim_to_gs_out(unsigned mode)
+{
+       static const int prim_conv[] = {
+               V_028A6C_OUTPRIM_TYPE_POINTLIST,
+               V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               V_028A6C_OUTPRIM_TYPE_TRISTRIP
+       };
+       assert(mode < Elements(prim_conv));
+
+       return prim_conv[mode];
+}
+
 #endif