static void zstencil_clear(struct brw_context *brw, struct brw_surface *bsurface, unsigned clear_flags, double depth, unsigned stencil ) { enum pipe_error ret; unsigned value; unsigned mask = 0; union fi tmp; if (clear_flags & PIPE_CLEAR_DEPTH) mask |= XY_BLT_WRITE_RGB; switch (bsurface->base.format) { case PIPE_FORMAT_Z32_FLOAT: tmp.f = (float)depth; value = tmp.ui; break; case PIPE_FORMAT_Z24X8_UNORM: case PIPE_FORMAT_Z24_UNORM_S8_USCALED: value = ((unsigned)(depth * MASK24) & MASK24); break; case PIPE_FORMAT_Z16_UNORM: value = ((unsigned)(depth * MASK16) & MASK16); break; default: assert(0); return; } switch (bsurface->base.format) { case PIPE_FORMAT_Z32_FLOAT: mask |= XY_BLT_WRITE_ALPHA; break; case PIPE_FORMAT_Z24X8_UNORM: value = value | (stencil << 24); mask |= XY_BLT_WRITE_ALPHA; break; case PIPE_FORMAT_Z24_UNORM_S8_USCALED: value = value | (stencil << 24); if (clear_flags & PIPE_CLEAR_STENCIL) mask |= XY_BLT_WRITE_ALPHA; break; case PIPE_FORMAT_Z16_UNORM: value = value | (value << 16); mask |= XY_BLT_WRITE_ALPHA; break; default: break; } ret = try_clear( brw, bsurface, value, mask ); if (ret != 0) { brw_context_flush( brw ); ret = try_clear( brw, bsurface, value, mask ); assert( ret == 0 ); } }
static void brw_flush( struct pipe_context *pipe, struct pipe_fence_handle **fence ) { brw_context_flush( brw_context( pipe ) ); if (fence) *fence = NULL; }
static void brw_destroy_context( struct pipe_context *pipe ) { struct brw_context *brw = brw_context(pipe); int i; brw_context_flush( brw ); brw_batchbuffer_free( brw->batch ); brw_destroy_state(brw); brw_draw_cleanup( brw ); brw_pipe_blend_cleanup( brw ); brw_pipe_depth_stencil_cleanup( brw ); brw_pipe_framebuffer_cleanup( brw ); brw_pipe_flush_cleanup( brw ); brw_pipe_misc_cleanup( brw ); brw_pipe_query_cleanup( brw ); brw_pipe_rast_cleanup( brw ); brw_pipe_sampler_cleanup( brw ); brw_pipe_shader_cleanup( brw ); brw_pipe_vertex_cleanup( brw ); brw_pipe_clear_cleanup( brw ); brw_hw_cc_cleanup( brw ); FREE(brw->wm.compile_data); for (i = 0; i < brw->curr.fb.nr_cbufs; i++) pipe_surface_reference(&brw->curr.fb.cbufs[i], NULL); brw->curr.fb.nr_cbufs = 0; pipe_surface_reference(&brw->curr.fb.zsbuf, NULL); bo_reference(&brw->curbe.curbe_bo, NULL); bo_reference(&brw->vs.prog_bo, NULL); bo_reference(&brw->vs.state_bo, NULL); bo_reference(&brw->vs.bind_bo, NULL); bo_reference(&brw->gs.prog_bo, NULL); bo_reference(&brw->gs.state_bo, NULL); bo_reference(&brw->clip.prog_bo, NULL); bo_reference(&brw->clip.state_bo, NULL); bo_reference(&brw->clip.vp_bo, NULL); bo_reference(&brw->sf.prog_bo, NULL); bo_reference(&brw->sf.state_bo, NULL); bo_reference(&brw->sf.vp_bo, NULL); for (i = 0; i < Elements(brw->wm.sdc_bo); i++) bo_reference(&brw->wm.sdc_bo[i], NULL); bo_reference(&brw->wm.bind_bo, NULL); for (i = 0; i < Elements(brw->wm.surf_bo); i++) bo_reference(&brw->wm.surf_bo[i], NULL); bo_reference(&brw->wm.sampler_bo, NULL); bo_reference(&brw->wm.prog_bo, NULL); bo_reference(&brw->wm.state_bo, NULL); }
static void color_clear(struct brw_context *brw, struct brw_surface *bsurface, const float *rgba ) { enum pipe_error ret; union util_color value; util_pack_color( rgba, bsurface->base.format, &value ); if (bsurface->cpp == 2) value.ui |= value.ui << 16; ret = try_clear( brw, bsurface, value.ui, XY_BLT_WRITE_RGB | XY_BLT_WRITE_ALPHA ); if (ret != 0) { brw_context_flush( brw ); ret = try_clear( brw, bsurface, value.ui, XY_BLT_WRITE_RGB | XY_BLT_WRITE_ALPHA ); assert( ret == 0 ); } }