DFBResult dfb_surface_flip( CoreSurface *surface, bool swap ) { unsigned int back, front; D_MAGIC_ASSERT( surface, CoreSurface ); FUSION_SKIRMISH_ASSERT( &surface->lock ); if (surface->num_buffers == 0) return DFB_SUSPENDED; back = (surface->flips + CSBR_BACK) % surface->num_buffers; front = (surface->flips + CSBR_FRONT) % surface->num_buffers; D_ASSERT( surface->buffer_indices[back] < surface->num_buffers ); D_ASSERT( surface->buffer_indices[front] < surface->num_buffers ); if (surface->buffers[surface->buffer_indices[back]]->policy != surface->buffers[surface->buffer_indices[front]]->policy || (surface->config.caps & DSCAPS_ROTATED)) return DFB_UNSUPPORTED; if (swap) { int tmp = surface->buffer_indices[back]; surface->buffer_indices[back] = surface->buffer_indices[front]; surface->buffer_indices[front] = tmp; } else surface->flips++; dfb_surface_notify( surface, CSNF_FLIP ); return DFB_OK; }
DFBResult dfb_surface_flip( CoreSurface *surface, bool swap ) { D_MAGIC_ASSERT( surface, CoreSurface ); FUSION_SKIRMISH_ASSERT( &surface->lock ); D_ASSERT( surface->buffer_indices[CSBR_BACK] < surface->num_buffers ); D_ASSERT( surface->buffer_indices[CSBR_FRONT] < surface->num_buffers ); if (surface->buffers[surface->buffer_indices[CSBR_BACK]]->policy != surface->buffers[surface->buffer_indices[CSBR_FRONT]]->policy) return DFB_UNSUPPORTED; if (swap) { int tmp = surface->buffer_indices[CSBR_BACK]; surface->buffer_indices[CSBR_BACK] = surface->buffer_indices[CSBR_FRONT]; surface->buffer_indices[CSBR_FRONT] = tmp; } else surface->flips++; dfb_surface_notify( surface, CSNF_FLIP ); return DFB_OK; }
DFBResult dfb_surface_notify( CoreSurface *surface, CoreSurfaceNotificationFlags flags) { CoreSurfaceNotification notification; D_MAGIC_ASSERT( surface, CoreSurface ); FUSION_SKIRMISH_ASSERT( &surface->lock ); D_FLAGS_ASSERT( flags, CSNF_ALL ); direct_serial_increase( &surface->serial ); if (!(surface->state & CSSF_DESTROYED)) { if (!(surface->notifications & flags)) return DFB_OK; } notification.flags = flags; notification.surface = surface; return dfb_surface_dispatch( surface, ¬ification, dfb_surface_globals ); }