/* 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 |= LP_NEW_FRAMEBUFFER;
+ lp->dirty |= LP_NEW_FRAMEBUFFER;
+ }
}