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); if (dirty & SVGA_NEW_FRAME_BUFFER) draw_set_mrd(svga->swtnl.draw, svga->curr.depthscale); return 0; }
/** * Set the framebuffer surface info: color buffers, zbuffer, stencil buffer. */ void llvmpipe_set_framebuffer_state(struct pipe_context *pipe, const struct pipe_framebuffer_state *fb) { struct llvmpipe_context *lp = llvmpipe_context(pipe); boolean changed = !util_framebuffer_state_equal(&lp->framebuffer, fb); assert(fb->width <= LP_MAX_WIDTH); assert(fb->height <= LP_MAX_HEIGHT); if (changed) { util_copy_framebuffer_state(&lp->framebuffer, fb); if (LP_PERF & PERF_NO_DEPTH) { pipe_surface_reference(&lp->framebuffer.zsbuf, NULL); } /* Tell draw module how deep the Z/depth buffer is */ if (lp->framebuffer.zsbuf) { 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; } lp->mrd = mrd; draw_set_mrd(lp->draw, mrd); } lp_setup_bind_framebuffer( lp->setup, &lp->framebuffer ); lp->dirty |= LP_NEW_FRAMEBUFFER; } }
/** * Set the framebuffer surface info: color buffers, zbuffer, stencil buffer. */ void llvmpipe_set_framebuffer_state(struct pipe_context *pipe, const struct pipe_framebuffer_state *fb) { struct llvmpipe_context *lp = llvmpipe_context(pipe); boolean changed = !util_framebuffer_state_equal(&lp->framebuffer, fb); assert(fb->width <= LP_MAX_WIDTH); assert(fb->height <= LP_MAX_HEIGHT); if (changed) { util_copy_framebuffer_state(&lp->framebuffer, fb); if (LP_PERF & PERF_NO_DEPTH) { pipe_surface_reference(&lp->framebuffer.zsbuf, NULL); } /* Tell draw module how deep the Z/depth buffer is. * * If no depth buffer is bound, send the utility function the default * format for no bound depth (PIPE_FORMAT_NONE). * * FIXME: mrd constant isn't right should use a value derived from * current primitive not a constant (for float depth buffers) */ lp->mrd = util_get_depth_format_mrd((lp->framebuffer.zsbuf) ? lp->framebuffer.zsbuf->format : PIPE_FORMAT_NONE); draw_set_mrd(lp->draw, lp->mrd); lp_setup_bind_framebuffer( lp->setup, &lp->framebuffer ); lp->dirty |= LP_NEW_FRAMEBUFFER; } }