r600g: add cs memory usage accounting and limit it v3 (backport for mesa 9.0)
[profile/ivi/mesa.git] / src / gallium / drivers / r600 / r600_pipe.h
index 8c718a7..ba75c9d 100644 (file)
@@ -83,6 +83,7 @@ struct r600_db_misc_state {
        bool flush_depthstencil_through_cb;
        bool copy_depth, copy_stencil;
        unsigned copy_sample;
+       unsigned log_samples;
 };
 
 struct r600_cb_misc_state {
@@ -370,6 +371,10 @@ struct r600_context {
 
        unsigned default_ps_gprs, default_vs_gprs;
 
+       /* current unaccounted memory usage */
+       uint64_t                        vram;
+       uint64_t                        gtt;
+
        /* States based on r600_atom. */
        struct list_head                dirty_states;
        struct r600_command_buffer      start_cs_cmd; /* invariant state mostly */
@@ -885,4 +890,28 @@ static INLINE uint64_t r600_resource_va(struct pipe_screen *screen, struct pipe_
        return rscreen->ws->buffer_get_virtual_address(rresource->cs_buf);
 }
 
+static INLINE void r600_context_add_resource_size(struct pipe_context *ctx, struct pipe_resource *r)
+{
+       struct r600_context *rctx = (struct r600_context *)ctx;
+       struct r600_resource *rr = (struct r600_resource *)r;
+
+       if (r == NULL) {
+               return;
+       }
+
+       /*
+        * The idea is to compute a gross estimate of memory requirement of
+        * each draw call. After each draw call, memory will be precisely
+        * accounted. So the uncertainty is only on the current draw call.
+        * In practice this gave very good estimate (+/- 10% of the target
+        * memory limit).
+        */
+       if (rr->domains & RADEON_DOMAIN_GTT) {
+               rctx->gtt += rr->buf->size;
+       }
+       if (rr->domains & RADEON_DOMAIN_VRAM) {
+               rctx->vram += rr->buf->size;
+       }
+}
+
 #endif