void gFBDC::exec(const gOpcode *o) { switch (o->opcode) { case gOpcode::setPalette: { gDC::exec(o); setPalette(); break; } case gOpcode::flip: { if (surface_back.data_phys) { gUnmanagedSurface s(surface); surface = surface_back; surface_back = s; if (surface.data_phys > surface_back.data_phys) fb->setOffset(surface_back.y); else fb->setOffset(0); } break; } case gOpcode::waitVSync: { static timeval l; static int t; timeval now; if (t == 1000) { gettimeofday(&now, 0); int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000; eDebug("[gFBDC] %d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1)); l = now; t = 0; } ++t; fb->blit(); fb->waitVSync(); break; } case gOpcode::flush: #ifdef USE_LIBVUGLES2 if (gles_is_animation()) gles_do_animation(); else fb->blit(); #else fb->blit(); #endif break; case gOpcode::sendShow: { #ifdef USE_LIBVUGLES2 gles_set_buffer((unsigned int *)surface.data); gles_set_animation(1, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height()); #endif break; } case gOpcode::sendHide: { #ifdef USE_LIBVUGLES2 gles_set_buffer((unsigned int *)surface.data); gles_set_animation(0, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height()); #endif break; } #ifdef USE_LIBVUGLES2 case gOpcode::setView: { gles_viewport(o->parm.setViewInfo->size.width(), o->parm.setViewInfo->size.height(), fb->Stride()); break; } #endif default: gDC::exec(o); break; } }
void gFBDC::exec(const gOpcode *o) { switch (o->opcode) { case gOpcode::setPalette: { gDC::exec(o); setPalette(); break; } case gOpcode::flip: { if (surface_back.data_phys) { gUnmanagedSurface s(surface); surface = surface_back; surface_back = s; if (surface.data_phys > surface_back.data_phys) fb->setOffset(surface_back.y); else fb->setOffset(0); } break; } case gOpcode::waitVSync: { static timeval l; static int t; timeval now; if (t == 1000) { gettimeofday(&now, 0); int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000; eDebug("[gFBDC] %d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1)); l = now; t = 0; } ++t; fb->blit(); fb->waitVSync(); break; } case gOpcode::flush: #ifdef USE_LIBVUGLES2 if (gles_is_animation()) gles_do_animation(); else fb->blit(); #else fb->blit(); #endif #if defined(CONFIG_HISILICON_FB) if(islocked()==0) { bcm_accel_blit( surface.data_phys, surface.x, surface.y, surface.stride, 0, surface_back.data_phys, surface_back.x, surface_back.y, surface_back.stride, 0, 0, surface.x, surface.y, 0, 0, surface.x, surface.y, 0, 0); } #endif #ifdef HAVE_HISILICON_ACCEL dinibot_accel_notify(); #endif break; case gOpcode::sendShow: { #ifdef HAVE_OSDANIMATION CFile::writeIntHex("/proc/stb/fb/animation_mode", 0x01); #endif #ifdef USE_LIBVUGLES2 gles_set_buffer((unsigned int *)surface.data); gles_set_animation(1, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height()); #endif break; } case gOpcode::sendHide: { #ifdef HAVE_OSDANIMATION CFile::writeIntHex("/proc/stb/fb/animation_mode", 0x10); #endif #ifdef USE_LIBVUGLES2 gles_set_buffer((unsigned int *)surface.data); gles_set_animation(0, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height()); #endif break; } #ifdef USE_LIBVUGLES2 case gOpcode::setView: { gles_viewport(o->parm.setViewInfo->size.width(), o->parm.setViewInfo->size.height(), fb->Stride()); break; } #endif default: gDC::exec(o); break; } }