static DFBResult crtc1InitScreen( CoreScreen *screen, CoreGraphicsDevice *device, void *driver_data, void *screen_data, DFBScreenDescription *description ) { NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; volatile u8 *mmio = nvdrv->mmio_base; if (OldPrimaryScreenFuncs.InitScreen) OldPrimaryScreenFuncs.InitScreen( screen, device, OldPrimaryScreenDriverData, screen_data, description ); description->caps |= DSCCAPS_VSYNC; snprintf( description->name, DFB_SCREEN_DESC_NAME_LENGTH, "NVidia Primary Screen" ); nv_out32( mmio, PCRTC_INTR_EN, PCRTC_INTR_EN_VBLANK_DISABLED ); #ifdef WORDS_BIGENDIAN nv_out32( mmio, PCRTC_CONFIG, PCRTC_CONFIG_SIGNAL_HSYNC | PCRTC_CONFIG_ENDIAN_BIG ); #else nv_out32( mmio, PCRTC_CONFIG, PCRTC_CONFIG_SIGNAL_HSYNC | PCRTC_CONFIG_ENDIAN_LITTLE ); #endif nv_out32( mmio, PCRTC_INTR, PCRTC_INTR_VBLANK_RESET ); return DFB_OK; }
static DFBResult ov0Remove( CoreLayer *layer, void *driver_data, void *layer_data, void *region_data ) { NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; volatile u8 *mmio = nvdrv->mmio_base; /* disable overlay */ nv_out32( mmio, PVIDEO_STOP, PVIDEO_STOP_OVERLAY_ACTIVE | PVIDEO_STOP_METHOD_IMMEDIATELY ); nv_out32( mmio, PVIDEO_BUFFER, 0 ); return DFB_OK; }
static DFBResult fb0FlipRegion( CoreLayer *layer, void *driver_data, void *layer_data, void *region_data, CoreSurface *surface, DFBSurfaceFlipFlags flags, CoreSurfaceBufferLock *left_lock, CoreSurfaceBufferLock *right_lock ) { NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; NVidiaDeviceData *nvdev = nvdrv->device_data; u32 offset; dfb_surface_flip( surface, false ); offset = (left_lock->offset + nvdev->fb_offset) & ~3; nv_out32( nvdrv->mmio_base, PCRTC_START, offset ); if (flags & DSFLIP_WAIT) dfb_layer_wait_vsync( layer ); return DFB_OK; }