DirectFB::Util::FusionObjectWrapper<CoreSurfaceBuffer> & SurfacePeer::getBuffer( int offset ) { D_DEBUG_AT( DirectFB_Graphics, "Graphics::SurfacePeer::%s( %p, offset %d ) <- surface %p\n", __FUNCTION__, this, offset, surface ); u32 index; if (surface_config.caps & DSCAPS_STEREO) { D_ASSERT( buffer_num > 1 ); index = ((flips + offset) % (buffer_num/2)) * 2; } else { D_ASSERT( buffer_num > 0 ); index = (flips + offset) % buffer_num; } if (!buffer_objects[index]) { DFBResult ret; CoreSurfaceBuffer *buffer; ret = ::CoreDFB_GetSurfaceBuffer( core_dfb, buffer_ids[index], &buffer ); if (ret) D_DERROR( ret, "DirectFB/SurfacePeer: CoreDFB_GetSurfaceBuffer( 0x%x ) failed!\n", buffer_ids[index] ); else { buffer_objects[index] = buffer; dfb_surface_buffer_unref( buffer ); } } return buffer_objects[index]; }
void page_flip_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void *driver_data) { MesaData *mesa = driver_data; CoreSurfaceBuffer *buffer = mesa->buffer; D_DEBUG_AT( Mesa_Layer, "%s()\n", __FUNCTION__ ); dfb_surface_notify_display( buffer->surface, buffer ); mesa->flip_pending = false; mesa->buffer = NULL; dfb_surface_buffer_unref( buffer ); }