vboxvideo.c revision d074b9bd5c1fffc376db9d56ff9d090fb9ced642
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Linux Additions X11 graphics driver
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Copyright (C) 2006-2013 Oracle Corporation
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * This file is part of VirtualBox Open Source Edition (OSE), as
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * available from http://www.virtualbox.org. This file is free software;
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * you can redistribute it and/or modify it under the terms of the GNU
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * General Public License (GPL) as published by the Free Software
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Foundation, in version 2 as it comes in the "COPYING" file of the
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * --------------------------------------------------------------------
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * This code is based on the X.Org VESA driver with the following copyrights:
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Copyright 2008 Red Hat, Inc.
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Copyright 2012 Red Hat, Inc.
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * and the following permission notice (not all original sourse files include
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * the last paragraph):
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * Permission is hereby granted, free of charge, to any person obtaining a
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * copy of this software and associated documentation files (the "Software"),
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * to deal in the Software without restriction, including without limitation
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs * and/or sell copies of the Software, and to permit persons to whom the
#ifdef XORG_7X
# include <stdlib.h>
# include <string.h>
#include "xf86.h"
#include "xf86_OSproc.h"
# include "xf86Resources.h"
# define SET_HAVE_VT_PROPERTY
#ifndef PCIACCESS
# include "xf86PciInfo.h"
# include "xf86Pci.h"
#include "fb.h"
#include "vboxvideo.h"
#include "version-generated.h"
#include "product-generated.h"
#include <xf86.h>
#include <misc.h>
#include "mipointer.h"
#include "micmap.h"
#include "xf86cmap.h"
#include "extensions/dpms.h" */
#include "vgaHW.h"
#ifdef VBOXVIDEO_13
# include "xf86Crtc.h"
# include "xf86Modes.h"
#include "property.h"
#ifdef VBOX_DRI
# include "xf86drm.h"
# include "xf86drmMode.h"
#ifndef PCIACCESS
int flags);
#ifndef XF86_SCRN_INTERFACE
enum GenericTypes
#ifdef PCIACCESS
#ifdef XORG_7X
#ifdef PCIACCESS
NULL,
NULL,
#ifdef XORG_7X
NULL,
#ifdef PCIACCESS
#ifndef XORG_7X
static const char *fbSymbols[] = {
static const char *shadowfbSymbols[] = {
static const char *ramdacSymbols[] = {
static const char *vgahwSymbols[] = {
int rc;
VBVXASSERT(width >= 0 && height >= 0, ("Invalid negative width (%d) or height (%d)\n", width, height));
return TRUE;
TRACE_LOG("pPixmap=%p adjustedWidth=%d height=%d pScrn->depth=%d pScrn->bitsPerPixel=%d cbLine=%d pVBox->base=%p pPixmap->drawable.width=%d pPixmap->drawable.height=%d\n",
pPixmap, adjustedWidth, height, pScrn->depth, pScrn->bitsPerPixel, cbLine, pVBox->base, pPixmap->drawable.width,
return FALSE;
pScreen->ModifyPixmapHeader(pPixmap, adjustedWidth, height, pScrn->depth, pScrn->bitsPerPixel, cbLine, pVBox->base);
#ifdef VBOX_DRI_OLD
return TRUE;
struct vbvxFrameBuffer frameBuffer = { 0, 0, pMode->HDisplay, pMode->VDisplay, pScrn->bitsPerPixel};
if (fLimitedContext)
#ifdef VBOXVIDEO_13
struct vbvxFrameBuffer frameBuffer = { pVBox->pScreens[0].paCrtcs->x, pVBox->pScreens[0].paCrtcs->y, pScrn->virtualX,
if (pVBox->pScreens[i].paCrtcs->mode.HDisplay != 0 && pVBox->pScreens[i].paCrtcs->mode.VDisplay != 0)
vbvxSetMode(pScrn, i, pVBox->pScreens[i].paCrtcs->mode.HDisplay, pVBox->pScreens[i].paCrtcs->mode.VDisplay,
hw/xfree86/modes/xf86Crtc.h and hw/xfree86/modes/xf86Modes.h in the
return TRUE;
static Bool
static Bool
{ (void) crtc; }
(void) mode;
{ (void) output; }
return MODE_OK;
static Bool
static xf86OutputStatus
static DisplayModePtr vbox_output_add_mode(VBOXPtr pVBox, DisplayModePtr *pModes, const char *pszName, int x, int y,
if (isPreferred)
return pMode;
static DisplayModePtr
unsigned i, cIndex = 0;
TRACE_ENTRY();
TRACE_EXIT();
return pModes;
#ifdef RANDR_12_INTERFACE
#ifdef XORG_7X
#ifdef XORG_7X
static pointer
if (!Initialised)
#ifdef PCIACCESS
#ifndef XORG_7X
NULL);
(void *)&VBOXVIDEO);
if (ErrorMajor)
return (NULL);
static const OptionInfoRec *
return (VBOXOptions);
#ifndef XF86_SCRN_INTERFACE
char **argv)
#ifdef PCIACCESS
static Bool
TRACE_ENTRY();
if (!pVBox)
return FALSE;
#ifndef PCIACCESS
static Bool
int numDevSections;
&devSections)) <= 0)
return (FALSE);
if (xf86GetPciVideoInfo())
int numUsed;
int *usedChips;
if (numUsed > 0)
for (i = 0; i < numUsed; i++)
return (foundScreen);
static Bool
unsigned DispiId;
TRACE_ENTRY();
return (FALSE);
if (!pVBox)
return FALSE;
return FALSE;
return (FALSE);
return FALSE;
return FALSE;
#ifdef VBOX_DRI_OLD
return FALSE;
# ifdef VBOX_DRI
return FALSE;
#ifndef PCIACCESS
return FALSE;
return FALSE;
return FALSE;
#ifdef VBOXVIDEO_13
return FALSE;
return (FALSE);
return (FALSE);
#ifdef PCIACCESS
TRACE_EXIT();
return (TRUE);
(void)pVisual;
#ifdef SET_HAVE_VT_PROPERTY
#ifdef SET_HAVE_VT_PROPERTY
FALSE);
#ifdef VBOXVIDEO_13
unsigned cx = 0;
unsigned cy = 0;
if (fLimitedContext)
xf86CrtcSetMode(pVBox->pScreens[i].paCrtcs, pVBox->pScreens[i].paOutputs->probed_modes, RR_Rotate_0,
if (!fLimitedContext)
RRCrtcNotify(pVBox->pScreens[i].paCrtcs->randr_crtc, pVBox->pScreens[i].paOutputs->randr_output->modes[0],
NULL,
if (!fLimitedContext)
pNewMode->HDisplay = RT_CLAMP(pVBox->pScreens[0].aPreferredSize.cx, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MAX_VIRTUAL);
pNewMode->VDisplay = RT_CLAMP(pVBox->pScreens[0].aPreferredSize.cy, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MAX_VIRTUAL);
#ifdef VBOXVIDEO_13
bool fNeedUpdate = false;
(void)pTimeout;
(void)pReadmask;
if (fNeedUpdate)
unsigned flags;
TRACE_ENTRY();
return (FALSE);
return (FALSE);
if (!miSetPixmapDepths())
return (FALSE);
#ifdef VBOX_DRI
return (FALSE);
#ifdef VBOXVIDEO_13
uint32_t i;
xf86CrtcSetSizeRange(pScrn, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MAX_VIRTUAL, VBOX_VIDEO_MAX_VIRTUAL);
return (FALSE);
return FALSE;
return FALSE;
return FALSE;
return (FALSE);
return (FALSE);
#ifdef VBOXVIDEO_13
#ifdef VBOXVIDEO_13
#ifdef VBOX_DRI_OLD
return (TRUE);
TRACE_ENTRY();
#ifdef VBOX_DRI_OLD
#ifdef VBOXVIDEO_13
return FALSE;
return FALSE;
#ifdef SET_HAVE_VT_PROPERTY
return TRUE;
#ifdef VBOXVIDEO_13
TRACE_ENTRY();
#ifdef VBOXVIDEO_13
#ifdef VBOX_DRI_OLD
#ifdef SET_HAVE_VT_PROPERTY
TRACE_EXIT();
#ifdef VBOXVIDEO_13
#ifdef VBOX_DRI
fRestore = false;
if (fRestore)
#ifndef XF86_SCRN_INTERFACE
#ifndef VBOXVIDEO_13
return TRUE;
#ifdef VBOXVIDEO_13
return rc;
TRACE_ENTRY();
TRACE_EXIT();
static Bool
TRACE_ENTRY();
#ifdef PCIACCESS
return rc;
TRACE_ENTRY();
#ifdef PCIACCESS
TRACE_EXIT();
static Bool
return TRUE;
TRACE_ENTRY();
#ifdef VBOX_DRI
TRACE_ENTRY();
#ifdef VBOX_DRI
int flags)