void dfb_surfacemanager_enumerate_chunks( SurfaceManager *manager, SMChunkCallback callback, void *ctx ) { Chunk *c; D_ASSERT( manager != NULL ); D_ASSERT( callback != NULL ); D_MAGIC_ASSERT( manager, SurfaceManager ); dfb_surfacemanager_lock( manager ); c = manager->chunks; while (c) { if (callback( c->buffer, c->offset, c->length, c->tolerations, ctx) == DFENUM_CANCEL) break; c = c->next; } dfb_surfacemanager_unlock( manager ); }
DFBResult dfb_surfacemanager_suspend( SurfaceManager *manager ) { Chunk *c; D_MAGIC_ASSERT( manager, SurfaceManager ); dfb_surfacemanager_lock( manager ); manager->suspended = true; c = manager->chunks; while (c) { if (c->buffer && c->buffer->policy != CSP_VIDEOONLY && c->buffer->video.health == CSH_STORED) { dfb_surfacemanager_assure_system( manager, c->buffer ); c->buffer->video.health = CSH_RESTORE; } c = c->next; } dfb_surfacemanager_unlock( manager ); return DFB_OK; }
DFBResult dfb_surfacemanager_resume( SurfaceManager *manager ) { D_MAGIC_ASSERT( manager, SurfaceManager ); dfb_surfacemanager_lock( manager ); manager->suspended = false; dfb_surfacemanager_unlock( manager ); return DFB_OK; }
void dfb_clear_depth( CoreSurface *surface, const DFBRegion *region ) { #if FIXME_SC_3 SurfaceBuffer *tmp; DFBRectangle rect = { 0, 0, surface->config.size.w - 1, surface->config.size.h - 1 }; if (region && !dfb_rectangle_intersect_by_region( &rect, region )) return; pthread_mutex_lock( &cd_lock ); if (!cd_state_inited) { dfb_state_init( &cd_state, NULL ); cd_state.color.r = 0xff; cd_state.color.g = 0xff; cd_state.color.b = 0xff; cd_state_inited = true; } cd_state.modified |= SMF_CLIP | SMF_DESTINATION; cd_state.clip.x2 = surface->config.size.w - 1; cd_state.clip.y2 = surface->config.size.h - 1; cd_state.destination = surface; dfb_surfacemanager_lock( surface->manager ); tmp = surface->back_buffer; surface->back_buffer = surface->depth_buffer; dfb_gfxcard_fillrectangles( &rect, 1, &cd_state ); surface->back_buffer = tmp; dfb_surfacemanager_unlock( surface->manager ); /* Signal end of sequence. */ dfb_state_stop_drawing( &cd_state ); pthread_mutex_unlock( &cd_lock ); #endif }
DFBResult dfb_surfacemanager_adjust_heap_offset( SurfaceManager *manager, int offset ) { D_ASSERT( offset >= 0 ); D_MAGIC_ASSERT( manager, SurfaceManager ); dfb_surfacemanager_lock( manager ); if (manager->byteoffset_align > 1) { offset += manager->byteoffset_align - 1; offset -= offset % manager->byteoffset_align; } if (manager->chunks->buffer == NULL) { /* first chunk is free */ if (offset <= manager->chunks->offset + manager->chunks->length) { /* ok, just recalculate offset and length */ manager->chunks->length = manager->chunks->offset + manager->chunks->length - offset; manager->chunks->offset = offset; } else { D_WARN("unable to adjust heap offset"); /* more space needed than free at the beginning */ /* TODO: move/destroy instances */ } } else { D_WARN("unable to adjust heap offset"); /* very rare case that the first chunk is occupied */ /* TODO: move/destroy instances */ } manager->heap_offset = offset; dfb_surfacemanager_unlock( manager ); return DFB_OK; }