util: reference surfaces and sampler views in blitter when saving them
[mesa.git] / src / gallium / drivers / llvmpipe / lp_state_surface.c
index d71e1a7ebb13947e02bbd341f0a462fea63371ad..4b135aaf8ba575126c3eb8c607b9f57efcdf01c2 100644 (file)
 /* Authors:  Keith Whitwell <keith@tungstengraphics.com>
  */
 
+#include "pipe/p_state.h"
+#include "util/u_inlines.h"
+#include "util/u_framebuffer.h"
+#include "util/u_surface.h"
 #include "lp_context.h"
+#include "lp_scene.h"
 #include "lp_state.h"
-#include "lp_surface.h"
-#include "lp_tile_cache.h"
+#include "lp_setup.h"
 
 #include "draw/draw_context.h"
 
+#include "util/u_format.h"
+
 
 /**
- * XXX this might get moved someday
  * Set the framebuffer surface info: color buffers, zbuffer, stencil buffer.
- * Here, we flush the old surfaces and update the tile cache to point to the new
- * surfaces.
  */
 void
 llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
                                const struct pipe_framebuffer_state *fb)
 {
    struct llvmpipe_context *lp = llvmpipe_context(pipe);
-   uint i;
-
-   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
-      /* check if changing cbuf */
-      if (lp->framebuffer.cbufs[i] != fb->cbufs[i]) {
-         /* flush old */
-         lp_flush_tile_cache(lp, lp->cbuf_cache[i]);
-
-         /* assign new */
-         lp->framebuffer.cbufs[i] = fb->cbufs[i];
-
-         /* update cache */
-         lp_tile_cache_set_surface(lp->cbuf_cache[i], fb->cbufs[i]);
-      }
-   }
-
-   lp->framebuffer.nr_cbufs = fb->nr_cbufs;
-
-   /* zbuf changing? */
-   if (lp->framebuffer.zsbuf != fb->zsbuf) {
-      /* flush old */
-      lp_flush_tile_cache(lp, lp->zsbuf_cache);
 
-      /* assign new */
-      lp->framebuffer.zsbuf = fb->zsbuf;
-
-      /* update cache */
-      lp_tile_cache_set_surface(lp->zsbuf_cache, fb->zsbuf);
-   }
+   boolean changed = !util_framebuffer_state_equal(&lp->framebuffer, fb);
 
-#if 0
-   /* XXX combined depth/stencil here */
+   assert(fb->width <= LP_MAX_WIDTH);
+   assert(fb->height <= LP_MAX_HEIGHT);
 
-   /* sbuf changing? */
-   if (lp->framebuffer.sbuf != fb->sbuf) {
-      /* flush old */
-      lp_flush_tile_cache(lp, lp->sbuf_cache_sep);
+   if (changed) {
 
-      /* assign new */
-      lp->framebuffer.sbuf = fb->sbuf;
+      util_copy_framebuffer_state(&lp->framebuffer, fb);
 
-      /* update cache */
-      if (fb->sbuf != fb->zbuf) {
-         /* separate stencil buf */
-         lp->sbuf_cache = lp->sbuf_cache_sep;
-         lp_tile_cache_set_surface(lp->sbuf_cache, fb->sbuf);
-      }
-      else {
-         /* combined depth/stencil */
-         lp->sbuf_cache = lp->zbuf_cache;
-         lp_tile_cache_set_surface(lp->sbuf_cache, fb->sbuf);
-      }
-   }
-#endif
-
-   /* Tell draw module how deep the Z/depth buffer is */
-   {
-      int depth_bits;
-      double mrd;
+      /* Tell draw module how deep the Z/depth buffer is */
       if (lp->framebuffer.zsbuf) {
-         depth_bits = pf_get_component_bits(lp->framebuffer.zsbuf->format,
-                                            PIPE_FORMAT_COMP_Z);
-      }
-      else {
-         depth_bits = 0;
+         int depth_bits;
+         double mrd;
+         depth_bits = util_format_get_component_bits(lp->framebuffer.zsbuf->format,
+                                                     UTIL_FORMAT_COLORSPACE_ZS,
+                                                     0);
+         if (depth_bits > 16) {
+            mrd = 0.0000001;
+         }
+         else {
+            mrd = 0.00002;
+         }
+         draw_set_mrd(lp->draw, mrd);
       }
-      if (depth_bits > 16) {
-         mrd = 0.0000001;
-      }
-      else {
-         mrd = 0.00002;
-      }
-      draw_set_mrd(lp->draw, mrd);
-   }
 
-   lp->framebuffer.width = fb->width;
-   lp->framebuffer.height = fb->height;
+      lp_setup_bind_framebuffer( lp->setup, &lp->framebuffer );
 
-   lp->dirty |= SP_NEW_FRAMEBUFFER;
+      lp->dirty |= LP_NEW_FRAMEBUFFER;
+   }
 }