r600,compute: Plug few memory leaks
[mesa.git] / src / gallium / drivers / radeon / r600_pipe_common.h
index f21a0b3a1888b94d6591714f03bdbf5de8846fd9..a8928f254f0c51d9f69ac7b2db0176fb311ad8ff 100644 (file)
 #define R600_RESOURCE_FLAG_FLUSHED_DEPTH       (PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
 #define R600_RESOURCE_FLAG_FORCE_TILING                (PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
 
-#define R600_QUERY_DRAW_CALLS          (PIPE_QUERY_DRIVER_SPECIFIC + 0)
-#define R600_QUERY_REQUESTED_VRAM      (PIPE_QUERY_DRIVER_SPECIFIC + 1)
-#define R600_QUERY_REQUESTED_GTT       (PIPE_QUERY_DRIVER_SPECIFIC + 2)
-#define R600_QUERY_BUFFER_WAIT_TIME    (PIPE_QUERY_DRIVER_SPECIFIC + 3)
-#define R600_QUERY_NUM_CS_FLUSHES      (PIPE_QUERY_DRIVER_SPECIFIC + 4)
-#define R600_QUERY_NUM_BYTES_MOVED     (PIPE_QUERY_DRIVER_SPECIFIC + 5)
-#define R600_QUERY_VRAM_USAGE          (PIPE_QUERY_DRIVER_SPECIFIC + 6)
-#define R600_QUERY_GTT_USAGE           (PIPE_QUERY_DRIVER_SPECIFIC + 7)
-#define R600_QUERY_GPU_TEMPERATURE     (PIPE_QUERY_DRIVER_SPECIFIC + 8)
-#define R600_QUERY_CURRENT_GPU_SCLK    (PIPE_QUERY_DRIVER_SPECIFIC + 9)
-#define R600_QUERY_CURRENT_GPU_MCLK    (PIPE_QUERY_DRIVER_SPECIFIC + 10)
-#define R600_QUERY_GPU_LOAD            (PIPE_QUERY_DRIVER_SPECIFIC + 11)
-#define R600_QUERY_NUM_COMPILATIONS    (PIPE_QUERY_DRIVER_SPECIFIC + 12)
-#define R600_QUERY_NUM_SHADERS_CREATED (PIPE_QUERY_DRIVER_SPECIFIC + 13)
-
 #define R600_CONTEXT_STREAMOUT_FLUSH           (1u << 0)
 #define R600_CONTEXT_PRIVATE_FLAG              (1u << 1)
 
@@ -71,7 +56,7 @@
 /* Debug flags. */
 /* logging */
 #define DBG_TEX                        (1 << 0)
-#define DBG_TEXMIP             (1 << 1)
+/* gap - reuse */
 #define DBG_COMPUTE            (1 << 2)
 #define DBG_VM                 (1 << 3)
 #define DBG_TRACE_CS           (1 << 4)
 #define DBG_INFO               (1llu << 40)
 #define DBG_NO_WC              (1llu << 41)
 #define DBG_CHECK_VM           (1llu << 42)
+#define DBG_NO_DCC             (1llu << 43)
+#define DBG_NO_DCC_CLEAR       (1llu << 44)
+#define DBG_NO_RB_PLUS         (1llu << 45)
 
 #define R600_MAP_BUFFER_ALIGNMENT 64
 
 struct r600_common_context;
+struct r600_perfcounters;
 
 struct radeon_shader_reloc {
        char *name;
@@ -140,12 +129,14 @@ struct radeon_shader_binary {
        char *disasm_string;
 };
 
+void radeon_shader_binary_init(struct radeon_shader_binary *b);
+void radeon_shader_binary_clean(struct radeon_shader_binary *b);
+
 struct r600_resource {
        struct u_resource               b;
 
        /* Winsys objects. */
        struct pb_buffer                *buf;
-       struct radeon_winsys_cs_handle  *cs_buf;
        uint64_t                        gpu_address;
 
        /* Resource state. */
@@ -184,7 +175,7 @@ struct r600_fmask_info {
        unsigned offset;
        unsigned size;
        unsigned alignment;
-       unsigned pitch;
+       unsigned pitch_in_pixels;
        unsigned bank_height;
        unsigned slice_tile_max;
        unsigned tile_mode_index;
@@ -194,15 +185,25 @@ struct r600_cmask_info {
        unsigned offset;
        unsigned size;
        unsigned alignment;
+       unsigned pitch;
+       unsigned height;
+       unsigned xalign;
+       unsigned yalign;
        unsigned slice_tile_max;
        unsigned base_address_reg;
 };
 
+struct r600_htile_info {
+       unsigned pitch;
+       unsigned height;
+       unsigned xalign;
+       unsigned yalign;
+};
+
 struct r600_texture {
        struct r600_resource            resource;
 
        unsigned                        size;
-       unsigned                        pitch_override;
        bool                            is_depth;
        unsigned                        dirty_level_mask; /* each bit says if that mipmap is compressed */
        unsigned                        stencil_dirty_level_mask; /* each bit says if that mipmap is compressed */
@@ -219,9 +220,12 @@ struct r600_texture {
        unsigned                        color_clear_value[2];
 
        /* Depth buffer compression and fast clear. */
+       struct r600_htile_info          htile;
        struct r600_resource            *htile_buffer;
        bool                            depth_cleared; /* if it was cleared at least once */
        float                           depth_clear_value;
+       bool                            stencil_cleared; /* if it was cleared at least once */
+       uint8_t                         stencil_clear_value;
 
        bool                            non_disp_tiling; /* R600-Cayman only */
 };
@@ -235,6 +239,7 @@ struct r600_surface {
        /* Misc. color flags. */
        bool alphatest_bypass;
        bool export_16bpc;
+       bool color_is_int8;
 
        /* Color registers. */
        unsigned cb_color_info;
@@ -251,6 +256,12 @@ struct r600_surface {
        unsigned cb_color_fmask_slice;  /* EG and later */
        unsigned cb_color_cmask;        /* CB_COLORn_TILE (r600 only) */
        unsigned cb_color_mask;         /* R600 only */
+       unsigned spi_shader_col_format;         /* SI+, no blending, no alpha-to-coverage. */
+       unsigned spi_shader_col_format_alpha;   /* SI+, alpha-to-coverage */
+       unsigned spi_shader_col_format_blend;   /* SI+, blending without alpha. */
+       unsigned spi_shader_col_format_blend_alpha; /* SI+, blending with alpha. */
+       unsigned sx_ps_downconvert;     /* Stoney only */
+       unsigned sx_blend_opt_epsilon;  /* Stoney only */
        struct r600_resource *cb_buffer_fmask; /* Used for FMASK relocations. R600 only */
        struct r600_resource *cb_buffer_cmask; /* Used for CMASK relocations. R600 only */
 
@@ -313,6 +324,9 @@ struct r600_common_screen {
        volatile unsigned               gpu_load_stop_thread; /* bool */
 
        char                            renderer_string[64];
+
+       /* Performance counters. */
+       struct r600_perfcounters        *perfcounters;
 };
 
 /* This encapsulates a state or an operation which can emitted into the GPU
@@ -363,16 +377,10 @@ struct r600_streamout {
 
 struct r600_ring {
        struct radeon_winsys_cs         *cs;
-       bool                            flushing;
        void (*flush)(void *ctx, unsigned flags,
                      struct pipe_fence_handle **fence);
 };
 
-struct r600_rings {
-       struct r600_ring                gfx;
-       struct r600_ring                dma;
-};
-
 struct r600_common_context {
        struct pipe_context b; /* base class */
 
@@ -381,7 +389,9 @@ struct r600_common_context {
        struct radeon_winsys_ctx        *ctx;
        enum radeon_family              family;
        enum chip_class                 chip_class;
-       struct r600_rings               rings;
+       struct r600_ring                gfx;
+       struct r600_ring                dma;
+       struct pipe_fence_handle        *last_sdma_fence;
        unsigned                        initial_gfx_cs_size;
        unsigned                        gpu_reset_counter;
 
@@ -409,9 +419,8 @@ struct r600_common_context {
        struct list_head                active_nontimer_queries;
        struct list_head                active_timer_queries;
        unsigned                        num_cs_dw_nontimer_queries_suspend;
+       bool                            nontimer_queries_suspended_by_flush;
        unsigned                        num_cs_dw_timer_queries_suspend;
-       /* If queries have been suspended. */
-       bool                            queries_suspended_for_flush;
        /* Additional hardware info. */
        unsigned                        backend_mask;
        unsigned                        max_db; /* for OQ */
@@ -419,14 +428,11 @@ struct r600_common_context {
        unsigned                        num_draw_calls;
 
        /* Render condition. */
-       struct pipe_query               *current_render_cond;
-       unsigned                        current_render_cond_mode;
-       boolean                         current_render_cond_cond;
-       boolean                         predicate_drawing;
-       /* For context flushing. */
-       struct pipe_query               *saved_render_cond;
-       boolean                         saved_render_cond_cond;
-       unsigned                        saved_render_cond_mode;
+       struct r600_atom                render_cond_atom;
+       struct pipe_query               *render_cond;
+       unsigned                        render_cond_mode;
+       boolean                         render_cond_invert;
+       bool                            render_cond_force_off; /* for u_blitter */
 
        /* MSAA sample locations.
         * The first index is the sample index.
@@ -442,6 +448,8 @@ struct r600_common_context {
         * the GPU addresses are updated. */
        struct list_head                texture_buffers;
 
+       struct pipe_debug_callback      debug;
+
        /* Copy one resource to another using async DMA. */
        void (*dma_copy)(struct pipe_context *ctx,
                         struct pipe_resource *dst,
@@ -479,7 +487,7 @@ struct r600_common_context {
 
 /* r600_buffer.c */
 boolean r600_rings_is_buffer_referenced(struct r600_common_context *ctx,
-                                       struct radeon_winsys_cs_handle *buf,
+                                       struct pb_buffer *buf,
                                        enum radeon_bo_usage usage);
 void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
                                       struct r600_resource *resource,
@@ -500,6 +508,9 @@ struct pipe_resource *
 r600_buffer_from_user_memory(struct pipe_screen *screen,
                             const struct pipe_resource *templ,
                             void *user_memory);
+void
+r600_invalidate_resource(struct pipe_context *ctx,
+                        struct pipe_resource *resource);
 
 /* r600_common_pipe.c */
 void r600_draw_rectangle(struct blitter_context *blitter,
@@ -516,7 +527,7 @@ bool r600_common_context_init(struct r600_common_context *rctx,
 void r600_common_context_cleanup(struct r600_common_context *rctx);
 void r600_context_add_resource_size(struct pipe_context *ctx, struct pipe_resource *r);
 bool r600_can_dump_shader(struct r600_common_screen *rscreen,
-                         const struct tgsi_token *tokens);
+                         unsigned processor);
 void r600_screen_clear_buffer(struct r600_common_screen *rscreen, struct pipe_resource *dst,
                              unsigned offset, unsigned size, unsigned value,
                              bool is_framebuffer);
@@ -530,7 +541,11 @@ void r600_gpu_load_kill_thread(struct r600_common_screen *rscreen);
 uint64_t r600_gpu_load_begin(struct r600_common_screen *rscreen);
 unsigned r600_gpu_load_end(struct r600_common_screen *rscreen, uint64_t begin);
 
+/* r600_perfcounters.c */
+void r600_perfcounters_destroy(struct r600_common_screen *rscreen);
+
 /* r600_query.c */
+void r600_init_screen_query_functions(struct r600_common_screen *rscreen);
 void r600_query_init(struct r600_common_context *rctx);
 void r600_suspend_nontimer_queries(struct r600_common_context *ctx);
 void r600_resume_nontimer_queries(struct r600_common_context *ctx);
@@ -560,6 +575,7 @@ void r600_texture_get_cmask_info(struct r600_common_screen *rscreen,
 bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
                                     struct pipe_resource *texture,
                                     struct r600_texture **staging);
+void r600_print_texture_info(struct r600_texture *rtex, FILE *f);
 struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
                                        const struct pipe_resource *templ);
 struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe,