/** * 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 softpipe_set_framebuffer_state(struct pipe_context *pipe, const struct pipe_framebuffer_state *fb) { struct softpipe_context *sp = softpipe_context(pipe); uint i; draw_flush(sp->draw); for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { struct pipe_surface *cb = i < fb->nr_cbufs ? fb->cbufs[i] : NULL; /* check if changing cbuf */ if (sp->framebuffer.cbufs[i] != cb) { /* flush old */ sp_flush_tile_cache(sp->cbuf_cache[i]); /* assign new */ pipe_surface_reference(&sp->framebuffer.cbufs[i], cb); /* update cache */ sp_tile_cache_set_surface(sp->cbuf_cache[i], cb); } } sp->framebuffer.nr_cbufs = fb->nr_cbufs; /* zbuf changing? */ if (sp->framebuffer.zsbuf != fb->zsbuf) { /* flush old */ sp_flush_tile_cache(sp->zsbuf_cache); /* assign new */ pipe_surface_reference(&sp->framebuffer.zsbuf, fb->zsbuf); /* update cache */ sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf); /* Tell draw module how deep the Z/depth buffer is * * If no depth buffer is bound, send the utility function the * format for no bound depth (PIPE_FORMAT_NONE). */ draw_set_zs_format(sp->draw, (sp->framebuffer.zsbuf) ? sp->framebuffer.zsbuf->format : PIPE_FORMAT_NONE); } sp->framebuffer.width = fb->width; sp->framebuffer.height = fb->height; sp->framebuffer.samples = fb->samples; sp->framebuffer.layers = fb->layers; sp->dirty |= SP_NEW_FRAMEBUFFER; }
static enum pipe_error update_swtnl_draw( struct svga_context *svga, unsigned dirty ) { draw_flush( svga->swtnl.draw ); if (dirty & SVGA_NEW_VS) draw_bind_vertex_shader(svga->swtnl.draw, svga->curr.vs->draw_shader); if (dirty & SVGA_NEW_FS) draw_bind_fragment_shader(svga->swtnl.draw, svga->curr.fs->draw_shader); if (dirty & SVGA_NEW_VBUFFER) draw_set_vertex_buffers(svga->swtnl.draw, 0, svga->curr.num_vertex_buffers, svga->curr.vb); if (dirty & SVGA_NEW_VELEMENT) draw_set_vertex_elements(svga->swtnl.draw, svga->curr.velems->count, svga->curr.velems->velem ); if (dirty & SVGA_NEW_CLIP) draw_set_clip_state(svga->swtnl.draw, &svga->curr.clip); if (dirty & (SVGA_NEW_VIEWPORT | SVGA_NEW_REDUCED_PRIMITIVE | SVGA_NEW_RAST)) set_draw_viewport( svga ); if (dirty & SVGA_NEW_RAST) draw_set_rasterizer_state(svga->swtnl.draw, &svga->curr.rast->templ, (void *) svga->curr.rast); /* Tell the draw module how deep the Z/depth buffer is. * * If no depth buffer is bound, send the utility function the * format for no bound depth (PIPE_FORMAT_NONE). */ if (dirty & SVGA_NEW_FRAME_BUFFER) draw_set_zs_format(svga->swtnl.draw, (svga->curr.framebuffer.zsbuf) ? svga->curr.framebuffer.zsbuf->format : PIPE_FORMAT_NONE); return PIPE_OK; }