Those directories were removed in xf86-video-ati 6.9.0.
This commit is contained in:
parent
7b276c6791
commit
d07bcc99c9
File diff suppressed because it is too large
Load Diff
@ -1,841 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _XF86CRTC_H_
|
||||
#define _XF86CRTC_H_
|
||||
|
||||
#include <edid.h>
|
||||
#include "randrstr.h"
|
||||
#if XF86_MODES_RENAME
|
||||
#include "xf86Rename.h"
|
||||
#endif
|
||||
#include "xf86Modes.h"
|
||||
#include "xf86Cursor.h"
|
||||
#include "xf86i2c.h"
|
||||
#include "damage.h"
|
||||
#include "picturestr.h"
|
||||
|
||||
/* Compat definitions for older X Servers. */
|
||||
#ifndef M_T_PREFERRED
|
||||
#define M_T_PREFERRED 0x08
|
||||
#endif
|
||||
#ifndef M_T_DRIVER
|
||||
#define M_T_DRIVER 0x40
|
||||
#endif
|
||||
#ifndef M_T_USERPREF
|
||||
#define M_T_USERPREF 0x80
|
||||
#endif
|
||||
#ifndef HARDWARE_CURSOR_ARGB
|
||||
#define HARDWARE_CURSOR_ARGB 0x00004000
|
||||
#endif
|
||||
|
||||
typedef struct _xf86Crtc xf86CrtcRec, *xf86CrtcPtr;
|
||||
typedef struct _xf86Output xf86OutputRec, *xf86OutputPtr;
|
||||
|
||||
/* define a standard for connector types */
|
||||
typedef enum _xf86ConnectorType {
|
||||
XF86ConnectorNone,
|
||||
XF86ConnectorVGA,
|
||||
XF86ConnectorDVI_I,
|
||||
XF86ConnectorDVI_D,
|
||||
XF86ConnectorDVI_A,
|
||||
XF86ConnectorComposite,
|
||||
XF86ConnectorSvideo,
|
||||
XF86ConnectorComponent,
|
||||
XF86ConnectorLFP,
|
||||
XF86ConnectorProprietary,
|
||||
XF86ConnectorHDMI,
|
||||
XF86ConnectorDisplayPort,
|
||||
} xf86ConnectorType;
|
||||
|
||||
typedef enum _xf86OutputStatus {
|
||||
XF86OutputStatusConnected,
|
||||
XF86OutputStatusDisconnected,
|
||||
XF86OutputStatusUnknown
|
||||
} xf86OutputStatus;
|
||||
|
||||
typedef struct _xf86CrtcFuncs {
|
||||
/**
|
||||
* Turns the crtc on/off, or sets intermediate power levels if available.
|
||||
*
|
||||
* Unsupported intermediate modes drop to the lower power setting. If the
|
||||
* mode is DPMSModeOff, the crtc must be disabled sufficiently for it to
|
||||
* be safe to call mode_set.
|
||||
*/
|
||||
void
|
||||
(*dpms)(xf86CrtcPtr crtc,
|
||||
int mode);
|
||||
|
||||
/**
|
||||
* Saves the crtc's state for restoration on VT switch.
|
||||
*/
|
||||
void
|
||||
(*save)(xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Restore's the crtc's state at VT switch.
|
||||
*/
|
||||
void
|
||||
(*restore)(xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Lock CRTC prior to mode setting, mostly for DRI.
|
||||
* Returns whether unlock is needed
|
||||
*/
|
||||
Bool
|
||||
(*lock) (xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Unlock CRTC after mode setting, mostly for DRI
|
||||
*/
|
||||
void
|
||||
(*unlock) (xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Callback to adjust the mode to be set in the CRTC.
|
||||
*
|
||||
* This allows a CRTC to adjust the clock or even the entire set of
|
||||
* timings, which is used for panels with fixed timings or for
|
||||
* buses with clock limitations.
|
||||
*/
|
||||
Bool
|
||||
(*mode_fixup)(xf86CrtcPtr crtc,
|
||||
DisplayModePtr mode,
|
||||
DisplayModePtr adjusted_mode);
|
||||
|
||||
/**
|
||||
* Prepare CRTC for an upcoming mode set.
|
||||
*/
|
||||
void
|
||||
(*prepare)(xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Callback for setting up a video mode after fixups have been made.
|
||||
*/
|
||||
void
|
||||
(*mode_set)(xf86CrtcPtr crtc,
|
||||
DisplayModePtr mode,
|
||||
DisplayModePtr adjusted_mode,
|
||||
int x, int y);
|
||||
|
||||
/**
|
||||
* Commit mode changes to a CRTC
|
||||
*/
|
||||
void
|
||||
(*commit)(xf86CrtcPtr crtc);
|
||||
|
||||
/* Set the color ramps for the CRTC to the given values. */
|
||||
void
|
||||
(*gamma_set)(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue,
|
||||
int size);
|
||||
|
||||
/**
|
||||
* Allocate the shadow area, delay the pixmap creation until needed
|
||||
*/
|
||||
void *
|
||||
(*shadow_allocate) (xf86CrtcPtr crtc, int width, int height);
|
||||
|
||||
/**
|
||||
* Create shadow pixmap for rotation support
|
||||
*/
|
||||
PixmapPtr
|
||||
(*shadow_create) (xf86CrtcPtr crtc, void *data, int width, int height);
|
||||
|
||||
/**
|
||||
* Destroy shadow pixmap
|
||||
*/
|
||||
void
|
||||
(*shadow_destroy) (xf86CrtcPtr crtc, PixmapPtr pPixmap, void *data);
|
||||
|
||||
/**
|
||||
* Set cursor colors
|
||||
*/
|
||||
void
|
||||
(*set_cursor_colors) (xf86CrtcPtr crtc, int bg, int fg);
|
||||
|
||||
/**
|
||||
* Set cursor position
|
||||
*/
|
||||
void
|
||||
(*set_cursor_position) (xf86CrtcPtr crtc, int x, int y);
|
||||
|
||||
/**
|
||||
* Show cursor
|
||||
*/
|
||||
void
|
||||
(*show_cursor) (xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Hide cursor
|
||||
*/
|
||||
void
|
||||
(*hide_cursor) (xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Load monochrome image
|
||||
*/
|
||||
void
|
||||
(*load_cursor_image) (xf86CrtcPtr crtc, CARD8 *image);
|
||||
|
||||
/**
|
||||
* Load ARGB image
|
||||
*/
|
||||
void
|
||||
(*load_cursor_argb) (xf86CrtcPtr crtc, CARD32 *image);
|
||||
|
||||
/**
|
||||
* Clean up driver-specific bits of the crtc
|
||||
*/
|
||||
void
|
||||
(*destroy) (xf86CrtcPtr crtc);
|
||||
|
||||
/**
|
||||
* Less fine-grained mode setting entry point for kernel modesetting
|
||||
*/
|
||||
Bool
|
||||
(*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode,
|
||||
Rotation rotation, int x, int y);
|
||||
} xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
|
||||
|
||||
#define XF86_CRTC_VERSION 1
|
||||
|
||||
struct _xf86Crtc {
|
||||
/**
|
||||
* ABI versioning
|
||||
*/
|
||||
int version;
|
||||
|
||||
/**
|
||||
* Associated ScrnInfo
|
||||
*/
|
||||
ScrnInfoPtr scrn;
|
||||
|
||||
/**
|
||||
* Active state of this CRTC
|
||||
*
|
||||
* Set when this CRTC is driving one or more outputs
|
||||
*/
|
||||
Bool enabled;
|
||||
|
||||
/**
|
||||
* Active mode
|
||||
*
|
||||
* This reflects the mode as set in the CRTC currently
|
||||
* It will be cleared when the VT is not active or
|
||||
* during server startup
|
||||
*/
|
||||
DisplayModeRec mode;
|
||||
Rotation rotation;
|
||||
PixmapPtr rotatedPixmap;
|
||||
void *rotatedData;
|
||||
|
||||
/**
|
||||
* Position on screen
|
||||
*
|
||||
* Locates this CRTC within the frame buffer
|
||||
*/
|
||||
int x, y;
|
||||
|
||||
/**
|
||||
* Desired mode
|
||||
*
|
||||
* This is set to the requested mode, independent of
|
||||
* whether the VT is active. In particular, it receives
|
||||
* the startup configured mode and saves the active mode
|
||||
* on VT switch.
|
||||
*/
|
||||
DisplayModeRec desiredMode;
|
||||
Rotation desiredRotation;
|
||||
int desiredX, desiredY;
|
||||
|
||||
/** crtc-specific functions */
|
||||
const xf86CrtcFuncsRec *funcs;
|
||||
|
||||
/**
|
||||
* Driver private
|
||||
*
|
||||
* Holds driver-private information
|
||||
*/
|
||||
void *driver_private;
|
||||
|
||||
#ifdef RANDR_12_INTERFACE
|
||||
/**
|
||||
* RandR crtc
|
||||
*
|
||||
* When RandR 1.2 is available, this
|
||||
* points at the associated crtc object
|
||||
*/
|
||||
RRCrtcPtr randr_crtc;
|
||||
#else
|
||||
void *randr_crtc;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Current cursor is ARGB
|
||||
*/
|
||||
Bool cursor_argb;
|
||||
/**
|
||||
* Track whether cursor is within CRTC range
|
||||
*/
|
||||
Bool cursor_in_range;
|
||||
/**
|
||||
* Track state of cursor associated with this CRTC
|
||||
*/
|
||||
Bool cursor_shown;
|
||||
|
||||
/**
|
||||
* Current transformation matrix
|
||||
*/
|
||||
PictTransform crtc_to_framebuffer;
|
||||
PictTransform framebuffer_to_crtc;
|
||||
Bool transform_in_use;
|
||||
/**
|
||||
* Bounding box in screen space
|
||||
*/
|
||||
BoxRec bounds;
|
||||
};
|
||||
|
||||
typedef struct _xf86OutputFuncs {
|
||||
/**
|
||||
* Called to allow the output a chance to create properties after the
|
||||
* RandR objects have been created.
|
||||
*/
|
||||
void
|
||||
(*create_resources)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Turns the output on/off, or sets intermediate power levels if available.
|
||||
*
|
||||
* Unsupported intermediate modes drop to the lower power setting. If the
|
||||
* mode is DPMSModeOff, the output must be disabled, as the DPLL may be
|
||||
* disabled afterwards.
|
||||
*/
|
||||
void
|
||||
(*dpms)(xf86OutputPtr output,
|
||||
int mode);
|
||||
|
||||
/**
|
||||
* Saves the output's state for restoration on VT switch.
|
||||
*/
|
||||
void
|
||||
(*save)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Restore's the output's state at VT switch.
|
||||
*/
|
||||
void
|
||||
(*restore)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Callback for testing a video mode for a given output.
|
||||
*
|
||||
* This function should only check for cases where a mode can't be supported
|
||||
* on the output specifically, and not represent generic CRTC limitations.
|
||||
*
|
||||
* \return MODE_OK if the mode is valid, or another MODE_* otherwise.
|
||||
*/
|
||||
int
|
||||
(*mode_valid)(xf86OutputPtr output,
|
||||
DisplayModePtr pMode);
|
||||
|
||||
/**
|
||||
* Callback to adjust the mode to be set in the CRTC.
|
||||
*
|
||||
* This allows an output to adjust the clock or even the entire set of
|
||||
* timings, which is used for panels with fixed timings or for
|
||||
* buses with clock limitations.
|
||||
*/
|
||||
Bool
|
||||
(*mode_fixup)(xf86OutputPtr output,
|
||||
DisplayModePtr mode,
|
||||
DisplayModePtr adjusted_mode);
|
||||
|
||||
/**
|
||||
* Callback for preparing mode changes on an output
|
||||
*/
|
||||
void
|
||||
(*prepare)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Callback for committing mode changes on an output
|
||||
*/
|
||||
void
|
||||
(*commit)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Callback for setting up a video mode after fixups have been made.
|
||||
*
|
||||
* This is only called while the output is disabled. The dpms callback
|
||||
* must be all that's necessary for the output, to turn the output on
|
||||
* after this function is called.
|
||||
*/
|
||||
void
|
||||
(*mode_set)(xf86OutputPtr output,
|
||||
DisplayModePtr mode,
|
||||
DisplayModePtr adjusted_mode);
|
||||
|
||||
/**
|
||||
* Probe for a connected output, and return detect_status.
|
||||
*/
|
||||
xf86OutputStatus
|
||||
(*detect)(xf86OutputPtr output);
|
||||
|
||||
/**
|
||||
* Query the device for the modes it provides.
|
||||
*
|
||||
* This function may also update MonInfo, mm_width, and mm_height.
|
||||
*
|
||||
* \return singly-linked list of modes or NULL if no modes found.
|
||||
*/
|
||||
DisplayModePtr
|
||||
(*get_modes)(xf86OutputPtr output);
|
||||
|
||||
#ifdef RANDR_12_INTERFACE
|
||||
/**
|
||||
* Callback when an output's property has changed.
|
||||
*/
|
||||
Bool
|
||||
(*set_property)(xf86OutputPtr output,
|
||||
Atom property,
|
||||
RRPropertyValuePtr value);
|
||||
#endif
|
||||
#ifdef RANDR_13_INTERFACE
|
||||
/**
|
||||
* Callback to get an updated property value
|
||||
*/
|
||||
Bool
|
||||
(*get_property)(xf86OutputPtr output,
|
||||
Atom property);
|
||||
#endif
|
||||
#ifdef RANDR_GET_CRTC_INTERFACE
|
||||
/**
|
||||
* Callback to get current CRTC for a given output
|
||||
*/
|
||||
xf86CrtcPtr
|
||||
(*get_crtc)(xf86OutputPtr output);
|
||||
#endif
|
||||
/**
|
||||
* Clean up driver-specific bits of the output
|
||||
*/
|
||||
void
|
||||
(*destroy) (xf86OutputPtr output);
|
||||
} xf86OutputFuncsRec, *xf86OutputFuncsPtr;
|
||||
|
||||
|
||||
#define XF86_OUTPUT_VERSION 1
|
||||
|
||||
struct _xf86Output {
|
||||
/**
|
||||
* ABI versioning
|
||||
*/
|
||||
int version;
|
||||
|
||||
/**
|
||||
* Associated ScrnInfo
|
||||
*/
|
||||
ScrnInfoPtr scrn;
|
||||
|
||||
/**
|
||||
* Currently connected crtc (if any)
|
||||
*
|
||||
* If this output is not in use, this field will be NULL.
|
||||
*/
|
||||
xf86CrtcPtr crtc;
|
||||
|
||||
/**
|
||||
* Possible CRTCs for this output as a mask of crtc indices
|
||||
*/
|
||||
CARD32 possible_crtcs;
|
||||
|
||||
/**
|
||||
* Possible outputs to share the same CRTC as a mask of output indices
|
||||
*/
|
||||
CARD32 possible_clones;
|
||||
|
||||
/**
|
||||
* Whether this output can support interlaced modes
|
||||
*/
|
||||
Bool interlaceAllowed;
|
||||
|
||||
/**
|
||||
* Whether this output can support double scan modes
|
||||
*/
|
||||
Bool doubleScanAllowed;
|
||||
|
||||
/**
|
||||
* List of available modes on this output.
|
||||
*
|
||||
* This should be the list from get_modes(), plus perhaps additional
|
||||
* compatible modes added later.
|
||||
*/
|
||||
DisplayModePtr probed_modes;
|
||||
|
||||
/**
|
||||
* Options parsed from the related monitor section
|
||||
*/
|
||||
OptionInfoPtr options;
|
||||
|
||||
/**
|
||||
* Configured monitor section
|
||||
*/
|
||||
XF86ConfMonitorPtr conf_monitor;
|
||||
|
||||
/**
|
||||
* Desired initial position
|
||||
*/
|
||||
int initial_x, initial_y;
|
||||
|
||||
/**
|
||||
* Desired initial rotation
|
||||
*/
|
||||
Rotation initial_rotation;
|
||||
|
||||
/**
|
||||
* Current connection status
|
||||
*
|
||||
* This indicates whether a monitor is known to be connected
|
||||
* to this output or not, or whether there is no way to tell
|
||||
*/
|
||||
xf86OutputStatus status;
|
||||
|
||||
/** EDID monitor information */
|
||||
xf86MonPtr MonInfo;
|
||||
|
||||
/** subpixel order */
|
||||
int subpixel_order;
|
||||
|
||||
/** Physical size of the currently attached output device. */
|
||||
int mm_width, mm_height;
|
||||
|
||||
/** Output name */
|
||||
char *name;
|
||||
|
||||
/** output-specific functions */
|
||||
const xf86OutputFuncsRec *funcs;
|
||||
|
||||
/** driver private information */
|
||||
void *driver_private;
|
||||
|
||||
/** Whether to use the old per-screen Monitor config section */
|
||||
Bool use_screen_monitor;
|
||||
|
||||
#ifdef RANDR_12_INTERFACE
|
||||
/**
|
||||
* RandR 1.2 output structure.
|
||||
*
|
||||
* When RandR 1.2 is available, this points at the associated
|
||||
* RandR output structure and is created when this output is created
|
||||
*/
|
||||
RROutputPtr randr_output;
|
||||
#else
|
||||
void *randr_output;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct _xf86CrtcConfigFuncs {
|
||||
/**
|
||||
* Requests that the driver resize the screen.
|
||||
*
|
||||
* The driver is responsible for updating scrn->virtualX and scrn->virtualY.
|
||||
* If the requested size cannot be set, the driver should leave those values
|
||||
* alone and return FALSE.
|
||||
*
|
||||
* A naive driver that cannot reallocate the screen may simply change
|
||||
* virtual[XY]. A more advanced driver will want to also change the
|
||||
* devPrivate.ptr and devKind of the screen pixmap, update any offscreen
|
||||
* pixmaps it may have moved, and change pScrn->displayWidth.
|
||||
*/
|
||||
Bool
|
||||
(*resize)(ScrnInfoPtr scrn,
|
||||
int width,
|
||||
int height);
|
||||
} xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr;
|
||||
|
||||
typedef struct _xf86CrtcConfig {
|
||||
int num_output;
|
||||
xf86OutputPtr *output;
|
||||
/**
|
||||
* compat_output is used whenever we deal
|
||||
* with legacy code that only understands a single
|
||||
* output. pScrn->modes will be loaded from this output,
|
||||
* adjust frame will whack this output, etc.
|
||||
*/
|
||||
int compat_output;
|
||||
|
||||
int num_crtc;
|
||||
xf86CrtcPtr *crtc;
|
||||
|
||||
int minWidth, minHeight;
|
||||
int maxWidth, maxHeight;
|
||||
|
||||
/* For crtc-based rotation */
|
||||
DamagePtr rotation_damage;
|
||||
Bool rotation_damage_registered;
|
||||
|
||||
/* DGA */
|
||||
unsigned int dga_flags;
|
||||
unsigned long dga_address;
|
||||
DGAModePtr dga_modes;
|
||||
int dga_nmode;
|
||||
int dga_width, dga_height, dga_stride;
|
||||
DisplayModePtr dga_save_mode;
|
||||
|
||||
const xf86CrtcConfigFuncsRec *funcs;
|
||||
|
||||
CreateScreenResourcesProcPtr CreateScreenResources;
|
||||
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
|
||||
/* Cursor information */
|
||||
xf86CursorInfoPtr cursor_info;
|
||||
CursorPtr cursor;
|
||||
CARD8 *cursor_image;
|
||||
Bool cursor_on;
|
||||
CARD32 cursor_fg, cursor_bg;
|
||||
|
||||
/**
|
||||
* Options parsed from the related device section
|
||||
*/
|
||||
OptionInfoPtr options;
|
||||
|
||||
Bool debug_modes;
|
||||
|
||||
/* wrap screen BlockHandler for rotation */
|
||||
ScreenBlockHandlerProcPtr BlockHandler;
|
||||
|
||||
} xf86CrtcConfigRec, *xf86CrtcConfigPtr;
|
||||
|
||||
extern int xf86CrtcConfigPrivateIndex;
|
||||
|
||||
#define XF86_CRTC_CONFIG_PTR(p) ((xf86CrtcConfigPtr) ((p)->privates[xf86CrtcConfigPrivateIndex].ptr))
|
||||
|
||||
/*
|
||||
* Initialize xf86CrtcConfig structure
|
||||
*/
|
||||
|
||||
void
|
||||
xf86CrtcConfigInit (ScrnInfoPtr scrn,
|
||||
const xf86CrtcConfigFuncsRec *funcs);
|
||||
|
||||
void
|
||||
xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
|
||||
int minWidth, int minHeight,
|
||||
int maxWidth, int maxHeight);
|
||||
|
||||
/*
|
||||
* Crtc functions
|
||||
*/
|
||||
xf86CrtcPtr
|
||||
xf86CrtcCreate (ScrnInfoPtr scrn,
|
||||
const xf86CrtcFuncsRec *funcs);
|
||||
|
||||
void
|
||||
xf86CrtcDestroy (xf86CrtcPtr crtc);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the given video mode on the given crtc
|
||||
*/
|
||||
Bool
|
||||
xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
||||
int x, int y);
|
||||
|
||||
/*
|
||||
* Assign crtc rotation during mode set
|
||||
*/
|
||||
Bool
|
||||
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation);
|
||||
|
||||
/*
|
||||
* free shadow memory allocated for all crtcs
|
||||
*/
|
||||
void
|
||||
xf86RotateFreeShadow(ScrnInfoPtr pScrn);
|
||||
|
||||
/*
|
||||
* Clean up rotation during CloseScreen
|
||||
*/
|
||||
void
|
||||
xf86RotateCloseScreen (ScreenPtr pScreen);
|
||||
|
||||
/**
|
||||
* Return whether any output is assigned to the crtc
|
||||
*/
|
||||
Bool
|
||||
xf86CrtcInUse (xf86CrtcPtr crtc);
|
||||
|
||||
/*
|
||||
* Output functions
|
||||
*/
|
||||
xf86OutputPtr
|
||||
xf86OutputCreate (ScrnInfoPtr scrn,
|
||||
const xf86OutputFuncsRec *funcs,
|
||||
const char *name);
|
||||
|
||||
void
|
||||
xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor);
|
||||
|
||||
Bool
|
||||
xf86OutputRename (xf86OutputPtr output, const char *name);
|
||||
|
||||
void
|
||||
xf86OutputDestroy (xf86OutputPtr output);
|
||||
|
||||
void
|
||||
xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY);
|
||||
|
||||
void
|
||||
xf86SetScrnInfoModes (ScrnInfoPtr pScrn);
|
||||
|
||||
#ifdef RANDR_13_INTERFACE
|
||||
int
|
||||
#else
|
||||
Bool
|
||||
#endif
|
||||
xf86CrtcScreenInit (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
xf86InitialConfiguration (ScrnInfoPtr pScrn, Bool canGrow);
|
||||
|
||||
void
|
||||
xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags);
|
||||
|
||||
Bool
|
||||
xf86SaveScreen(ScreenPtr pScreen, int mode);
|
||||
|
||||
void
|
||||
xf86DisableUnusedFunctions(ScrnInfoPtr pScrn);
|
||||
|
||||
DisplayModePtr
|
||||
xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired);
|
||||
|
||||
Bool
|
||||
xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation);
|
||||
|
||||
/**
|
||||
* Set the EDID information for the specified output
|
||||
*/
|
||||
void
|
||||
xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon);
|
||||
|
||||
/**
|
||||
* Return the list of modes supported by the EDID information
|
||||
* stored in 'output'
|
||||
*/
|
||||
DisplayModePtr
|
||||
xf86OutputGetEDIDModes (xf86OutputPtr output);
|
||||
|
||||
xf86MonPtr
|
||||
xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus);
|
||||
|
||||
/**
|
||||
* Initialize dga for this screen
|
||||
*/
|
||||
|
||||
Bool
|
||||
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address);
|
||||
|
||||
/**
|
||||
* Re-initialize dga for this screen (as when the set of modes changes)
|
||||
*/
|
||||
|
||||
Bool
|
||||
xf86DiDGAReInit (ScreenPtr pScreen);
|
||||
|
||||
/*
|
||||
* Set the subpixel order reported for the screen using
|
||||
* the information from the outputs
|
||||
*/
|
||||
|
||||
void
|
||||
xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen);
|
||||
|
||||
/*
|
||||
* Get a standard string name for a connector type
|
||||
*/
|
||||
char *
|
||||
xf86ConnectorGetName(xf86ConnectorType connector);
|
||||
|
||||
/*
|
||||
* Using the desired mode information in each crtc, set
|
||||
* modes (used in EnterVT functions, or at server startup)
|
||||
*/
|
||||
|
||||
Bool
|
||||
xf86SetDesiredModes (ScrnInfoPtr pScrn);
|
||||
|
||||
/**
|
||||
* Initialize the CRTC-based cursor code. CRTC function vectors must
|
||||
* contain relevant cursor setting functions.
|
||||
*
|
||||
* Driver should call this from ScreenInit function
|
||||
*/
|
||||
Bool
|
||||
xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags);
|
||||
|
||||
/**
|
||||
* Called when anything on the screen is reconfigured.
|
||||
*
|
||||
* Reloads cursor images as needed, then adjusts cursor positions.
|
||||
*
|
||||
* Driver should call this from crtc commit function.
|
||||
*/
|
||||
void
|
||||
xf86_reload_cursors (ScreenPtr screen);
|
||||
|
||||
/**
|
||||
* Called from EnterVT to turn the cursors back on
|
||||
*/
|
||||
void
|
||||
xf86_show_cursors (ScrnInfoPtr scrn);
|
||||
|
||||
/**
|
||||
* Called by the driver to turn cursors off
|
||||
*/
|
||||
void
|
||||
xf86_hide_cursors (ScrnInfoPtr scrn);
|
||||
|
||||
/**
|
||||
* Clean up CRTC-based cursor code. Driver must call this at CloseScreen time.
|
||||
*/
|
||||
void
|
||||
xf86_cursors_fini (ScreenPtr screen);
|
||||
|
||||
/*
|
||||
* For overlay video, compute the relevant CRTC and
|
||||
* clip video to that.
|
||||
* wraps xf86XVClipVideoHelper()
|
||||
*/
|
||||
|
||||
Bool
|
||||
xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
|
||||
xf86CrtcPtr *crtc_ret,
|
||||
xf86CrtcPtr desired_crtc,
|
||||
BoxPtr dst,
|
||||
INT32 *xa,
|
||||
INT32 *xb,
|
||||
INT32 *ya,
|
||||
INT32 *yb,
|
||||
RegionPtr reg,
|
||||
INT32 width,
|
||||
INT32 height);
|
||||
|
||||
#endif /* _XF86CRTC_H_ */
|
@ -1,660 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2007 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86DDC.h"
|
||||
#include "xf86Crtc.h"
|
||||
#include "xf86Modes.h"
|
||||
#include "xf86RandR12.h"
|
||||
#include "X11/extensions/render.h"
|
||||
#define DPMS_SERVER
|
||||
#include "X11/extensions/dpms.h"
|
||||
#include "X11/Xatom.h"
|
||||
#ifdef RENDER
|
||||
#include "picturestr.h"
|
||||
#endif
|
||||
#include "cursorstr.h"
|
||||
#include "inputstr.h"
|
||||
|
||||
/*
|
||||
* Given a screen coordinate, rotate back to a cursor source coordinate
|
||||
*/
|
||||
static void
|
||||
xf86_crtc_rotate_coord (Rotation rotation,
|
||||
int width,
|
||||
int height,
|
||||
int x_dst,
|
||||
int y_dst,
|
||||
int *x_src,
|
||||
int *y_src)
|
||||
{
|
||||
int t;
|
||||
|
||||
switch (rotation & 0xf) {
|
||||
case RR_Rotate_0:
|
||||
break;
|
||||
case RR_Rotate_90:
|
||||
t = x_dst;
|
||||
x_dst = height - y_dst - 1;
|
||||
y_dst = t;
|
||||
break;
|
||||
case RR_Rotate_180:
|
||||
x_dst = width - x_dst - 1;
|
||||
y_dst = height - y_dst - 1;
|
||||
break;
|
||||
case RR_Rotate_270:
|
||||
t = x_dst;
|
||||
x_dst = y_dst;
|
||||
y_dst = width - t - 1;
|
||||
break;
|
||||
}
|
||||
if (rotation & RR_Reflect_X)
|
||||
x_dst = width - x_dst - 1;
|
||||
if (rotation & RR_Reflect_Y)
|
||||
y_dst = height - y_dst - 1;
|
||||
*x_src = x_dst;
|
||||
*y_src = y_dst;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a cursor source coordinate, rotate to a screen coordinate
|
||||
*/
|
||||
static void
|
||||
xf86_crtc_rotate_coord_back (Rotation rotation,
|
||||
int width,
|
||||
int height,
|
||||
int x_dst,
|
||||
int y_dst,
|
||||
int *x_src,
|
||||
int *y_src)
|
||||
{
|
||||
int t;
|
||||
|
||||
if (rotation & RR_Reflect_X)
|
||||
x_dst = width - x_dst - 1;
|
||||
if (rotation & RR_Reflect_Y)
|
||||
y_dst = height - y_dst - 1;
|
||||
|
||||
switch (rotation & 0xf) {
|
||||
case RR_Rotate_0:
|
||||
break;
|
||||
case RR_Rotate_90:
|
||||
t = x_dst;
|
||||
x_dst = y_dst;
|
||||
y_dst = width - t - 1;
|
||||
break;
|
||||
case RR_Rotate_180:
|
||||
x_dst = width - x_dst - 1;
|
||||
y_dst = height - y_dst - 1;
|
||||
break;
|
||||
case RR_Rotate_270:
|
||||
t = x_dst;
|
||||
x_dst = height - y_dst - 1;
|
||||
y_dst = t;
|
||||
break;
|
||||
}
|
||||
*x_src = x_dst;
|
||||
*y_src = y_dst;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an x coordinate to a position within the cursor bitmap
|
||||
*/
|
||||
static int
|
||||
cursor_bitpos (int flags, int x, Bool mask)
|
||||
{
|
||||
if (flags & HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK)
|
||||
mask = !mask;
|
||||
if (flags & HARDWARE_CURSOR_NIBBLE_SWAPPED)
|
||||
x = (x & ~3) | (3 - (x & 3));
|
||||
if (((flags & HARDWARE_CURSOR_BIT_ORDER_MSBFIRST) == 0) ==
|
||||
(X_BYTE_ORDER == X_BIG_ENDIAN))
|
||||
x = (x & ~7) | (7 - (x & 7));
|
||||
if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1)
|
||||
x = (x << 1) + mask;
|
||||
else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8)
|
||||
x = ((x & ~7) << 1) | (mask << 3) | (x & 7);
|
||||
else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16)
|
||||
x = ((x & ~15) << 1) | (mask << 4) | (x & 15);
|
||||
else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32)
|
||||
x = ((x & ~31) << 1) | (mask << 5) | (x & 31);
|
||||
else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64)
|
||||
x = ((x & ~63) << 1) | (mask << 6) | (x & 63);
|
||||
return x;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetch one bit from a cursor bitmap
|
||||
*/
|
||||
static CARD8
|
||||
get_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
|
||||
{
|
||||
x = cursor_bitpos (flags, x, mask);
|
||||
image += y * stride;
|
||||
return (image[(x >> 3)] >> (x & 7)) & 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set one bit in a cursor bitmap
|
||||
*/
|
||||
static void
|
||||
set_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
|
||||
{
|
||||
x = cursor_bitpos (flags, x, mask);
|
||||
image += y * stride;
|
||||
image[(x >> 3)] |= 1 << (x & 7);
|
||||
}
|
||||
|
||||
/*
|
||||
* Load a two color cursor into a driver that supports only ARGB cursors
|
||||
*/
|
||||
static void
|
||||
xf86_crtc_convert_cursor_to_argb (xf86CrtcPtr crtc, unsigned char *src)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
|
||||
int x, y;
|
||||
int xin, yin;
|
||||
int stride = cursor_info->MaxWidth >> 2;
|
||||
int flags = cursor_info->Flags;
|
||||
CARD32 bits;
|
||||
|
||||
#ifdef ARGB_CURSOR
|
||||
crtc->cursor_argb = FALSE;
|
||||
#endif
|
||||
|
||||
for (y = 0; y < cursor_info->MaxHeight; y++)
|
||||
for (x = 0; x < cursor_info->MaxWidth; x++)
|
||||
{
|
||||
xf86_crtc_rotate_coord (crtc->rotation,
|
||||
cursor_info->MaxWidth,
|
||||
cursor_info->MaxHeight,
|
||||
x, y, &xin, &yin);
|
||||
if (get_bit (src, stride, flags, xin, yin, TRUE) ==
|
||||
((flags & HARDWARE_CURSOR_INVERT_MASK) == 0))
|
||||
{
|
||||
if (get_bit (src, stride, flags, xin, yin, FALSE))
|
||||
bits = xf86_config->cursor_fg;
|
||||
else
|
||||
bits = xf86_config->cursor_bg;
|
||||
}
|
||||
else
|
||||
bits = 0;
|
||||
cursor_image[y * cursor_info->MaxWidth + x] = bits;
|
||||
}
|
||||
crtc->funcs->load_cursor_argb (crtc, cursor_image);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the colors for a two-color cursor (ignore for ARGB cursors)
|
||||
*/
|
||||
static void
|
||||
xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
|
||||
{
|
||||
ScreenPtr screen = scrn->pScreen;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
CursorPtr cursor = xf86_config->cursor;
|
||||
int c;
|
||||
CARD8 *bits = cursor ?
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
dixLookupPrivate(&cursor->devPrivates, screen)
|
||||
#else
|
||||
cursor->devPriv[screen->myNum]
|
||||
#endif
|
||||
: NULL;
|
||||
|
||||
/* Save ARGB versions of these colors */
|
||||
xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
|
||||
xf86_config->cursor_bg = (CARD32) bg | 0xff000000;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled && !crtc->cursor_argb)
|
||||
{
|
||||
if (crtc->funcs->load_cursor_image)
|
||||
crtc->funcs->set_cursor_colors (crtc, bg, fg);
|
||||
else if (bits)
|
||||
xf86_crtc_convert_cursor_to_argb (crtc, bits);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
|
||||
{
|
||||
if (crtc->cursor_shown)
|
||||
{
|
||||
crtc->funcs->hide_cursor (crtc);
|
||||
crtc->cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86_hide_cursors (ScrnInfoPtr scrn)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
xf86_config->cursor_on = FALSE;
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled)
|
||||
xf86_crtc_hide_cursor (crtc);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_crtc_show_cursor (xf86CrtcPtr crtc)
|
||||
{
|
||||
if (!crtc->cursor_shown && crtc->cursor_in_range)
|
||||
{
|
||||
crtc->funcs->show_cursor (crtc);
|
||||
crtc->cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86_show_cursors (ScrnInfoPtr scrn)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
xf86_config->cursor_on = TRUE;
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled)
|
||||
xf86_crtc_show_cursor (crtc);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
DisplayModePtr mode = &crtc->mode;
|
||||
Bool in_range;
|
||||
int dx, dy;
|
||||
|
||||
/*
|
||||
* Transform position of cursor on screen
|
||||
*/
|
||||
if (crtc->transform_in_use)
|
||||
{
|
||||
PictVector v;
|
||||
v.vector[0] = IntToxFixed (x); v.vector[1] = IntToxFixed (y); v.vector[2] = IntToxFixed(1);
|
||||
PictureTransformPoint (&crtc->framebuffer_to_crtc, &v);
|
||||
x = xFixedToInt (v.vector[0]); y = xFixedToInt (v.vector[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
x -= crtc->x;
|
||||
y -= crtc->y;
|
||||
}
|
||||
/*
|
||||
* Transform position of cursor upper left corner
|
||||
*/
|
||||
xf86_crtc_rotate_coord_back (crtc->rotation,
|
||||
cursor_info->MaxWidth,
|
||||
cursor_info->MaxHeight,
|
||||
0, 0, &dx, &dy);
|
||||
x -= dx;
|
||||
y -= dy;
|
||||
|
||||
/*
|
||||
* Disable the cursor when it is outside the viewport
|
||||
*/
|
||||
in_range = TRUE;
|
||||
if (x >= mode->HDisplay || y >= mode->VDisplay ||
|
||||
x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight)
|
||||
{
|
||||
in_range = FALSE;
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
crtc->cursor_in_range = in_range;
|
||||
|
||||
if (in_range)
|
||||
{
|
||||
crtc->funcs->set_cursor_position (crtc, x, y);
|
||||
xf86_crtc_show_cursor (crtc);
|
||||
}
|
||||
else
|
||||
xf86_crtc_hide_cursor (crtc);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_set_cursor_position (ScrnInfoPtr scrn, int x, int y)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
/* undo what xf86HWCurs did to the coordinates */
|
||||
x += scrn->frameX0;
|
||||
y += scrn->frameY0;
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled)
|
||||
xf86_crtc_set_cursor_position (crtc, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Load a two-color cursor into a crtc, performing rotation as needed
|
||||
*/
|
||||
static void
|
||||
xf86_crtc_load_cursor_image (xf86CrtcPtr crtc, CARD8 *src)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
CARD8 *cursor_image;
|
||||
|
||||
#ifdef ARGB_CURSOR
|
||||
crtc->cursor_argb = FALSE;
|
||||
#endif
|
||||
|
||||
if (crtc->rotation == RR_Rotate_0)
|
||||
cursor_image = src;
|
||||
else
|
||||
{
|
||||
int x, y;
|
||||
int xin, yin;
|
||||
int stride = cursor_info->MaxWidth >> 2;
|
||||
int flags = cursor_info->Flags;
|
||||
|
||||
cursor_image = xf86_config->cursor_image;
|
||||
memset(cursor_image, 0, cursor_info->MaxHeight * stride);
|
||||
|
||||
for (y = 0; y < cursor_info->MaxHeight; y++)
|
||||
for (x = 0; x < cursor_info->MaxWidth; x++)
|
||||
{
|
||||
xf86_crtc_rotate_coord (crtc->rotation,
|
||||
cursor_info->MaxWidth,
|
||||
cursor_info->MaxHeight,
|
||||
x, y, &xin, &yin);
|
||||
if (get_bit(src, stride, flags, xin, yin, FALSE))
|
||||
set_bit(cursor_image, stride, flags, x, y, FALSE);
|
||||
if (get_bit(src, stride, flags, xin, yin, TRUE))
|
||||
set_bit(cursor_image, stride, flags, x, y, TRUE);
|
||||
}
|
||||
}
|
||||
crtc->funcs->load_cursor_image (crtc, cursor_image);
|
||||
}
|
||||
|
||||
/*
|
||||
* Load a cursor image into all active CRTCs
|
||||
*/
|
||||
static void
|
||||
xf86_load_cursor_image (ScrnInfoPtr scrn, unsigned char *src)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled)
|
||||
{
|
||||
if (crtc->funcs->load_cursor_image)
|
||||
xf86_crtc_load_cursor_image (crtc, src);
|
||||
else if (crtc->funcs->load_cursor_argb)
|
||||
xf86_crtc_convert_cursor_to_argb (crtc, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
|
||||
if (xf86_config->cursor)
|
||||
FreeCursor (xf86_config->cursor, None);
|
||||
xf86_config->cursor = cursor;
|
||||
++cursor->refcnt;
|
||||
|
||||
if (cursor->bits->width > cursor_info->MaxWidth ||
|
||||
cursor->bits->height> cursor_info->MaxHeight)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
|
||||
if (xf86_config->cursor)
|
||||
FreeCursor (xf86_config->cursor, None);
|
||||
xf86_config->cursor = cursor;
|
||||
++cursor->refcnt;
|
||||
|
||||
/* Make sure ARGB support is available */
|
||||
if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
|
||||
return FALSE;
|
||||
|
||||
if (cursor->bits->width > cursor_info->MaxWidth ||
|
||||
cursor->bits->height> cursor_info->MaxHeight)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_crtc_load_cursor_argb (xf86CrtcPtr crtc, CursorPtr cursor)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||
CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
|
||||
CARD32 *cursor_source = (CARD32 *) cursor->bits->argb;
|
||||
int x, y;
|
||||
int xin, yin;
|
||||
CARD32 bits;
|
||||
int source_width = cursor->bits->width;
|
||||
int source_height = cursor->bits->height;
|
||||
int image_width = cursor_info->MaxWidth;
|
||||
int image_height = cursor_info->MaxHeight;
|
||||
|
||||
for (y = 0; y < image_height; y++)
|
||||
for (x = 0; x < image_width; x++)
|
||||
{
|
||||
xf86_crtc_rotate_coord (crtc->rotation, image_width, image_height,
|
||||
x, y, &xin, &yin);
|
||||
if (xin < source_width && yin < source_height)
|
||||
bits = cursor_source[yin * source_width + xin];
|
||||
else
|
||||
bits = 0;
|
||||
cursor_image[y * image_width + x] = bits;
|
||||
}
|
||||
|
||||
crtc->funcs->load_cursor_argb (crtc, cursor_image);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->enabled)
|
||||
xf86_crtc_load_cursor_argb (crtc, cursor);
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT Bool
|
||||
xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
xf86CursorInfoPtr cursor_info;
|
||||
|
||||
cursor_info = xf86CreateCursorInfoRec();
|
||||
if (!cursor_info)
|
||||
return FALSE;
|
||||
|
||||
xf86_config->cursor_image = xalloc (max_width * max_height * 4);
|
||||
|
||||
if (!xf86_config->cursor_image)
|
||||
{
|
||||
xf86DestroyCursorInfoRec (cursor_info);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86_config->cursor_info = cursor_info;
|
||||
|
||||
cursor_info->MaxWidth = max_width;
|
||||
cursor_info->MaxHeight = max_height;
|
||||
cursor_info->Flags = flags;
|
||||
|
||||
cursor_info->SetCursorColors = xf86_set_cursor_colors;
|
||||
cursor_info->SetCursorPosition = xf86_set_cursor_position;
|
||||
cursor_info->LoadCursorImage = xf86_load_cursor_image;
|
||||
cursor_info->HideCursor = xf86_hide_cursors;
|
||||
cursor_info->ShowCursor = xf86_show_cursors;
|
||||
cursor_info->UseHWCursor = xf86_use_hw_cursor;
|
||||
#ifdef ARGB_CURSOR
|
||||
if (flags & HARDWARE_CURSOR_ARGB)
|
||||
{
|
||||
cursor_info->UseHWCursorARGB = xf86_use_hw_cursor_argb;
|
||||
cursor_info->LoadCursorARGB = xf86_load_cursor_argb;
|
||||
}
|
||||
#endif
|
||||
|
||||
xf86_config->cursor = NULL;
|
||||
xf86_hide_cursors (scrn);
|
||||
|
||||
return xf86InitCursor (screen, cursor_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when anything on the screen is reconfigured.
|
||||
*
|
||||
* Reloads cursor images as needed, then adjusts cursor positions
|
||||
*/
|
||||
|
||||
_X_EXPORT void
|
||||
xf86_reload_cursors (ScreenPtr screen)
|
||||
{
|
||||
ScrnInfoPtr scrn;
|
||||
xf86CrtcConfigPtr xf86_config;
|
||||
xf86CursorInfoPtr cursor_info;
|
||||
CursorPtr cursor;
|
||||
int x, y;
|
||||
|
||||
/* initial mode setting will not have set a screen yet.
|
||||
May be called before the devices are initialised.
|
||||
*/
|
||||
if (!screen || !inputInfo.pointer)
|
||||
return;
|
||||
scrn = xf86Screens[screen->myNum];
|
||||
xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
/* make sure the cursor code has been initialized */
|
||||
cursor_info = xf86_config->cursor_info;
|
||||
if (!cursor_info)
|
||||
return;
|
||||
|
||||
cursor = xf86_config->cursor;
|
||||
GetSpritePosition (inputInfo.pointer, &x, &y);
|
||||
if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
|
||||
(*cursor_info->HideCursor)(scrn);
|
||||
|
||||
if (cursor)
|
||||
{
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
void *src = dixLookupPrivate(&cursor->devPrivates, screen);
|
||||
#else
|
||||
void *src = cursor->devPriv[screen->myNum];
|
||||
#endif
|
||||
#ifdef ARGB_CURSOR
|
||||
if (cursor->bits->argb && cursor_info->LoadCursorARGB)
|
||||
(*cursor_info->LoadCursorARGB) (scrn, cursor);
|
||||
else if (src)
|
||||
#endif
|
||||
(*cursor_info->LoadCursorImage)(cursor_info->pScrn, src);
|
||||
|
||||
(*cursor_info->SetCursorPosition)(cursor_info->pScrn, x, y);
|
||||
(*cursor_info->ShowCursor)(cursor_info->pScrn);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up CRTC-based cursor code
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86_cursors_fini (ScreenPtr screen)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
if (xf86_config->cursor_info)
|
||||
{
|
||||
xf86DestroyCursorInfoRec (xf86_config->cursor_info);
|
||||
xf86_config->cursor_info = NULL;
|
||||
}
|
||||
if (xf86_config->cursor_image)
|
||||
{
|
||||
xfree (xf86_config->cursor_image);
|
||||
xf86_config->cursor_image = NULL;
|
||||
}
|
||||
if (xf86_config->cursor)
|
||||
{
|
||||
FreeCursor (xf86_config->cursor, None);
|
||||
xf86_config->cursor = NULL;
|
||||
}
|
||||
}
|
@ -1,286 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86DDC.h"
|
||||
#include "xf86_OSproc.h"
|
||||
#include "dgaproc.h"
|
||||
#include "xf86Crtc.h"
|
||||
#include "xf86Modes.h"
|
||||
#include "gcstruct.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "windowstr.h"
|
||||
|
||||
static Bool
|
||||
xf86_dga_get_modes (ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
DGAModePtr modes, mode;
|
||||
DisplayModePtr display_mode;
|
||||
int bpp = scrn->bitsPerPixel >> 3;
|
||||
int num;
|
||||
|
||||
num = 0;
|
||||
display_mode = scrn->modes;
|
||||
while (display_mode)
|
||||
{
|
||||
num++;
|
||||
display_mode = display_mode->next;
|
||||
if (display_mode == scrn->modes)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!num)
|
||||
return FALSE;
|
||||
|
||||
modes = xalloc(num * sizeof(DGAModeRec));
|
||||
if (!modes)
|
||||
return FALSE;
|
||||
|
||||
num = 0;
|
||||
display_mode = scrn->modes;
|
||||
while (display_mode)
|
||||
{
|
||||
mode = modes + num++;
|
||||
|
||||
mode->mode = display_mode;
|
||||
mode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
|
||||
mode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT;
|
||||
if (display_mode->Flags & V_DBLSCAN)
|
||||
mode->flags |= DGA_DOUBLESCAN;
|
||||
if (display_mode->Flags & V_INTERLACE)
|
||||
mode->flags |= DGA_INTERLACED;
|
||||
mode->byteOrder = scrn->imageByteOrder;
|
||||
mode->depth = scrn->depth;
|
||||
mode->bitsPerPixel = scrn->bitsPerPixel;
|
||||
mode->red_mask = scrn->mask.red;
|
||||
mode->green_mask = scrn->mask.green;
|
||||
mode->blue_mask = scrn->mask.blue;
|
||||
mode->visualClass = (bpp == 1) ? PseudoColor : TrueColor;
|
||||
mode->viewportWidth = display_mode->HDisplay;
|
||||
mode->viewportHeight = display_mode->VDisplay;
|
||||
mode->xViewportStep = (bpp == 3) ? 2 : 1;
|
||||
mode->yViewportStep = 1;
|
||||
mode->viewportFlags = DGA_FLIP_RETRACE;
|
||||
mode->offset = 0;
|
||||
mode->address = (unsigned char *) xf86_config->dga_address;
|
||||
mode->bytesPerScanline = xf86_config->dga_stride;
|
||||
mode->imageWidth = xf86_config->dga_width;
|
||||
mode->imageHeight = xf86_config->dga_height;
|
||||
mode->pixmapWidth = mode->imageWidth;
|
||||
mode->pixmapHeight = mode->imageHeight;
|
||||
mode->maxViewportX = mode->imageWidth - mode->viewportWidth;
|
||||
mode->maxViewportY = mode->imageHeight - mode->viewportHeight;
|
||||
|
||||
display_mode = display_mode->next;
|
||||
if (display_mode == scrn->modes)
|
||||
break;
|
||||
}
|
||||
if (xf86_config->dga_modes)
|
||||
xfree (xf86_config->dga_modes);
|
||||
xf86_config->dga_nmode = num;
|
||||
xf86_config->dga_modes = modes;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86_dga_set_mode(ScrnInfoPtr scrn, DGAModePtr display_mode)
|
||||
{
|
||||
ScreenPtr pScreen = scrn->pScreen;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
if (!display_mode)
|
||||
{
|
||||
if (xf86_config->dga_save_mode)
|
||||
{
|
||||
xf86SwitchMode(pScreen, xf86_config->dga_save_mode);
|
||||
xf86_config->dga_save_mode = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!xf86_config->dga_save_mode)
|
||||
{
|
||||
xf86_config->dga_save_mode = scrn->currentMode;
|
||||
xf86SwitchMode(pScreen, display_mode->mode);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int
|
||||
xf86_dga_get_viewport(ScrnInfoPtr scrn)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_set_viewport(ScrnInfoPtr scrn, int x, int y, int flags)
|
||||
{
|
||||
scrn->AdjustFrame(scrn->pScreen->myNum, x, y, flags);
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86_dga_get_drawable_and_gc (ScrnInfoPtr scrn, DrawablePtr *ppDrawable, GCPtr *ppGC)
|
||||
{
|
||||
ScreenPtr pScreen = scrn->pScreen;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
PixmapPtr pPixmap;
|
||||
GCPtr pGC;
|
||||
|
||||
pPixmap = GetScratchPixmapHeader (pScreen, xf86_config->dga_width, xf86_config->dga_height,
|
||||
scrn->depth, scrn->bitsPerPixel, xf86_config->dga_stride,
|
||||
(char *) scrn->memPhysBase + scrn->fbOffset);
|
||||
if (!pPixmap)
|
||||
return FALSE;
|
||||
pGC = GetScratchGC (scrn->depth, pScreen);
|
||||
if (!pGC)
|
||||
{
|
||||
FreeScratchPixmapHeader (pPixmap);
|
||||
return FALSE;
|
||||
}
|
||||
*ppDrawable = &pPixmap->drawable;
|
||||
*ppGC = pGC;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_release_drawable_and_gc (ScrnInfoPtr scrn, DrawablePtr pDrawable, GCPtr pGC)
|
||||
{
|
||||
FreeScratchGC (pGC);
|
||||
FreeScratchPixmapHeader ((PixmapPtr) pDrawable);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_fill_rect(ScrnInfoPtr scrn, int x, int y, int w, int h, unsigned long color)
|
||||
{
|
||||
GCPtr pGC;
|
||||
DrawablePtr pDrawable;
|
||||
XID vals[1];
|
||||
xRectangle r;
|
||||
|
||||
if (!xf86_dga_get_drawable_and_gc (scrn, &pDrawable, &pGC))
|
||||
return;
|
||||
vals[0] = color;
|
||||
ChangeGC (pGC, GCForeground, vals);
|
||||
ValidateGC (pDrawable, pGC);
|
||||
r.x = x;
|
||||
r.y = y;
|
||||
r.width = w;
|
||||
r.height = h;
|
||||
pGC->ops->PolyFillRect (pDrawable, pGC, 1, &r);
|
||||
xf86_dga_release_drawable_and_gc (scrn, pDrawable, pGC);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_sync(ScrnInfoPtr scrn)
|
||||
{
|
||||
ScreenPtr pScreen = scrn->pScreen;
|
||||
WindowPtr pRoot = WindowTable [pScreen->myNum];
|
||||
char buffer[4];
|
||||
|
||||
pScreen->GetImage (&pRoot->drawable, 0, 0, 1, 1, ZPixmap, ~0L, buffer);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_blit_rect(ScrnInfoPtr scrn, int srcx, int srcy, int w, int h, int dstx, int dsty)
|
||||
{
|
||||
DrawablePtr pDrawable;
|
||||
GCPtr pGC;
|
||||
|
||||
if (!xf86_dga_get_drawable_and_gc (scrn, &pDrawable, &pGC))
|
||||
return;
|
||||
ValidateGC (pDrawable, pGC);
|
||||
pGC->ops->CopyArea (pDrawable, pDrawable, pGC, srcx, srcy, w, h, dstx, dsty);
|
||||
xf86_dga_release_drawable_and_gc (scrn, pDrawable, pGC);
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86_dga_open_framebuffer(ScrnInfoPtr scrn,
|
||||
char **name,
|
||||
unsigned char **mem, int *size, int *offset, int *flags)
|
||||
{
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
*size = xf86_config->dga_stride * xf86_config->dga_height;
|
||||
*mem = (unsigned char *) (xf86_config->dga_address);
|
||||
*offset = 0;
|
||||
*flags = DGA_NEED_ROOT;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86_dga_close_framebuffer(ScrnInfoPtr scrn)
|
||||
{
|
||||
}
|
||||
|
||||
static DGAFunctionRec xf86_dga_funcs = {
|
||||
xf86_dga_open_framebuffer,
|
||||
xf86_dga_close_framebuffer,
|
||||
xf86_dga_set_mode,
|
||||
xf86_dga_set_viewport,
|
||||
xf86_dga_get_viewport,
|
||||
xf86_dga_sync,
|
||||
xf86_dga_fill_rect,
|
||||
xf86_dga_blit_rect,
|
||||
NULL
|
||||
};
|
||||
|
||||
_X_EXPORT Bool
|
||||
xf86DiDGAReInit (ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
if (!xf86_dga_get_modes (pScreen))
|
||||
return FALSE;
|
||||
|
||||
return DGAReInitModes (pScreen, xf86_config->dga_modes, xf86_config->dga_nmode);
|
||||
}
|
||||
|
||||
_X_EXPORT Bool
|
||||
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
xf86_config->dga_flags = 0;
|
||||
xf86_config->dga_address = dga_address;
|
||||
xf86_config->dga_width = scrn->virtualX;
|
||||
xf86_config->dga_height = scrn->virtualY;
|
||||
xf86_config->dga_stride = scrn->displayWidth * scrn->bitsPerPixel >> 3;
|
||||
|
||||
if (!xf86_dga_get_modes (pScreen))
|
||||
return FALSE;
|
||||
|
||||
return DGAInit(pScreen, &xf86_dga_funcs, xf86_config->dga_modes, xf86_config->dga_nmode);
|
||||
}
|
@ -1,769 +0,0 @@
|
||||
/*
|
||||
* Copyright 2006 Luc Verhaegen.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sub license,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file This file covers code to convert a xf86MonPtr containing EDID-probed
|
||||
* information into a list of modes, including applying monitor-specific
|
||||
* quirks to fix broken EDID data.
|
||||
*/
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86DDC.h"
|
||||
#include <X11/Xatom.h>
|
||||
#include "property.h"
|
||||
#include "propertyst.h"
|
||||
#include "xf86DDC.h"
|
||||
#include "xf86Crtc.h"
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
/*
|
||||
* Quirks to work around broken EDID data from various monitors.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
DDC_QUIRK_NONE = 0,
|
||||
/* First detailed mode is bogus, prefer largest mode at 60hz */
|
||||
DDC_QUIRK_PREFER_LARGE_60 = 1 << 0,
|
||||
/* 135MHz clock is too high, drop a bit */
|
||||
DDC_QUIRK_135_CLOCK_TOO_HIGH = 1 << 1,
|
||||
/* Prefer the largest mode at 75 Hz */
|
||||
DDC_QUIRK_PREFER_LARGE_75 = 1 << 2,
|
||||
/* Convert detailed timing's horizontal from units of cm to mm */
|
||||
DDC_QUIRK_DETAILED_H_IN_CM = 1 << 3,
|
||||
/* Convert detailed timing's vertical from units of cm to mm */
|
||||
DDC_QUIRK_DETAILED_V_IN_CM = 1 << 4,
|
||||
/* Detailed timing descriptors have bogus size values, so just take the
|
||||
* maximum size and use that.
|
||||
*/
|
||||
DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE = 1 << 5,
|
||||
/* Monitor forgot to set the first detailed is preferred bit. */
|
||||
DDC_QUIRK_FIRST_DETAILED_PREFERRED = 1 << 6,
|
||||
/* use +hsync +vsync for detailed mode */
|
||||
DDC_QUIRK_DETAILED_SYNC_PP = 1 << 7,
|
||||
} ddc_quirk_t;
|
||||
|
||||
static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Belinea 10 15 55 */
|
||||
if (memcmp (DDC->vendor.name, "MAX", 4) == 0 &&
|
||||
((DDC->vendor.prod_id == 1516) ||
|
||||
(DDC->vendor.prod_id == 0x77e)))
|
||||
return TRUE;
|
||||
|
||||
/* Acer AL1706 */
|
||||
if (memcmp (DDC->vendor.name, "ACR", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 44358)
|
||||
return TRUE;
|
||||
|
||||
/* Bug #10814: Samsung SyncMaster 225BW */
|
||||
if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 596)
|
||||
return TRUE;
|
||||
|
||||
/* Bug #10545: Samsung SyncMaster 226BW */
|
||||
if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 638)
|
||||
return TRUE;
|
||||
|
||||
/* Acer F51 */
|
||||
if (memcmp (DDC->vendor.name, "API", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 0x7602)
|
||||
return TRUE;
|
||||
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_prefer_large_75 (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Bug #11603: Funai Electronics PM36B */
|
||||
if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 13600)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_detailed_h_in_cm (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Bug #11603: Funai Electronics PM36B */
|
||||
if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 13600)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_detailed_v_in_cm (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Bug #11603: Funai Electronics PM36B */
|
||||
if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 13600)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_detailed_use_maximum_size (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Bug #10304: LGPhilipsLCD LP154W01-A5 */
|
||||
if (memcmp (DDC->vendor.name, "LPL", 4) == 0 &&
|
||||
(DDC->vendor.prod_id == 0 || DDC->vendor.prod_id == 0x2a00))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_135_clock_too_high (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Envision Peripherals, Inc. EN-7100e. See bug #9550. */
|
||||
if (memcmp (DDC->vendor.name, "EPI", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 59264)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_first_detailed_preferred (int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Philips 107p5 CRT. Reported on xorg@ with pastebin. */
|
||||
if (memcmp (DDC->vendor.name, "PHL", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 57364)
|
||||
return TRUE;
|
||||
|
||||
/* Proview AY765C 17" LCD. See bug #15160*/
|
||||
if (memcmp (DDC->vendor.name, "PTS", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 765)
|
||||
return TRUE;
|
||||
|
||||
/* ACR of some sort RH #284231 */
|
||||
if (memcmp (DDC->vendor.name, "ACR", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 2423)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Bool quirk_detailed_sync_pp(int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
/* Bug #12439: Samsung SyncMaster 205BW */
|
||||
if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
|
||||
DDC->vendor.prod_id == 541)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
Bool (*detect) (int scrnIndex, xf86MonPtr DDC);
|
||||
ddc_quirk_t quirk;
|
||||
char *description;
|
||||
} ddc_quirk_map_t;
|
||||
|
||||
static const ddc_quirk_map_t ddc_quirks[] = {
|
||||
{
|
||||
quirk_prefer_large_60, DDC_QUIRK_PREFER_LARGE_60,
|
||||
"Detailed timing is not preferred, use largest mode at 60Hz"
|
||||
},
|
||||
{
|
||||
quirk_135_clock_too_high, DDC_QUIRK_135_CLOCK_TOO_HIGH,
|
||||
"Recommended 135MHz pixel clock is too high"
|
||||
},
|
||||
{
|
||||
quirk_prefer_large_75, DDC_QUIRK_PREFER_LARGE_75,
|
||||
"Detailed timing is not preferred, use largest mode at 75Hz"
|
||||
},
|
||||
{
|
||||
quirk_detailed_h_in_cm, DDC_QUIRK_DETAILED_H_IN_CM,
|
||||
"Detailed timings give horizontal size in cm."
|
||||
},
|
||||
{
|
||||
quirk_detailed_v_in_cm, DDC_QUIRK_DETAILED_V_IN_CM,
|
||||
"Detailed timings give vertical size in cm."
|
||||
},
|
||||
{
|
||||
quirk_detailed_use_maximum_size, DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE,
|
||||
"Detailed timings give sizes in cm."
|
||||
},
|
||||
{
|
||||
quirk_first_detailed_preferred, DDC_QUIRK_FIRST_DETAILED_PREFERRED,
|
||||
"First detailed timing was not marked as preferred."
|
||||
},
|
||||
{
|
||||
quirk_detailed_sync_pp, DDC_QUIRK_DETAILED_SYNC_PP,
|
||||
"Use +hsync +vsync for detailed timing."
|
||||
},
|
||||
{
|
||||
NULL, DDC_QUIRK_NONE,
|
||||
"No known quirks"
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* - for those with access to the VESA DMT standard; review please.
|
||||
*/
|
||||
#define MODEPREFIX NULL, NULL, NULL, 0, M_T_DRIVER
|
||||
#define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
|
||||
|
||||
static const DisplayModeRec DDCEstablishedModes[17] = {
|
||||
{ MODEPREFIX, 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */
|
||||
{ MODEPREFIX, 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */
|
||||
{ MODEPREFIX, 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */
|
||||
{ MODEPREFIX, 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
|
||||
{ MODEPREFIX, 30240, 640, 704, 768, 864, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@67Hz */
|
||||
{ MODEPREFIX, 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
|
||||
{ MODEPREFIX, 35500, 720, 738, 846, 900, 0, 400, 421, 423, 449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400@88Hz */
|
||||
{ MODEPREFIX, 28320, 720, 738, 846, 900, 0, 400, 412, 414, 449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@70Hz */
|
||||
{ MODEPREFIX, 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */
|
||||
{ MODEPREFIX, 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
|
||||
{ MODEPREFIX, 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */
|
||||
{ MODEPREFIX, 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */
|
||||
{ MODEPREFIX, 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */
|
||||
{ MODEPREFIX, 57284, 832, 864, 928, 1152, 0, 624, 625, 628, 667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624@75Hz */
|
||||
{ MODEPREFIX, 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */
|
||||
{ MODEPREFIX, 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */
|
||||
{ MODEPREFIX, 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864@75Hz */
|
||||
};
|
||||
|
||||
static DisplayModePtr
|
||||
DDCModesFromEstablished(int scrnIndex, struct established_timings *timing,
|
||||
ddc_quirk_t quirks)
|
||||
{
|
||||
DisplayModePtr Modes = NULL, Mode = NULL;
|
||||
CARD32 bits = (timing->t1) | (timing->t2 << 8) |
|
||||
((timing->t_manu & 0x80) << 9);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 17; i++) {
|
||||
if (bits & (0x01 << i)) {
|
||||
Mode = xf86DuplicateMode(&DDCEstablishedModes[i]);
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
}
|
||||
}
|
||||
|
||||
return Modes;
|
||||
}
|
||||
|
||||
#define LEVEL_DMT 0
|
||||
#define LEVEL_GTF 1
|
||||
#define LEVEL_CVT 2
|
||||
|
||||
static int
|
||||
MonitorStandardTimingLevel(xf86MonPtr DDC)
|
||||
{
|
||||
if (DDC->ver.revision >= 2) {
|
||||
if (DDC->ver.revision >= 4 && CVT_SUPPORTED(DDC->features.msc)) {
|
||||
return LEVEL_CVT;
|
||||
}
|
||||
return LEVEL_GTF;
|
||||
}
|
||||
return LEVEL_DMT;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is not really correct. Appendix B of the EDID 1.4 spec defines
|
||||
* the right thing to do here. If the timing given here matches a mode
|
||||
* defined in the VESA DMT standard, we _must_ use that. If the device
|
||||
* supports CVT modes, then we should generate a CVT timing. If both
|
||||
* of the above fail, use GTF.
|
||||
*
|
||||
* There are some wrinkles here. EDID 1.1 and 1.0 sinks can't really
|
||||
* "support" GTF, since it wasn't a standard yet; so if they ask for a
|
||||
* timing in this section that isn't defined in DMT, returning a GTF mode
|
||||
* may not actually be valid. EDID 1.3 sinks often report support for
|
||||
* some CVT modes, but they are not required to support CVT timings for
|
||||
* modes in the standard timing descriptor, so we should _not_ treat them
|
||||
* as CVT-compliant (unless specified in an extension block I suppose).
|
||||
*
|
||||
* EDID 1.4 requires that all sink devices support both GTF and CVT timings
|
||||
* for modes in this section, but does say that CVT is preferred.
|
||||
*/
|
||||
static DisplayModePtr
|
||||
DDCModesFromStandardTiming(struct std_timings *timing, ddc_quirk_t quirks,
|
||||
int timing_level)
|
||||
{
|
||||
DisplayModePtr Modes = NULL, Mode = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < STD_TIMINGS; i++) {
|
||||
if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
|
||||
/* XXX check for DMT first, else... */
|
||||
if (timing_level == LEVEL_CVT)
|
||||
Mode = xf86CVTMode(timing[i].hsize, timing[i].vsize,
|
||||
timing[i].refresh, FALSE, FALSE);
|
||||
else
|
||||
Mode = xf86GTFMode(timing[i].hsize, timing[i].vsize,
|
||||
timing[i].refresh, FALSE, FALSE);
|
||||
|
||||
Mode->type = M_T_DRIVER;
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
}
|
||||
}
|
||||
|
||||
return Modes;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
static DisplayModePtr
|
||||
DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
|
||||
Bool preferred, ddc_quirk_t quirks)
|
||||
{
|
||||
DisplayModePtr Mode;
|
||||
|
||||
/*
|
||||
* Refuse to create modes that are insufficiently large. 64 is a random
|
||||
* number, maybe the spec says something about what the minimum is. In
|
||||
* particular I see this frequently with _old_ EDID, 1.0 or so, so maybe
|
||||
* our parser is just being too aggresive there.
|
||||
*/
|
||||
if (timing->h_active < 64 || timing->v_active < 64) {
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"%s: Ignoring tiny %dx%d mode\n", __func__,
|
||||
timing->h_active, timing->v_active);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* We don't do stereo */
|
||||
if (timing->stereo) {
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"%s: Ignoring: We don't handle stereo.\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* We only do seperate sync currently */
|
||||
if (timing->sync != 0x03) {
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"%s: %dx%d Warning: We only handle separate"
|
||||
" sync.\n", __func__, timing->h_active, timing->v_active);
|
||||
}
|
||||
|
||||
Mode = xnfcalloc(1, sizeof(DisplayModeRec));
|
||||
|
||||
Mode->type = M_T_DRIVER;
|
||||
if (preferred)
|
||||
Mode->type |= M_T_PREFERRED;
|
||||
|
||||
if( ( quirks & DDC_QUIRK_135_CLOCK_TOO_HIGH ) &&
|
||||
timing->clock == 135000000 )
|
||||
Mode->Clock = 108880;
|
||||
else
|
||||
Mode->Clock = timing->clock / 1000.0;
|
||||
|
||||
Mode->HDisplay = timing->h_active;
|
||||
Mode->HSyncStart = timing->h_active + timing->h_sync_off;
|
||||
Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
|
||||
Mode->HTotal = timing->h_active + timing->h_blanking;
|
||||
|
||||
Mode->VDisplay = timing->v_active;
|
||||
Mode->VSyncStart = timing->v_active + timing->v_sync_off;
|
||||
Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
|
||||
Mode->VTotal = timing->v_active + timing->v_blanking;
|
||||
|
||||
/* perform basic check on the detail timing */
|
||||
if (Mode->HSyncEnd > Mode->HTotal || Mode->VSyncEnd > Mode->VTotal) {
|
||||
xfree(Mode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xf86SetModeDefaultName(Mode);
|
||||
|
||||
/* We ignore h/v_size and h/v_border for now. */
|
||||
|
||||
if (timing->interlaced)
|
||||
Mode->Flags |= V_INTERLACE;
|
||||
|
||||
if (quirks & DDC_QUIRK_DETAILED_SYNC_PP)
|
||||
Mode->Flags |= V_PVSYNC | V_PHSYNC;
|
||||
else {
|
||||
if (timing->misc & 0x02)
|
||||
Mode->Flags |= V_PVSYNC;
|
||||
else
|
||||
Mode->Flags |= V_NVSYNC;
|
||||
|
||||
if (timing->misc & 0x01)
|
||||
Mode->Flags |= V_PHSYNC;
|
||||
else
|
||||
Mode->Flags |= V_NHSYNC;
|
||||
}
|
||||
|
||||
return Mode;
|
||||
}
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
static DisplayModePtr
|
||||
DDCModesFromCVT(int scrnIndex, struct cvt_timings *t)
|
||||
{
|
||||
DisplayModePtr modes = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (t[i].height) {
|
||||
if (t[i].rates & 0x10)
|
||||
modes = xf86ModesAdd(modes,
|
||||
xf86CVTMode(t[i].width, t[i].height, 50, 0, 0));
|
||||
if (t[i].rates & 0x08)
|
||||
modes = xf86ModesAdd(modes,
|
||||
xf86CVTMode(t[i].width, t[i].height, 60, 0, 0));
|
||||
if (t[i].rates & 0x04)
|
||||
modes = xf86ModesAdd(modes,
|
||||
xf86CVTMode(t[i].width, t[i].height, 75, 0, 0));
|
||||
if (t[i].rates & 0x02)
|
||||
modes = xf86ModesAdd(modes,
|
||||
xf86CVTMode(t[i].width, t[i].height, 85, 0, 0));
|
||||
if (t[i].rates & 0x01)
|
||||
modes = xf86ModesAdd(modes,
|
||||
xf86CVTMode(t[i].width, t[i].height, 60, 1, 0));
|
||||
} else break;
|
||||
}
|
||||
|
||||
return modes;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* This is only valid when the sink claims to be continuous-frequency
|
||||
* but does not supply a detailed range descriptor. Such sinks are
|
||||
* arguably broken. Currently the mode validation code isn't aware of
|
||||
* this; the non-RANDR code even punts the decision of optional sync
|
||||
* range checking to the driver. Loss.
|
||||
*/
|
||||
static void
|
||||
DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
|
||||
{
|
||||
DisplayModePtr Mode = Modes;
|
||||
|
||||
if (!Monitor || !Modes)
|
||||
return;
|
||||
|
||||
/* set up the ranges for scanning through the modes */
|
||||
Monitor->nHsync = 1;
|
||||
Monitor->hsync[0].lo = 1024.0;
|
||||
Monitor->hsync[0].hi = 0.0;
|
||||
|
||||
Monitor->nVrefresh = 1;
|
||||
Monitor->vrefresh[0].lo = 1024.0;
|
||||
Monitor->vrefresh[0].hi = 0.0;
|
||||
|
||||
while (Mode) {
|
||||
if (!Mode->HSync)
|
||||
Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
|
||||
|
||||
if (!Mode->VRefresh)
|
||||
Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
|
||||
((float) (Mode->HTotal * Mode->VTotal));
|
||||
|
||||
if (Mode->HSync < Monitor->hsync[0].lo)
|
||||
Monitor->hsync[0].lo = Mode->HSync;
|
||||
|
||||
if (Mode->HSync > Monitor->hsync[0].hi)
|
||||
Monitor->hsync[0].hi = Mode->HSync;
|
||||
|
||||
if (Mode->VRefresh < Monitor->vrefresh[0].lo)
|
||||
Monitor->vrefresh[0].lo = Mode->VRefresh;
|
||||
|
||||
if (Mode->VRefresh > Monitor->vrefresh[0].hi)
|
||||
Monitor->vrefresh[0].hi = Mode->VRefresh;
|
||||
|
||||
Mode = Mode->next;
|
||||
}
|
||||
}
|
||||
|
||||
static ddc_quirk_t
|
||||
xf86DDCDetectQuirks(int scrnIndex, xf86MonPtr DDC, Bool verbose)
|
||||
{
|
||||
ddc_quirk_t quirks;
|
||||
int i;
|
||||
|
||||
quirks = DDC_QUIRK_NONE;
|
||||
for (i = 0; ddc_quirks[i].detect; i++) {
|
||||
if (ddc_quirks[i].detect (scrnIndex, DDC)) {
|
||||
if (verbose) {
|
||||
xf86DrvMsg (scrnIndex, X_INFO, " EDID quirk: %s\n",
|
||||
ddc_quirks[i].description);
|
||||
}
|
||||
quirks |= ddc_quirks[i].quirk;
|
||||
}
|
||||
}
|
||||
|
||||
return quirks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies monitor-specific quirks to the decoded EDID information.
|
||||
*
|
||||
* Note that some quirks applying to the mode list are still implemented in
|
||||
* xf86DDCGetModes.
|
||||
*/
|
||||
void
|
||||
xf86DDCApplyQuirks(int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
ddc_quirk_t quirks = xf86DDCDetectQuirks (scrnIndex, DDC, FALSE);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < DET_TIMINGS; i++) {
|
||||
struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
|
||||
|
||||
if (det_mon->type != DT)
|
||||
continue;
|
||||
|
||||
if (quirks & DDC_QUIRK_DETAILED_H_IN_CM)
|
||||
det_mon->section.d_timings.h_size *= 10;
|
||||
|
||||
if (quirks & DDC_QUIRK_DETAILED_V_IN_CM)
|
||||
det_mon->section.d_timings.v_size *= 10;
|
||||
|
||||
if (quirks & DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
|
||||
det_mon->section.d_timings.h_size = 10 * DDC->features.hsize;
|
||||
det_mon->section.d_timings.v_size = 10 * DDC->features.vsize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Walks the modes list, finding the mode with the largest area which is
|
||||
* closest to the target refresh rate, and marks it as the only preferred mode.
|
||||
*/
|
||||
static void
|
||||
xf86DDCSetPreferredRefresh(int scrnIndex, DisplayModePtr modes,
|
||||
float target_refresh)
|
||||
{
|
||||
DisplayModePtr mode, best = modes;
|
||||
|
||||
for (mode = modes; mode; mode = mode->next)
|
||||
{
|
||||
mode->type &= ~M_T_PREFERRED;
|
||||
|
||||
if (mode == best) continue;
|
||||
|
||||
if (mode->HDisplay * mode->VDisplay >
|
||||
best->HDisplay * best->VDisplay)
|
||||
{
|
||||
best = mode;
|
||||
continue;
|
||||
}
|
||||
if (mode->HDisplay * mode->VDisplay ==
|
||||
best->HDisplay * best->VDisplay)
|
||||
{
|
||||
double mode_refresh = xf86ModeVRefresh (mode);
|
||||
double best_refresh = xf86ModeVRefresh (best);
|
||||
double mode_dist = fabs(mode_refresh - target_refresh);
|
||||
double best_dist = fabs(best_refresh - target_refresh);
|
||||
|
||||
if (mode_dist < best_dist)
|
||||
{
|
||||
best = mode;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best)
|
||||
best->type |= M_T_PREFERRED;
|
||||
}
|
||||
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
|
||||
{
|
||||
int i;
|
||||
DisplayModePtr Modes = NULL, Mode;
|
||||
ddc_quirk_t quirks;
|
||||
Bool preferred;
|
||||
int timing_level;
|
||||
|
||||
xf86DrvMsg (scrnIndex, X_INFO, "EDID vendor \"%s\", prod id %d\n",
|
||||
DDC->vendor.name, DDC->vendor.prod_id);
|
||||
|
||||
quirks = xf86DDCDetectQuirks(scrnIndex, DDC, TRUE);
|
||||
|
||||
preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
|
||||
if (DDC->ver.revision >= 4)
|
||||
preferred = TRUE;
|
||||
if (quirks & DDC_QUIRK_FIRST_DETAILED_PREFERRED)
|
||||
preferred = TRUE;
|
||||
if (quirks & (DDC_QUIRK_PREFER_LARGE_60 | DDC_QUIRK_PREFER_LARGE_75))
|
||||
preferred = FALSE;
|
||||
|
||||
timing_level = MonitorStandardTimingLevel(DDC);
|
||||
|
||||
for (i = 0; i < DET_TIMINGS; i++) {
|
||||
struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
|
||||
|
||||
switch (det_mon->type) {
|
||||
case DT:
|
||||
Mode = DDCModeFromDetailedTiming(scrnIndex,
|
||||
&det_mon->section.d_timings,
|
||||
preferred,
|
||||
quirks);
|
||||
preferred = FALSE;
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
break;
|
||||
case DS_STD_TIMINGS:
|
||||
Mode = DDCModesFromStandardTiming(det_mon->section.std_t,
|
||||
quirks, timing_level);
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
break;
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
case DS_CVT:
|
||||
Mode = DDCModesFromCVT(scrnIndex, det_mon->section.cvt);
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add established timings */
|
||||
Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1, quirks);
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
|
||||
/* Add standard timings */
|
||||
Mode = DDCModesFromStandardTiming(DDC->timings2, quirks, timing_level);
|
||||
Modes = xf86ModesAdd(Modes, Mode);
|
||||
|
||||
if (quirks & DDC_QUIRK_PREFER_LARGE_60)
|
||||
xf86DDCSetPreferredRefresh(scrnIndex, Modes, 60);
|
||||
|
||||
if (quirks & DDC_QUIRK_PREFER_LARGE_75)
|
||||
xf86DDCSetPreferredRefresh(scrnIndex, Modes, 75);
|
||||
|
||||
return Modes;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill out MonPtr with xf86MonPtr information.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
|
||||
{
|
||||
DisplayModePtr Modes = NULL, Mode;
|
||||
int i, clock;
|
||||
Bool have_hsync = FALSE, have_vrefresh = FALSE, have_maxpixclock = FALSE;
|
||||
|
||||
if (!Monitor || !DDC)
|
||||
return;
|
||||
|
||||
Monitor->DDC = DDC;
|
||||
|
||||
if (Monitor->widthmm <= 0 && Monitor->heightmm <= 0) {
|
||||
Monitor->widthmm = 10 * DDC->features.hsize;
|
||||
Monitor->heightmm = 10 * DDC->features.vsize;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is a digital display, then we can use reduced blanking.
|
||||
* XXX This is a 1.3 heuristic. 1.4 explicitly defines rb support.
|
||||
*/
|
||||
if (DDC->features.input_type)
|
||||
Monitor->reducedblanking = TRUE;
|
||||
|
||||
Modes = xf86DDCGetModes(scrnIndex, DDC);
|
||||
|
||||
/* Skip EDID ranges if they were specified in the config file */
|
||||
have_hsync = (Monitor->nHsync != 0);
|
||||
have_vrefresh = (Monitor->nVrefresh != 0);
|
||||
have_maxpixclock = (Monitor->maxPixClock != 0);
|
||||
|
||||
/* Go through the detailed monitor sections */
|
||||
for (i = 0; i < DET_TIMINGS; i++) {
|
||||
switch (DDC->det_mon[i].type) {
|
||||
case DS_RANGES:
|
||||
if (!have_hsync) {
|
||||
if (!Monitor->nHsync)
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"Using EDID range info for horizontal sync\n");
|
||||
Monitor->hsync[Monitor->nHsync].lo =
|
||||
DDC->det_mon[i].section.ranges.min_h;
|
||||
Monitor->hsync[Monitor->nHsync].hi =
|
||||
DDC->det_mon[i].section.ranges.max_h;
|
||||
Monitor->nHsync++;
|
||||
} else {
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"Using hsync ranges from config file\n");
|
||||
}
|
||||
|
||||
if (!have_vrefresh) {
|
||||
if (!Monitor->nVrefresh)
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"Using EDID range info for vertical refresh\n");
|
||||
Monitor->vrefresh[Monitor->nVrefresh].lo =
|
||||
DDC->det_mon[i].section.ranges.min_v;
|
||||
Monitor->vrefresh[Monitor->nVrefresh].hi =
|
||||
DDC->det_mon[i].section.ranges.max_v;
|
||||
Monitor->nVrefresh++;
|
||||
} else {
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"Using vrefresh ranges from config file\n");
|
||||
}
|
||||
|
||||
clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
|
||||
if (!have_maxpixclock && clock > Monitor->maxPixClock)
|
||||
Monitor->maxPixClock = clock;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Modes) {
|
||||
/* Print Modes */
|
||||
xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
|
||||
|
||||
Mode = Modes;
|
||||
while (Mode) {
|
||||
xf86PrintModeline(scrnIndex, Mode);
|
||||
Mode = Mode->next;
|
||||
}
|
||||
|
||||
/* Do we still need ranges to be filled in? */
|
||||
if (!Monitor->nHsync || !Monitor->nVrefresh)
|
||||
DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
|
||||
|
||||
/* look for last Mode */
|
||||
Mode = Modes;
|
||||
|
||||
while (Mode->next)
|
||||
Mode = Mode->next;
|
||||
|
||||
/* add to MonPtr */
|
||||
if (Monitor->Modes) {
|
||||
Monitor->Last->next = Modes;
|
||||
Modes->prev = Monitor->Last;
|
||||
Monitor->Last = Mode;
|
||||
} else {
|
||||
Monitor->Modes = Modes;
|
||||
Monitor->Last = Mode;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,702 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "xf86Modes.h"
|
||||
#include "xf86Priv.h"
|
||||
|
||||
extern XF86ConfigPtr xf86configptr;
|
||||
|
||||
/*
|
||||
* This is the version number where we epoched. These files get copied
|
||||
* into drivers that want to use this setup infrastructure on pre-1.3
|
||||
* servers, so when that happens they need to define these symbols
|
||||
* themselves. However, _in_ the server, we basically always define them now.
|
||||
*/
|
||||
#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(7,2,99,2,0)
|
||||
|
||||
/**
|
||||
* Calculates the horizontal sync rate of a mode.
|
||||
*
|
||||
* Exact copy of xf86Mode.c's.
|
||||
*/
|
||||
_X_EXPORT double
|
||||
xf86ModeHSync(DisplayModePtr mode)
|
||||
{
|
||||
double hsync = 0.0;
|
||||
|
||||
if (mode->HSync > 0.0)
|
||||
hsync = mode->HSync;
|
||||
else if (mode->HTotal > 0)
|
||||
hsync = (float)mode->Clock / (float)mode->HTotal;
|
||||
|
||||
return hsync;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the vertical refresh rate of a mode.
|
||||
*
|
||||
* Exact copy of xf86Mode.c's.
|
||||
*/
|
||||
_X_EXPORT double
|
||||
xf86ModeVRefresh(DisplayModePtr mode)
|
||||
{
|
||||
double refresh = 0.0;
|
||||
|
||||
if (mode->VRefresh > 0.0)
|
||||
refresh = mode->VRefresh;
|
||||
else if (mode->HTotal > 0 && mode->VTotal > 0) {
|
||||
refresh = mode->Clock * 1000.0 / mode->HTotal / mode->VTotal;
|
||||
if (mode->Flags & V_INTERLACE)
|
||||
refresh *= 2.0;
|
||||
if (mode->Flags & V_DBLSCAN)
|
||||
refresh /= 2.0;
|
||||
if (mode->VScan > 1)
|
||||
refresh /= (float)(mode->VScan);
|
||||
}
|
||||
return refresh;
|
||||
}
|
||||
|
||||
_X_EXPORT int
|
||||
xf86ModeWidth (DisplayModePtr mode, Rotation rotation)
|
||||
{
|
||||
switch (rotation & 0xf) {
|
||||
case RR_Rotate_0:
|
||||
case RR_Rotate_180:
|
||||
return mode->HDisplay;
|
||||
case RR_Rotate_90:
|
||||
case RR_Rotate_270:
|
||||
return mode->VDisplay;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT int
|
||||
xf86ModeHeight (DisplayModePtr mode, Rotation rotation)
|
||||
{
|
||||
switch (rotation & 0xf) {
|
||||
case RR_Rotate_0:
|
||||
case RR_Rotate_180:
|
||||
return mode->VDisplay;
|
||||
case RR_Rotate_90:
|
||||
case RR_Rotate_270:
|
||||
return mode->HDisplay;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** Calculates the memory bandwidth (in MiB/sec) of a mode. */
|
||||
_X_EXPORT unsigned int
|
||||
xf86ModeBandwidth(DisplayModePtr mode, int depth)
|
||||
{
|
||||
float a_active, a_total, active_percent, pixels_per_second;
|
||||
int bytes_per_pixel = (depth + 7) / 8;
|
||||
|
||||
if (!mode->HTotal || !mode->VTotal || !mode->Clock)
|
||||
return 0;
|
||||
|
||||
a_active = mode->HDisplay * mode->VDisplay;
|
||||
a_total = mode->HTotal * mode->VTotal;
|
||||
active_percent = a_active / a_total;
|
||||
pixels_per_second = active_percent * mode->Clock * 1000.0;
|
||||
|
||||
return (unsigned int)(pixels_per_second * bytes_per_pixel / (1024 * 1024));
|
||||
}
|
||||
|
||||
/** Sets a default mode name of <width>x<height> on a mode. */
|
||||
_X_EXPORT void
|
||||
xf86SetModeDefaultName(DisplayModePtr mode)
|
||||
{
|
||||
if (mode->name != NULL)
|
||||
xfree(mode->name);
|
||||
|
||||
mode->name = XNFprintf("%dx%d", mode->HDisplay, mode->VDisplay);
|
||||
}
|
||||
|
||||
/*
|
||||
* xf86SetModeCrtc
|
||||
*
|
||||
* Initialises the Crtc parameters for a mode. The initialisation includes
|
||||
* adjustments for interlaced and double scan modes.
|
||||
*
|
||||
* Exact copy of xf86Mode.c's.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86SetModeCrtc(DisplayModePtr p, int adjustFlags)
|
||||
{
|
||||
if ((p == NULL) || ((p->type & M_T_CRTC_C) == M_T_BUILTIN))
|
||||
return;
|
||||
|
||||
p->CrtcHDisplay = p->HDisplay;
|
||||
p->CrtcHSyncStart = p->HSyncStart;
|
||||
p->CrtcHSyncEnd = p->HSyncEnd;
|
||||
p->CrtcHTotal = p->HTotal;
|
||||
p->CrtcHSkew = p->HSkew;
|
||||
p->CrtcVDisplay = p->VDisplay;
|
||||
p->CrtcVSyncStart = p->VSyncStart;
|
||||
p->CrtcVSyncEnd = p->VSyncEnd;
|
||||
p->CrtcVTotal = p->VTotal;
|
||||
if (p->Flags & V_INTERLACE) {
|
||||
if (adjustFlags & INTERLACE_HALVE_V) {
|
||||
p->CrtcVDisplay /= 2;
|
||||
p->CrtcVSyncStart /= 2;
|
||||
p->CrtcVSyncEnd /= 2;
|
||||
p->CrtcVTotal /= 2;
|
||||
}
|
||||
/* Force interlaced modes to have an odd VTotal */
|
||||
/* maybe we should only do this when INTERLACE_HALVE_V is set? */
|
||||
p->CrtcVTotal |= 1;
|
||||
}
|
||||
|
||||
if (p->Flags & V_DBLSCAN) {
|
||||
p->CrtcVDisplay *= 2;
|
||||
p->CrtcVSyncStart *= 2;
|
||||
p->CrtcVSyncEnd *= 2;
|
||||
p->CrtcVTotal *= 2;
|
||||
}
|
||||
if (p->VScan > 1) {
|
||||
p->CrtcVDisplay *= p->VScan;
|
||||
p->CrtcVSyncStart *= p->VScan;
|
||||
p->CrtcVSyncEnd *= p->VScan;
|
||||
p->CrtcVTotal *= p->VScan;
|
||||
}
|
||||
p->CrtcVBlankStart = min(p->CrtcVSyncStart, p->CrtcVDisplay);
|
||||
p->CrtcVBlankEnd = max(p->CrtcVSyncEnd, p->CrtcVTotal);
|
||||
p->CrtcHBlankStart = min(p->CrtcHSyncStart, p->CrtcHDisplay);
|
||||
p->CrtcHBlankEnd = max(p->CrtcHSyncEnd, p->CrtcHTotal);
|
||||
|
||||
p->CrtcHAdjusted = FALSE;
|
||||
p->CrtcVAdjusted = FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocates and returns a copy of pMode, including pointers within pMode.
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86DuplicateMode(DisplayModePtr pMode)
|
||||
{
|
||||
DisplayModePtr pNew;
|
||||
|
||||
pNew = xnfalloc(sizeof(DisplayModeRec));
|
||||
*pNew = *pMode;
|
||||
pNew->next = NULL;
|
||||
pNew->prev = NULL;
|
||||
|
||||
if (pMode->name == NULL)
|
||||
xf86SetModeDefaultName(pNew);
|
||||
else
|
||||
pNew->name = xnfstrdup(pMode->name);
|
||||
|
||||
return pNew;
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicates every mode in the given list and returns a pointer to the first
|
||||
* mode.
|
||||
*
|
||||
* \param modeList doubly-linked mode list
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||||
{
|
||||
DisplayModePtr first = NULL, last = NULL;
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
DisplayModePtr new;
|
||||
|
||||
new = xf86DuplicateMode(mode);
|
||||
|
||||
/* Insert pNew into modeList */
|
||||
if (last) {
|
||||
last->next = new;
|
||||
new->prev = last;
|
||||
} else {
|
||||
first = new;
|
||||
new->prev = NULL;
|
||||
}
|
||||
new->next = NULL;
|
||||
last = new;
|
||||
}
|
||||
|
||||
return first;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given modes should program to the same timings.
|
||||
*
|
||||
* This doesn't use Crtc values, as it might be used on ModeRecs without the
|
||||
* Crtc values set. So, it's assumed that the other numbers are enough.
|
||||
*
|
||||
* This isn't in xf86Modes.c, but it might deserve to be there.
|
||||
*/
|
||||
_X_EXPORT Bool
|
||||
xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2)
|
||||
{
|
||||
if (pMode1->Clock == pMode2->Clock &&
|
||||
pMode1->HDisplay == pMode2->HDisplay &&
|
||||
pMode1->HSyncStart == pMode2->HSyncStart &&
|
||||
pMode1->HSyncEnd == pMode2->HSyncEnd &&
|
||||
pMode1->HTotal == pMode2->HTotal &&
|
||||
pMode1->HSkew == pMode2->HSkew &&
|
||||
pMode1->VDisplay == pMode2->VDisplay &&
|
||||
pMode1->VSyncStart == pMode2->VSyncStart &&
|
||||
pMode1->VSyncEnd == pMode2->VSyncEnd &&
|
||||
pMode1->VTotal == pMode2->VTotal &&
|
||||
pMode1->VScan == pMode2->VScan &&
|
||||
pMode1->Flags == pMode2->Flags)
|
||||
{
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* exact copy of xf86Mode.c */
|
||||
static void
|
||||
add(char **p, char *new)
|
||||
{
|
||||
*p = xnfrealloc(*p, strlen(*p) + strlen(new) + 2);
|
||||
strcat(*p, " ");
|
||||
strcat(*p, new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print out a modeline.
|
||||
*
|
||||
* Convenient VRefresh printing was added, though, compared to xf86Mode.c
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86PrintModeline(int scrnIndex,DisplayModePtr mode)
|
||||
{
|
||||
char tmp[256];
|
||||
char *flags = xnfcalloc(1, 1);
|
||||
|
||||
if (mode->HSkew) {
|
||||
snprintf(tmp, 256, "hskew %i", mode->HSkew);
|
||||
add(&flags, tmp);
|
||||
}
|
||||
if (mode->VScan) {
|
||||
snprintf(tmp, 256, "vscan %i", mode->VScan);
|
||||
add(&flags, tmp);
|
||||
}
|
||||
if (mode->Flags & V_INTERLACE) add(&flags, "interlace");
|
||||
if (mode->Flags & V_CSYNC) add(&flags, "composite");
|
||||
if (mode->Flags & V_DBLSCAN) add(&flags, "doublescan");
|
||||
if (mode->Flags & V_BCAST) add(&flags, "bcast");
|
||||
if (mode->Flags & V_PHSYNC) add(&flags, "+hsync");
|
||||
if (mode->Flags & V_NHSYNC) add(&flags, "-hsync");
|
||||
if (mode->Flags & V_PVSYNC) add(&flags, "+vsync");
|
||||
if (mode->Flags & V_NVSYNC) add(&flags, "-vsync");
|
||||
if (mode->Flags & V_PCSYNC) add(&flags, "+csync");
|
||||
if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
|
||||
#if 0
|
||||
if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
|
||||
#endif
|
||||
xf86DrvMsg(scrnIndex, X_INFO,
|
||||
"Modeline \"%s\"x%.01f %6.2f %i %i %i %i %i %i %i %i%s "
|
||||
"(%.01f kHz)\n",
|
||||
mode->name, mode->VRefresh, mode->Clock/1000., mode->HDisplay,
|
||||
mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
|
||||
mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
|
||||
mode->VTotal, flags, xf86ModeHSync(mode));
|
||||
xfree(flags);
|
||||
}
|
||||
#endif /* XORG_VERSION_CURRENT <= 7.2.99.2 */
|
||||
|
||||
/**
|
||||
* Marks as bad any modes with unsupported flags.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
* \param flags flags supported by the driver.
|
||||
*
|
||||
* \bug only V_INTERLACE and V_DBLSCAN are supported. Is that enough?
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int flags)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
if (mode->Flags & V_INTERLACE && !(flags & V_INTERLACE))
|
||||
mode->status = MODE_NO_INTERLACE;
|
||||
if (mode->Flags & V_DBLSCAN && !(flags & V_DBLSCAN))
|
||||
mode->status = MODE_NO_DBLESCAN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks as bad any modes extending beyond the given max X, Y, or pitch.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int maxX, int maxY, int maxPitch)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
if (maxPitch > 0 && mode->HDisplay > maxPitch)
|
||||
mode->status = MODE_BAD_WIDTH;
|
||||
|
||||
if (maxX > 0 && mode->HDisplay > maxX)
|
||||
mode->status = MODE_VIRTUAL_X;
|
||||
|
||||
if (maxY > 0 && mode->VDisplay > maxY)
|
||||
mode->status = MODE_VIRTUAL_Y;
|
||||
|
||||
if (mode->next == modeList)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks as bad any modes that aren't supported by the given monitor's
|
||||
* hsync and vrefresh ranges.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
MonPtr mon)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
Bool bad;
|
||||
int i;
|
||||
|
||||
bad = TRUE;
|
||||
for (i = 0; i < mon->nHsync; i++) {
|
||||
if (xf86ModeHSync(mode) >= mon->hsync[i].lo * (1-SYNC_TOLERANCE) &&
|
||||
xf86ModeHSync(mode) <= mon->hsync[i].hi * (1+SYNC_TOLERANCE))
|
||||
{
|
||||
bad = FALSE;
|
||||
}
|
||||
}
|
||||
if (bad)
|
||||
mode->status = MODE_HSYNC;
|
||||
|
||||
bad = TRUE;
|
||||
for (i = 0; i < mon->nVrefresh; i++) {
|
||||
if (xf86ModeVRefresh(mode) >= mon->vrefresh[i].lo * (1-SYNC_TOLERANCE) &&
|
||||
xf86ModeVRefresh(mode) <= mon->vrefresh[i].hi * (1+SYNC_TOLERANCE))
|
||||
{
|
||||
bad = FALSE;
|
||||
}
|
||||
}
|
||||
if (bad)
|
||||
mode->status = MODE_VSYNC;
|
||||
|
||||
if (mode->next == modeList)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks as bad any modes extending beyond outside of the given clock ranges.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
* \param min pointer to minimums of clock ranges
|
||||
* \param max pointer to maximums of clock ranges
|
||||
* \param n_ranges number of ranges.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int *min, int *max, int n_ranges)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
int i;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
Bool good = FALSE;
|
||||
for (i = 0; i < n_ranges; i++) {
|
||||
if (mode->Clock >= min[i] * (1-SYNC_TOLERANCE) &&
|
||||
mode->Clock <= max[i] * (1+SYNC_TOLERANCE)) {
|
||||
good = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!good)
|
||||
mode->status = MODE_CLOCK_RANGE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the user has specified a set of mode names to use, mark as bad any modes
|
||||
* not listed.
|
||||
*
|
||||
* The user mode names specified are prefixes to names of modes, so "1024x768"
|
||||
* will match modes named "1024x768", "1024x768x75", "1024x768-good", but
|
||||
* "1024x768x75" would only match "1024x768x75" from that list.
|
||||
*
|
||||
* MODE_BAD is used as the rejection flag, for lack of a better flag.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
if (pScrn->display->modes[0] == NULL)
|
||||
return;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
int i;
|
||||
Bool good = FALSE;
|
||||
|
||||
for (i = 0; pScrn->display->modes[i] != NULL; i++) {
|
||||
if (strncmp(pScrn->display->modes[i], mode->name,
|
||||
strlen(pScrn->display->modes[i])) == 0) {
|
||||
good = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!good)
|
||||
mode->status = MODE_BAD;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Marks as bad any modes exceeding the given bandwidth.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
* \param bandwidth bandwidth in MHz.
|
||||
* \param depth color depth.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesBandwidth(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
unsigned int bandwidth, int depth)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
if (xf86ModeBandwidth(mode, depth) > bandwidth)
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
mode->status = MODE_BANDWIDTH;
|
||||
#else
|
||||
/* MODE_BANDWIDTH didn't exist in xserver 1.2 */
|
||||
mode->status = MODE_BAD;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks as bad any reduced-blanking modes.
|
||||
*
|
||||
* \param modeList doubly-linked list of modes.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86ValidateModesReducedBlanking(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||||
{
|
||||
Bool mode_is_reduced = FALSE;
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = modeList; mode != NULL; mode = mode->next) {
|
||||
/* gratuitous duplication from pre-randr validation code */
|
||||
if ((((mode->HDisplay * 5 / 4) & ~0x07) > mode->HTotal) &&
|
||||
((mode->HTotal - mode->HDisplay) == 160) &&
|
||||
((mode->HSyncEnd - mode->HDisplay) == 80) &&
|
||||
((mode->HSyncEnd - mode->HSyncStart) == 32) &&
|
||||
((mode->VSyncStart - mode->VDisplay) == 3))
|
||||
mode->status = MODE_NO_REDUCED;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees any modes from the list with a status other than MODE_OK.
|
||||
*
|
||||
* \param modeList pointer to a doubly-linked or circular list of modes.
|
||||
* \param verbose determines whether the reason for mode invalidation is
|
||||
* printed.
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList,
|
||||
Bool verbose)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
|
||||
for (mode = *modeList; mode != NULL;) {
|
||||
DisplayModePtr next = mode->next, first = *modeList;
|
||||
|
||||
if (mode->status != MODE_OK) {
|
||||
if (verbose) {
|
||||
char *type = "";
|
||||
if (mode->type & M_T_BUILTIN)
|
||||
type = "built-in ";
|
||||
else if (mode->type & M_T_DEFAULT)
|
||||
type = "default ";
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
|
||||
"Not using %smode \"%s\" (%s)\n", type, mode->name,
|
||||
xf86ModeStatusToString(mode->status));
|
||||
}
|
||||
xf86DeleteMode(modeList, mode);
|
||||
}
|
||||
|
||||
if (next == first)
|
||||
break;
|
||||
mode = next;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the new mode into the mode list, and returns the new list
|
||||
*
|
||||
* \param modes doubly-linked mode list.
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new)
|
||||
{
|
||||
if (modes == NULL)
|
||||
return new;
|
||||
|
||||
if (new) {
|
||||
DisplayModePtr mode = modes;
|
||||
|
||||
while (mode->next)
|
||||
mode = mode->next;
|
||||
|
||||
mode->next = new;
|
||||
new->prev = mode;
|
||||
}
|
||||
|
||||
return modes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a mode list from a list of config file modes
|
||||
*/
|
||||
static DisplayModePtr
|
||||
xf86GetConfigModes (XF86ConfModeLinePtr conf_mode)
|
||||
{
|
||||
DisplayModePtr head = NULL, prev = NULL, mode;
|
||||
|
||||
for (; conf_mode; conf_mode = (XF86ConfModeLinePtr) conf_mode->list.next)
|
||||
{
|
||||
mode = xcalloc(1, sizeof(DisplayModeRec));
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->name = xstrdup(conf_mode->ml_identifier);
|
||||
if (!mode->name)
|
||||
{
|
||||
xfree (mode);
|
||||
continue;
|
||||
}
|
||||
mode->type = 0;
|
||||
mode->Clock = conf_mode->ml_clock;
|
||||
mode->HDisplay = conf_mode->ml_hdisplay;
|
||||
mode->HSyncStart = conf_mode->ml_hsyncstart;
|
||||
mode->HSyncEnd = conf_mode->ml_hsyncend;
|
||||
mode->HTotal = conf_mode->ml_htotal;
|
||||
mode->VDisplay = conf_mode->ml_vdisplay;
|
||||
mode->VSyncStart = conf_mode->ml_vsyncstart;
|
||||
mode->VSyncEnd = conf_mode->ml_vsyncend;
|
||||
mode->VTotal = conf_mode->ml_vtotal;
|
||||
mode->Flags = conf_mode->ml_flags;
|
||||
mode->HSkew = conf_mode->ml_hskew;
|
||||
mode->VScan = conf_mode->ml_vscan;
|
||||
|
||||
mode->prev = prev;
|
||||
mode->next = NULL;
|
||||
if (prev)
|
||||
prev->next = mode;
|
||||
else
|
||||
head = mode;
|
||||
prev = mode;
|
||||
}
|
||||
return head;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a mode list from a monitor configuration
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor)
|
||||
{
|
||||
DisplayModePtr modes = NULL;
|
||||
XF86ConfModesLinkPtr modes_link;
|
||||
|
||||
if (!conf_monitor)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* first we collect the mode lines from the UseModes directive
|
||||
*/
|
||||
for (modes_link = conf_monitor->mon_modes_sect_lst;
|
||||
modes_link;
|
||||
modes_link = modes_link->list.next)
|
||||
{
|
||||
/* If this modes link hasn't been resolved, go look it up now */
|
||||
if (!modes_link->ml_modes)
|
||||
modes_link->ml_modes = xf86findModes (modes_link->ml_modes_str,
|
||||
xf86configptr->conf_modes_lst);
|
||||
if (modes_link->ml_modes)
|
||||
modes = xf86ModesAdd (modes,
|
||||
xf86GetConfigModes (modes_link->ml_modes->mon_modeline_lst));
|
||||
}
|
||||
|
||||
return xf86ModesAdd (modes,
|
||||
xf86GetConfigModes (conf_monitor->mon_modeline_lst));
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a mode list containing all of the default modes
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed)
|
||||
{
|
||||
DisplayModePtr head = NULL, prev = NULL, mode;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < xf86NumDefaultModes; i++)
|
||||
{
|
||||
DisplayModePtr defMode = &xf86DefaultModes[i];
|
||||
|
||||
if (!interlaceAllowed && (defMode->Flags & V_INTERLACE))
|
||||
continue;
|
||||
if (!doubleScanAllowed && (defMode->Flags & V_DBLSCAN))
|
||||
continue;
|
||||
|
||||
mode = xf86DuplicateMode(defMode);
|
||||
|
||||
head = xf86ModesAdd(head, mode);
|
||||
}
|
||||
return head;
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Eric Anholt <eric@anholt.net>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _XF86MODES_H_
|
||||
#define _XF86MODES_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xorgVersion.h"
|
||||
#include "edid.h"
|
||||
#include "xf86Parser.h"
|
||||
#if XF86_MODES_RENAME
|
||||
#include "xf86Rename.h"
|
||||
#endif
|
||||
|
||||
double xf86ModeHSync(DisplayModePtr mode);
|
||||
double xf86ModeVRefresh(DisplayModePtr mode);
|
||||
unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth);
|
||||
|
||||
int
|
||||
xf86ModeWidth (DisplayModePtr mode, Rotation rotation);
|
||||
|
||||
int
|
||||
xf86ModeHeight (DisplayModePtr mode, Rotation rotation);
|
||||
|
||||
DisplayModePtr xf86DuplicateMode(DisplayModePtr pMode);
|
||||
DisplayModePtr xf86DuplicateModes(ScrnInfoPtr pScrn,
|
||||
DisplayModePtr modeList);
|
||||
void xf86SetModeDefaultName(DisplayModePtr mode);
|
||||
void xf86SetModeCrtc(DisplayModePtr p, int adjustFlags);
|
||||
Bool xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2);
|
||||
void xf86PrintModeline(int scrnIndex,DisplayModePtr mode);
|
||||
DisplayModePtr xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new);
|
||||
|
||||
DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC);
|
||||
DisplayModePtr xf86CVTMode(int HDisplay, int VDisplay, float VRefresh,
|
||||
Bool Reduced, Bool Interlaced);
|
||||
DisplayModePtr xf86GTFMode(int h_pixels, int v_lines, float freq, int interlaced, int margins);
|
||||
|
||||
void
|
||||
xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int flags);
|
||||
|
||||
void
|
||||
xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int *min, int *max, int n_ranges);
|
||||
|
||||
void
|
||||
xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int maxX, int maxY, int maxPitch);
|
||||
|
||||
void
|
||||
xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
MonPtr mon);
|
||||
|
||||
void
|
||||
xf86ValidateModesBandwidth(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
unsigned int bandwidth, int depth);
|
||||
|
||||
void
|
||||
xf86ValidateModesReducedBlanking(ScrnInfoPtr pScrn, DisplayModePtr modeList);
|
||||
|
||||
void
|
||||
xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList,
|
||||
Bool verbose);
|
||||
|
||||
void
|
||||
xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||||
int flags);
|
||||
|
||||
void
|
||||
xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList);
|
||||
|
||||
DisplayModePtr
|
||||
xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor);
|
||||
|
||||
DisplayModePtr
|
||||
xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed);
|
||||
|
||||
void
|
||||
xf86DDCApplyQuirks(int scrnIndex, xf86MonPtr DDC);
|
||||
|
||||
#endif /* _XF86MODES_H_ */
|
File diff suppressed because it is too large
Load Diff
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _XF86_RANDR_H_
|
||||
#define _XF86_RANDR_H_
|
||||
#include <randrstr.h>
|
||||
#include <X11/extensions/render.h>
|
||||
#if XF86_MODES_RENAME
|
||||
#include "xf86Rename.h"
|
||||
#endif
|
||||
|
||||
Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen);
|
||||
Bool xf86RandR12Init(ScreenPtr pScreen);
|
||||
void xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotation);
|
||||
Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate,
|
||||
RRScreenSizePtr pSize);
|
||||
Rotation xf86RandR12GetRotation(ScreenPtr pScreen);
|
||||
void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y);
|
||||
Bool xf86RandR12PreInit (ScrnInfoPtr pScrn);
|
||||
void xf86RandR12TellChanged (ScreenPtr pScreen);
|
||||
|
||||
#endif /* _XF86_RANDR_H_ */
|
@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _XF86RENAME_H_
|
||||
#define _XF86RENAME_H_
|
||||
|
||||
#include "local_xf86Rename.h"
|
||||
|
||||
#define xf86_cursors_fini XF86NAME(xf86_cursors_fini)
|
||||
#define xf86_cursors_init XF86NAME(xf86_cursors_init)
|
||||
#define xf86_hide_cursors XF86NAME(xf86_hide_cursors)
|
||||
#define xf86_reload_cursors XF86NAME(xf86_reload_cursors)
|
||||
#define xf86_show_cursors XF86NAME(xf86_show_cursors)
|
||||
#define xf86ConnectorGetName XF86NAME(xf86ConnectorGetName)
|
||||
#define xf86CrtcConfigInit XF86NAME(xf86CrtcConfigInit)
|
||||
#define xf86CrtcConfigPrivateIndex XF86NAME(xf86CrtcConfigPrivateIndex)
|
||||
#define xf86CrtcCreate XF86NAME(xf86CrtcCreate)
|
||||
#define xf86CrtcDestroy XF86NAME(xf86CrtcDestroy)
|
||||
#define xf86CrtcInUse XF86NAME(xf86CrtcInUse)
|
||||
#define xf86CrtcRotate XF86NAME(xf86CrtcRotate)
|
||||
#define xf86CrtcScreenInit XF86NAME(xf86CrtcScreenInit)
|
||||
#define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode)
|
||||
#define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange)
|
||||
#define xf86CVTMode XF86NAME(xf86CVTMode)
|
||||
#define xf86DDCMonitorSet XF86NAME(xf86DDCMonitorSet)
|
||||
#define xf86DisableUnusedFunctions XF86NAME(xf86DisableUnusedFunctions)
|
||||
#define xf86DPMSSet XF86NAME(xf86DPMSSet)
|
||||
#define xf86DuplicateMode XF86NAME(xf86DuplicateMode)
|
||||
#define xf86DuplicateModes XF86NAME(xf86DuplicateModes)
|
||||
#define xf86GetDefaultModes XF86NAME(xf86GetDefaultModes)
|
||||
#define xf86GetMonitorModes XF86NAME(xf86GetMonitorModes)
|
||||
#define xf86InitialConfiguration XF86NAME(xf86InitialConfiguration)
|
||||
#define xf86ModeHSync XF86NAME(xf86ModeHSync)
|
||||
#define xf86ModesAdd XF86NAME(xf86ModesAdd)
|
||||
#define xf86ModesEqual XF86NAME(xf86ModesEqual)
|
||||
#define xf86ModeVRefresh XF86NAME(xf86ModeVRefresh)
|
||||
#define xf86OutputCreate XF86NAME(xf86OutputCreate)
|
||||
#define xf86OutputDestroy XF86NAME(xf86OutputDestroy)
|
||||
#define xf86OutputGetEDID XF86NAME(xf86OutputGetEDID)
|
||||
#define xf86OutputGetEDIDModes XF86NAME(xf86OutputGetEDIDModes)
|
||||
#define xf86OutputRename XF86NAME(xf86OutputRename)
|
||||
#define xf86OutputSetEDID XF86NAME(xf86OutputSetEDID)
|
||||
#define xf86OutputUseScreenMonitor XF86NAME(xf86OutputUseScreenMonitor)
|
||||
#define xf86PrintModeline XF86NAME(xf86PrintModeline)
|
||||
#define xf86ProbeOutputModes XF86NAME(xf86ProbeOutputModes)
|
||||
#define xf86PruneInvalidModes XF86NAME(xf86PruneInvalidModes)
|
||||
#define xf86RotateCloseScreen XF86NAME(xf86RotateCloseScreen)
|
||||
#define xf86SetModeCrtc XF86NAME(xf86SetModeCrtc)
|
||||
#define xf86SetModeDefaultName XF86NAME(xf86SetModeDefaultName)
|
||||
#define xf86SetScrnInfoModes XF86NAME(xf86SetScrnInfoModes)
|
||||
#define xf86ValidateModesClocks XF86NAME(xf86ValidateModesClocks)
|
||||
#define xf86ValidateModesFlags XF86NAME(xf86ValidateModesFlags)
|
||||
#define xf86ValidateModesSize XF86NAME(xf86ValidateModesSize)
|
||||
#define xf86ValidateModesSync XF86NAME(xf86ValidateModesSync)
|
||||
#define xf86ValidateModesUserConfig XF86NAME(xf86ValidateModesUserConfig)
|
||||
#define xf86DiDGAInit XF86NAME(xf86DiDGAInit)
|
||||
#define xf86DiDGAReInit XF86NAME(xf86DiDGAReInit)
|
||||
#define xf86DDCGetModes XF86NAME(xf86DDCGetModes)
|
||||
#define xf86RandR12CreateScreenResources XF86NAME(xf86RandR12CreateScreenResources)
|
||||
#define xf86RandR12GetOriginalVirtualSize XF86NAME(xf86RandR12GetOriginalVirtualSize)
|
||||
#define xf86RandR12GetRotation XF86NAME(xf86RandR12GetRotation)
|
||||
#define xf86RandR12Init XF86NAME(xf86RandR12Init)
|
||||
#define xf86RandR12PreInit XF86NAME(xf86RandR12PreInit)
|
||||
#define xf86RandR12SetConfig XF86NAME(xf86RandR12SetConfig)
|
||||
#define xf86RandR12SetRotations XF86NAME(xf86RandR12SetRotations)
|
||||
#define xf86SaveScreen XF86NAME(xf86SaveScreen)
|
||||
#define xf86CrtcSetScreenSubpixelOrder XF86NAME(xf86CrtcSetScreenSubpixelOrder)
|
||||
#define xf86ModeWidth XF86NAME(xf86ModeWidth)
|
||||
#define xf86ModeHeight XF86NAME(xf86ModeHeight)
|
||||
#define xf86OutputFindClosestMode XF86NAME(xf86OutputFindClosestMode)
|
||||
#define xf86SetSingleMode XF86NAME(xf86SetSingleMode)
|
||||
#define xf86SetDesiredModes XF86NAME(xf86SetDesiredModes)
|
||||
|
||||
#endif /* _XF86RENAME_H_ */
|
@ -1,682 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2006 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting documentation, and
|
||||
* that the name of the copyright holders not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. The copyright holders make no representations
|
||||
* about the suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86DDC.h"
|
||||
#include "fb.h"
|
||||
#include "windowstr.h"
|
||||
#include "xf86Crtc.h"
|
||||
#include "xf86Modes.h"
|
||||
#include "xf86RandR12.h"
|
||||
#include "X11/extensions/render.h"
|
||||
#define DPMS_SERVER
|
||||
#include "X11/extensions/dpms.h"
|
||||
#include "X11/Xatom.h"
|
||||
|
||||
/* borrowed from composite extension, move to Render and publish? */
|
||||
|
||||
static VisualPtr
|
||||
compGetWindowVisual (WindowPtr pWin)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
VisualID vid = wVisual (pWin);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pScreen->numVisuals; i++)
|
||||
if (pScreen->visuals[i].vid == vid)
|
||||
return &pScreen->visuals[i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PictFormatPtr
|
||||
compWindowFormat (WindowPtr pWin)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
|
||||
return PictureMatchVisual (pScreen, pWin->drawable.depth,
|
||||
compGetWindowVisual (pWin));
|
||||
}
|
||||
|
||||
#define F(x) IntToxFixed(x)
|
||||
|
||||
static void
|
||||
PictureTransformIdentity (PictTransformPtr matrix)
|
||||
{
|
||||
int i;
|
||||
memset (matrix, '\0', sizeof (PictTransform));
|
||||
for (i = 0; i < 3; i++)
|
||||
matrix->matrix[i][i] = F(1);
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformMultiply (PictTransformPtr dst, PictTransformPtr l, PictTransformPtr r)
|
||||
{
|
||||
PictTransform d;
|
||||
int dx, dy;
|
||||
int o;
|
||||
|
||||
for (dy = 0; dy < 3; dy++)
|
||||
for (dx = 0; dx < 3; dx++)
|
||||
{
|
||||
xFixed_48_16 v;
|
||||
xFixed_32_32 partial;
|
||||
v = 0;
|
||||
for (o = 0; o < 3; o++)
|
||||
{
|
||||
partial = (xFixed_32_32) l->matrix[dy][o] * (xFixed_32_32) r->matrix[o][dx];
|
||||
v += partial >> 16;
|
||||
}
|
||||
if (v > MAX_FIXED_48_16 || v < MIN_FIXED_48_16)
|
||||
return FALSE;
|
||||
d.matrix[dy][dx] = (xFixed) v;
|
||||
}
|
||||
*dst = d;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
PictureTransformInitScale (PictTransformPtr t, xFixed sx, xFixed sy)
|
||||
{
|
||||
memset (t, '\0', sizeof (PictTransform));
|
||||
t->matrix[0][0] = sx;
|
||||
t->matrix[1][1] = sy;
|
||||
t->matrix[2][2] = F (1);
|
||||
}
|
||||
|
||||
static xFixed
|
||||
fixed_inverse (xFixed x)
|
||||
{
|
||||
return (xFixed) ((((xFixed_48_16) F(1)) * F(1)) / x);
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformScale (PictTransformPtr forward,
|
||||
PictTransformPtr reverse,
|
||||
xFixed sx, xFixed sy)
|
||||
{
|
||||
PictTransform t;
|
||||
|
||||
PictureTransformInitScale (&t, sx, sy);
|
||||
if (!PictureTransformMultiply (forward, &t, forward))
|
||||
return FALSE;
|
||||
PictureTransformInitScale (&t, fixed_inverse (sx), fixed_inverse (sy));
|
||||
if (!PictureTransformMultiply (reverse, reverse, &t))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
PictureTransformInitRotate (PictTransformPtr t, xFixed c, xFixed s)
|
||||
{
|
||||
memset (t, '\0', sizeof (PictTransform));
|
||||
t->matrix[0][0] = c;
|
||||
t->matrix[0][1] = -s;
|
||||
t->matrix[1][0] = s;
|
||||
t->matrix[1][1] = c;
|
||||
t->matrix[2][2] = F (1);
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformRotate (PictTransformPtr forward,
|
||||
PictTransformPtr reverse,
|
||||
xFixed c, xFixed s)
|
||||
{
|
||||
PictTransform t;
|
||||
PictureTransformInitRotate (&t, c, s);
|
||||
if (!PictureTransformMultiply (forward, &t, forward))
|
||||
return FALSE;
|
||||
|
||||
PictureTransformInitRotate (&t, c, -s);
|
||||
if (!PictureTransformMultiply (reverse, reverse, &t))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
PictureTransformInitTranslate (PictTransformPtr t, xFixed tx, xFixed ty)
|
||||
{
|
||||
memset (t, '\0', sizeof (PictTransform));
|
||||
t->matrix[0][0] = F (1);
|
||||
t->matrix[0][2] = tx;
|
||||
t->matrix[1][1] = F (1);
|
||||
t->matrix[1][2] = ty;
|
||||
t->matrix[2][2] = F (1);
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformTranslate (PictTransformPtr forward,
|
||||
PictTransformPtr reverse,
|
||||
xFixed tx, xFixed ty)
|
||||
{
|
||||
PictTransform t;
|
||||
PictureTransformInitTranslate (&t, tx, ty);
|
||||
if (!PictureTransformMultiply (forward, &t, forward))
|
||||
return FALSE;
|
||||
|
||||
PictureTransformInitTranslate (&t, -tx, -ty);
|
||||
if (!PictureTransformMultiply (reverse, reverse, &t))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
PictureTransformBounds (BoxPtr b, PictTransformPtr matrix)
|
||||
{
|
||||
PictVector v[4];
|
||||
int i;
|
||||
int x1, y1, x2, y2;
|
||||
|
||||
v[0].vector[0] = F (b->x1); v[0].vector[1] = F (b->y1); v[0].vector[2] = F(1);
|
||||
v[1].vector[0] = F (b->x2); v[1].vector[1] = F (b->y1); v[1].vector[2] = F(1);
|
||||
v[2].vector[0] = F (b->x2); v[2].vector[1] = F (b->y2); v[2].vector[2] = F(1);
|
||||
v[3].vector[0] = F (b->x1); v[3].vector[1] = F (b->y2); v[3].vector[2] = F(1);
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
PictureTransformPoint (matrix, &v[i]);
|
||||
x1 = xFixedToInt (v[i].vector[0]);
|
||||
y1 = xFixedToInt (v[i].vector[1]);
|
||||
x2 = xFixedToInt (xFixedCeil (v[i].vector[0]));
|
||||
y2 = xFixedToInt (xFixedCeil (v[i].vector[1]));
|
||||
if (i == 0)
|
||||
{
|
||||
b->x1 = x1; b->y1 = y1;
|
||||
b->x2 = x2; b->y2 = y2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (x1 < b->x1) b->x1 = x1;
|
||||
if (y1 < b->y1) b->y1 = y1;
|
||||
if (x2 > b->x2) b->x2 = x2;
|
||||
if (y2 > b->y2) b->y2 = y2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformIsIdentity(PictTransform *t)
|
||||
{
|
||||
return ((t->matrix[0][0] == t->matrix[1][1]) &&
|
||||
(t->matrix[0][0] == t->matrix[2][2]) &&
|
||||
(t->matrix[0][0] != 0) &&
|
||||
(t->matrix[0][1] == 0) &&
|
||||
(t->matrix[0][2] == 0) &&
|
||||
(t->matrix[1][0] == 0) &&
|
||||
(t->matrix[1][2] == 0) &&
|
||||
(t->matrix[2][0] == 0) &&
|
||||
(t->matrix[2][1] == 0));
|
||||
}
|
||||
|
||||
#define toF(x) ((float) (x) / 65536.0f)
|
||||
|
||||
static void
|
||||
PictureTransformErrorF (PictTransform *t)
|
||||
{
|
||||
ErrorF ("{ { %f %f %f } { %f %f %f } { %f %f %f } }",
|
||||
toF(t->matrix[0][0]), toF(t->matrix[0][1]), toF(t->matrix[0][2]),
|
||||
toF(t->matrix[1][0]), toF(t->matrix[1][1]), toF(t->matrix[1][2]),
|
||||
toF(t->matrix[2][0]), toF(t->matrix[2][1]), toF(t->matrix[2][2]));
|
||||
}
|
||||
|
||||
static Bool
|
||||
PictureTransformIsInverse (char *where, PictTransform *a, PictTransform *b)
|
||||
{
|
||||
PictTransform t;
|
||||
|
||||
PictureTransformMultiply (&t, a, b);
|
||||
if (!PictureTransformIsIdentity (&t))
|
||||
{
|
||||
ErrorF ("%s: ", where);
|
||||
PictureTransformErrorF (a);
|
||||
ErrorF (" * ");
|
||||
PictureTransformErrorF (b);
|
||||
ErrorF (" = ");
|
||||
PictureTransformErrorF (a);
|
||||
ErrorF ("\n");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
ScreenPtr screen = scrn->pScreen;
|
||||
WindowPtr root = WindowTable[screen->myNum];
|
||||
PixmapPtr dst_pixmap = crtc->rotatedPixmap;
|
||||
PictFormatPtr format = compWindowFormat (WindowTable[screen->myNum]);
|
||||
int error;
|
||||
PicturePtr src, dst;
|
||||
int n = REGION_NUM_RECTS(region);
|
||||
BoxPtr b = REGION_RECTS(region);
|
||||
XID include_inferiors = IncludeInferiors;
|
||||
|
||||
src = CreatePicture (None,
|
||||
&root->drawable,
|
||||
format,
|
||||
CPSubwindowMode,
|
||||
&include_inferiors,
|
||||
serverClient,
|
||||
&error);
|
||||
if (!src)
|
||||
return;
|
||||
|
||||
dst = CreatePicture (None,
|
||||
&dst_pixmap->drawable,
|
||||
format,
|
||||
0L,
|
||||
NULL,
|
||||
serverClient,
|
||||
&error);
|
||||
if (!dst)
|
||||
return;
|
||||
|
||||
error = SetPictureTransform (src, &crtc->crtc_to_framebuffer);
|
||||
if (error)
|
||||
return;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
BoxRec dst_box;
|
||||
|
||||
dst_box = *b;
|
||||
PictureTransformBounds (&dst_box, &crtc->framebuffer_to_crtc);
|
||||
CompositePicture (PictOpSrc,
|
||||
src, NULL, dst,
|
||||
dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
|
||||
dst_box.x2 - dst_box.x1,
|
||||
dst_box.y2 - dst_box.y1);
|
||||
b++;
|
||||
}
|
||||
FreePicture (src, None);
|
||||
FreePicture (dst, None);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86CrtcDamageShadow (xf86CrtcPtr crtc)
|
||||
{
|
||||
ScrnInfoPtr pScrn = crtc->scrn;
|
||||
BoxRec damage_box;
|
||||
RegionRec damage_region;
|
||||
ScreenPtr pScreen = pScrn->pScreen;
|
||||
|
||||
damage_box.x1 = crtc->x;
|
||||
damage_box.x2 = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
|
||||
damage_box.y1 = crtc->y;
|
||||
damage_box.y2 = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
|
||||
REGION_INIT (pScreen, &damage_region, &damage_box, 1);
|
||||
DamageDamageRegion (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
&damage_region);
|
||||
REGION_UNINIT (pScreen, &damage_region);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RotatePrepare (ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->rotatedData && !crtc->rotatedPixmap)
|
||||
{
|
||||
crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
|
||||
crtc->rotatedData,
|
||||
crtc->mode.HDisplay,
|
||||
crtc->mode.VDisplay);
|
||||
if (!xf86_config->rotation_damage_registered)
|
||||
{
|
||||
/* Hook damage to screen pixmap */
|
||||
DamageRegister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage_registered = TRUE;
|
||||
}
|
||||
|
||||
xf86CrtcDamageShadow (crtc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86RotateRedisplay(ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
DamagePtr damage = xf86_config->rotation_damage;
|
||||
RegionPtr region;
|
||||
|
||||
if (!damage)
|
||||
return FALSE;
|
||||
xf86RotatePrepare (pScreen);
|
||||
region = DamageRegion(damage);
|
||||
if (REGION_NOTEMPTY(pScreen, region))
|
||||
{
|
||||
int c;
|
||||
SourceValidateProcPtr SourceValidate;
|
||||
|
||||
/*
|
||||
* SourceValidate is used by the software cursor code
|
||||
* to pull the cursor off of the screen when reading
|
||||
* bits from the frame buffer. Bypassing this function
|
||||
* leaves the software cursor in place
|
||||
*/
|
||||
SourceValidate = pScreen->SourceValidate;
|
||||
pScreen->SourceValidate = NULL;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
{
|
||||
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||
|
||||
if (crtc->rotation != RR_Rotate_0 && crtc->enabled)
|
||||
{
|
||||
RegionRec crtc_damage;
|
||||
|
||||
/* compute portion of damage that overlaps crtc */
|
||||
REGION_INIT(pScreen, &crtc_damage, &crtc->bounds, 1);
|
||||
REGION_INTERSECT (pScreen, &crtc_damage, &crtc_damage, region);
|
||||
|
||||
/* update damaged region */
|
||||
if (REGION_NOTEMPTY(pScreen, &crtc_damage))
|
||||
xf86RotateCrtcRedisplay (crtc, &crtc_damage);
|
||||
|
||||
REGION_UNINIT (pScreen, &crtc_damage);
|
||||
}
|
||||
}
|
||||
pScreen->SourceValidate = SourceValidate;
|
||||
DamageEmpty(damage);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RotateBlockHandler(int screenNum, pointer blockData,
|
||||
pointer pTimeout, pointer pReadmask)
|
||||
{
|
||||
ScreenPtr pScreen = screenInfo.screens[screenNum];
|
||||
ScrnInfoPtr pScrn = xf86Screens[screenNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
|
||||
pScreen->BlockHandler = xf86_config->BlockHandler;
|
||||
(*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
|
||||
if (xf86RotateRedisplay(pScreen))
|
||||
{
|
||||
/* Re-wrap if rotation is still happening */
|
||||
xf86_config->BlockHandler = pScreen->BlockHandler;
|
||||
pScreen->BlockHandler = xf86RotateBlockHandler;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RotateDestroy (xf86CrtcPtr crtc)
|
||||
{
|
||||
ScrnInfoPtr pScrn = crtc->scrn;
|
||||
ScreenPtr pScreen = pScrn->pScreen;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
int c;
|
||||
|
||||
/* Free memory from rotation */
|
||||
if (crtc->rotatedPixmap || crtc->rotatedData)
|
||||
{
|
||||
crtc->funcs->shadow_destroy (crtc, crtc->rotatedPixmap, crtc->rotatedData);
|
||||
crtc->rotatedPixmap = NULL;
|
||||
crtc->rotatedData = NULL;
|
||||
}
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
if (xf86_config->crtc[c]->transform_in_use)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Clean up damage structures when no crtcs are rotated
|
||||
*/
|
||||
if (xf86_config->rotation_damage)
|
||||
{
|
||||
/* Free damage structure */
|
||||
if (xf86_config->rotation_damage_registered)
|
||||
{
|
||||
DamageUnregister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage_registered = FALSE;
|
||||
}
|
||||
DamageDestroy (xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86RotateFreeShadow(ScrnInfoPtr pScrn)
|
||||
{
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < config->num_crtc; c++) {
|
||||
xf86CrtcPtr crtc = config->crtc[c];
|
||||
|
||||
if (crtc->rotatedPixmap || crtc->rotatedData) {
|
||||
crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
|
||||
crtc->rotatedData);
|
||||
crtc->rotatedPixmap = NULL;
|
||||
crtc->rotatedData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86RotateCloseScreen (ScreenPtr screen)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
xf86RotateDestroy (xf86_config->crtc[c]);
|
||||
}
|
||||
|
||||
_X_EXPORT Bool
|
||||
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
|
||||
{
|
||||
ScrnInfoPtr pScrn = crtc->scrn;
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
/* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
|
||||
ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
|
||||
PictTransform crtc_to_fb, fb_to_crtc;
|
||||
|
||||
PictureTransformIdentity (&crtc_to_fb);
|
||||
PictureTransformIdentity (&fb_to_crtc);
|
||||
PictureTransformIsInverse ("identity", &crtc_to_fb, &fb_to_crtc);
|
||||
if (rotation != RR_Rotate_0)
|
||||
{
|
||||
xFixed rot_cos, rot_sin, rot_dx, rot_dy;
|
||||
xFixed scale_x, scale_y, scale_dx, scale_dy;
|
||||
int mode_w = crtc->mode.HDisplay;
|
||||
int mode_h = crtc->mode.VDisplay;
|
||||
|
||||
/* rotation */
|
||||
switch (rotation & 0xf) {
|
||||
default:
|
||||
case RR_Rotate_0:
|
||||
rot_cos = F ( 1); rot_sin = F ( 0);
|
||||
rot_dx = F ( 0); rot_dy = F ( 0);
|
||||
break;
|
||||
case RR_Rotate_90:
|
||||
rot_cos = F ( 0); rot_sin = F ( 1);
|
||||
rot_dx = F ( mode_h); rot_dy = F (0);
|
||||
break;
|
||||
case RR_Rotate_180:
|
||||
rot_cos = F (-1); rot_sin = F ( 0);
|
||||
rot_dx = F (mode_w); rot_dy = F ( mode_h);
|
||||
break;
|
||||
case RR_Rotate_270:
|
||||
rot_cos = F ( 0); rot_sin = F (-1);
|
||||
rot_dx = F ( 0); rot_dy = F ( mode_w);
|
||||
break;
|
||||
}
|
||||
|
||||
PictureTransformRotate (&crtc_to_fb, &fb_to_crtc, rot_cos, rot_sin);
|
||||
PictureTransformIsInverse ("rotate", &crtc_to_fb, &fb_to_crtc);
|
||||
|
||||
PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, rot_dx, rot_dy);
|
||||
PictureTransformIsInverse ("rotate translate", &crtc_to_fb, &fb_to_crtc);
|
||||
|
||||
/* reflection */
|
||||
scale_x = F (1);
|
||||
scale_dx = 0;
|
||||
scale_y = F (1);
|
||||
scale_dy = 0;
|
||||
if (rotation & RR_Reflect_X)
|
||||
{
|
||||
scale_x = F(-1);
|
||||
if (rotation & (RR_Rotate_0|RR_Rotate_180))
|
||||
scale_dx = F(mode_w);
|
||||
else
|
||||
scale_dx = F(mode_h);
|
||||
}
|
||||
if (rotation & RR_Reflect_Y)
|
||||
{
|
||||
scale_y = F(-1);
|
||||
if (rotation & (RR_Rotate_0|RR_Rotate_180))
|
||||
scale_dy = F(mode_h);
|
||||
else
|
||||
scale_dy = F(mode_w);
|
||||
}
|
||||
|
||||
PictureTransformScale (&crtc_to_fb, &fb_to_crtc, scale_x, scale_y);
|
||||
PictureTransformIsInverse ("scale", &crtc_to_fb, &fb_to_crtc);
|
||||
|
||||
PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, scale_dx, scale_dy);
|
||||
PictureTransformIsInverse ("scale translate", &crtc_to_fb, &fb_to_crtc);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* If the untranslated transformation is the identity,
|
||||
* disable the shadow buffer
|
||||
*/
|
||||
if (PictureTransformIsIdentity (&crtc_to_fb))
|
||||
{
|
||||
crtc->transform_in_use = FALSE;
|
||||
PictureTransformInitTranslate (&crtc->crtc_to_framebuffer,
|
||||
F (-crtc->x), F (-crtc->y));
|
||||
PictureTransformInitTranslate (&crtc->framebuffer_to_crtc,
|
||||
F ( crtc->x), F ( crtc->y));
|
||||
xf86RotateDestroy (crtc);
|
||||
}
|
||||
else
|
||||
{
|
||||
int width, height, old_width, old_height;
|
||||
void *shadowData;
|
||||
PixmapPtr shadow;
|
||||
|
||||
PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, F(crtc->x), F(crtc->y));
|
||||
PictureTransformIsInverse ("offset", &crtc_to_fb, &fb_to_crtc);
|
||||
|
||||
/*
|
||||
* these are the size of the shadow pixmap, which
|
||||
* matches the mode, not the pre-rotated copy in the
|
||||
* frame buffer
|
||||
*/
|
||||
width = mode->HDisplay;
|
||||
height = mode->VDisplay;
|
||||
shadowData = crtc->rotatedData;
|
||||
shadow = crtc->rotatedPixmap;
|
||||
old_width = shadow ? shadow->drawable.width : 0;
|
||||
old_height = shadow ? shadow->drawable.height : 0;
|
||||
|
||||
/* Allocate memory for rotation */
|
||||
if (old_width != width || old_height != height)
|
||||
{
|
||||
if (shadow || shadowData)
|
||||
{
|
||||
crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
|
||||
crtc->rotatedPixmap = NULL;
|
||||
crtc->rotatedData = NULL;
|
||||
}
|
||||
shadowData = crtc->funcs->shadow_allocate (crtc, width, height);
|
||||
if (!shadowData)
|
||||
goto bail1;
|
||||
crtc->rotatedData = shadowData;
|
||||
/* shadow will be damaged in xf86RotatePrepare */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* mark shadowed area as damaged so it will be repainted */
|
||||
xf86CrtcDamageShadow (crtc);
|
||||
}
|
||||
|
||||
if (!xf86_config->rotation_damage)
|
||||
{
|
||||
/* Create damage structure */
|
||||
xf86_config->rotation_damage = DamageCreate (NULL, NULL,
|
||||
DamageReportNone,
|
||||
TRUE, pScreen, pScreen);
|
||||
if (!xf86_config->rotation_damage)
|
||||
goto bail2;
|
||||
|
||||
/* Wrap block handler */
|
||||
xf86_config->BlockHandler = pScreen->BlockHandler;
|
||||
pScreen->BlockHandler = xf86RotateBlockHandler;
|
||||
}
|
||||
if (0)
|
||||
{
|
||||
bail2:
|
||||
if (shadow || shadowData)
|
||||
{
|
||||
crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
|
||||
crtc->rotatedPixmap = NULL;
|
||||
crtc->rotatedData = NULL;
|
||||
}
|
||||
bail1:
|
||||
if (old_width && old_height)
|
||||
crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
|
||||
NULL,
|
||||
old_width,
|
||||
old_height);
|
||||
return FALSE;
|
||||
}
|
||||
crtc->transform_in_use = TRUE;
|
||||
crtc->crtc_to_framebuffer = crtc_to_fb;
|
||||
crtc->framebuffer_to_crtc = fb_to_crtc;
|
||||
crtc->bounds.x1 = 0;
|
||||
crtc->bounds.x2 = crtc->mode.HDisplay;
|
||||
crtc->bounds.y1 = 0;
|
||||
crtc->bounds.y2 = crtc->mode.VDisplay;
|
||||
PictureTransformBounds (&crtc->bounds, &crtc_to_fb);
|
||||
}
|
||||
|
||||
/* All done */
|
||||
return TRUE;
|
||||
}
|
@ -1,301 +0,0 @@
|
||||
/*
|
||||
* Copyright 2005-2006 Luc Verhaegen.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The reason for having this function in a file of its own is
|
||||
* so that ../utils/cvt/cvt can link to it, and that xf86CVTMode
|
||||
* code is shared directly.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#else
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Modes.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Generate a CVT standard mode from HDisplay, VDisplay and VRefresh.
|
||||
*
|
||||
* These calculations are stolen from the CVT calculation spreadsheet written
|
||||
* by Graham Loveridge. He seems to be claiming no copyright and there seems to
|
||||
* be no license attached to this. He apparently just wants to see his name
|
||||
* mentioned.
|
||||
*
|
||||
* This file can be found at http://www.vesa.org/Public/CVT/CVTd6r1.xls
|
||||
*
|
||||
* Comments and structure corresponds to the comments and structure of the xls.
|
||||
* This should ease importing of future changes to the standard (not very
|
||||
* likely though).
|
||||
*
|
||||
* About margins; i'm sure that they are to be the bit between HDisplay and
|
||||
* HBlankStart, HBlankEnd and HTotal, VDisplay and VBlankStart, VBlankEnd and
|
||||
* VTotal, where the overscan colour is shown. FB seems to call _all_ blanking
|
||||
* outside sync "margin" for some reason. Since we prefer seeing proper
|
||||
* blanking instead of the overscan colour, and since the Crtc* values will
|
||||
* probably get altered after us, we will disable margins altogether. With
|
||||
* these calculations, Margins will plainly expand H/VDisplay, and we don't
|
||||
* want that. -- libv
|
||||
*
|
||||
*/
|
||||
_X_EXPORT DisplayModePtr
|
||||
xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, Bool Reduced,
|
||||
Bool Interlaced)
|
||||
{
|
||||
DisplayModeRec *Mode = xnfcalloc(1, sizeof(DisplayModeRec));
|
||||
|
||||
/* 1) top/bottom margin size (% of height) - default: 1.8 */
|
||||
#define CVT_MARGIN_PERCENTAGE 1.8
|
||||
|
||||
/* 2) character cell horizontal granularity (pixels) - default 8 */
|
||||
#define CVT_H_GRANULARITY 8
|
||||
|
||||
/* 4) Minimum vertical porch (lines) - default 3 */
|
||||
#define CVT_MIN_V_PORCH 3
|
||||
|
||||
/* 4) Minimum number of vertical back porch lines - default 6 */
|
||||
#define CVT_MIN_V_BPORCH 6
|
||||
|
||||
/* Pixel Clock step (kHz) */
|
||||
#define CVT_CLOCK_STEP 250
|
||||
|
||||
Bool Margins = FALSE;
|
||||
float VFieldRate, HPeriod;
|
||||
int HDisplayRnd, HMargin;
|
||||
int VDisplayRnd, VMargin, VSync;
|
||||
float Interlace; /* Please rename this */
|
||||
|
||||
/* CVT default is 60.0Hz */
|
||||
if (!VRefresh)
|
||||
VRefresh = 60.0;
|
||||
|
||||
/* 1. Required field rate */
|
||||
if (Interlaced)
|
||||
VFieldRate = VRefresh * 2;
|
||||
else
|
||||
VFieldRate = VRefresh;
|
||||
|
||||
/* 2. Horizontal pixels */
|
||||
HDisplayRnd = HDisplay - (HDisplay % CVT_H_GRANULARITY);
|
||||
|
||||
/* 3. Determine left and right borders */
|
||||
if (Margins) {
|
||||
/* right margin is actually exactly the same as left */
|
||||
HMargin = (((float) HDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0);
|
||||
HMargin -= HMargin % CVT_H_GRANULARITY;
|
||||
} else
|
||||
HMargin = 0;
|
||||
|
||||
/* 4. Find total active pixels */
|
||||
Mode->HDisplay = HDisplayRnd + 2*HMargin;
|
||||
|
||||
/* 5. Find number of lines per field */
|
||||
if (Interlaced)
|
||||
VDisplayRnd = VDisplay / 2;
|
||||
else
|
||||
VDisplayRnd = VDisplay;
|
||||
|
||||
/* 6. Find top and bottom margins */
|
||||
/* nope. */
|
||||
if (Margins)
|
||||
/* top and bottom margins are equal again. */
|
||||
VMargin = (((float) VDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0);
|
||||
else
|
||||
VMargin = 0;
|
||||
|
||||
Mode->VDisplay = VDisplay + 2*VMargin;
|
||||
|
||||
/* 7. Interlace */
|
||||
if (Interlaced)
|
||||
Interlace = 0.5;
|
||||
else
|
||||
Interlace = 0.0;
|
||||
|
||||
/* Determine VSync Width from aspect ratio */
|
||||
if (!(VDisplay % 3) && ((VDisplay * 4 / 3) == HDisplay))
|
||||
VSync = 4;
|
||||
else if (!(VDisplay % 9) && ((VDisplay * 16 / 9) == HDisplay))
|
||||
VSync = 5;
|
||||
else if (!(VDisplay % 10) && ((VDisplay * 16 / 10) == HDisplay))
|
||||
VSync = 6;
|
||||
else if (!(VDisplay % 4) && ((VDisplay * 5 / 4) == HDisplay))
|
||||
VSync = 7;
|
||||
else if (!(VDisplay % 9) && ((VDisplay * 15 / 9) == HDisplay))
|
||||
VSync = 7;
|
||||
else /* Custom */
|
||||
VSync = 10;
|
||||
|
||||
if (!Reduced) { /* simplified GTF calculation */
|
||||
|
||||
/* 4) Minimum time of vertical sync + back porch interval (µs)
|
||||
* default 550.0 */
|
||||
#define CVT_MIN_VSYNC_BP 550.0
|
||||
|
||||
/* 3) Nominal HSync width (% of line period) - default 8 */
|
||||
#define CVT_HSYNC_PERCENTAGE 8
|
||||
|
||||
float HBlankPercentage;
|
||||
int VSyncAndBackPorch, VBackPorch;
|
||||
int HBlank;
|
||||
|
||||
/* 8. Estimated Horizontal period */
|
||||
HPeriod = ((float) (1000000.0 / VFieldRate - CVT_MIN_VSYNC_BP)) /
|
||||
(VDisplayRnd + 2 * VMargin + CVT_MIN_V_PORCH + Interlace);
|
||||
|
||||
/* 9. Find number of lines in sync + backporch */
|
||||
if (((int)(CVT_MIN_VSYNC_BP / HPeriod) + 1) < (VSync + CVT_MIN_V_PORCH))
|
||||
VSyncAndBackPorch = VSync + CVT_MIN_V_PORCH;
|
||||
else
|
||||
VSyncAndBackPorch = (int)(CVT_MIN_VSYNC_BP / HPeriod) + 1;
|
||||
|
||||
/* 10. Find number of lines in back porch */
|
||||
VBackPorch = VSyncAndBackPorch - VSync;
|
||||
|
||||
/* 11. Find total number of lines in vertical field */
|
||||
Mode->VTotal = VDisplayRnd + 2 * VMargin + VSyncAndBackPorch + Interlace
|
||||
+ CVT_MIN_V_PORCH;
|
||||
|
||||
/* 5) Definition of Horizontal blanking time limitation */
|
||||
/* Gradient (%/kHz) - default 600 */
|
||||
#define CVT_M_FACTOR 600
|
||||
|
||||
/* Offset (%) - default 40 */
|
||||
#define CVT_C_FACTOR 40
|
||||
|
||||
/* Blanking time scaling factor - default 128 */
|
||||
#define CVT_K_FACTOR 128
|
||||
|
||||
/* Scaling factor weighting - default 20 */
|
||||
#define CVT_J_FACTOR 20
|
||||
|
||||
#define CVT_M_PRIME CVT_M_FACTOR * CVT_K_FACTOR / 256
|
||||
#define CVT_C_PRIME (CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \
|
||||
CVT_J_FACTOR
|
||||
|
||||
/* 12. Find ideal blanking duty cycle from formula */
|
||||
HBlankPercentage = CVT_C_PRIME - CVT_M_PRIME * HPeriod/1000.0;
|
||||
|
||||
/* 13. Blanking time */
|
||||
if (HBlankPercentage < 20)
|
||||
HBlankPercentage = 20;
|
||||
|
||||
HBlank = Mode->HDisplay * HBlankPercentage/(100.0 - HBlankPercentage);
|
||||
HBlank -= HBlank % (2*CVT_H_GRANULARITY);
|
||||
|
||||
/* 14. Find total number of pixels in a line. */
|
||||
Mode->HTotal = Mode->HDisplay + HBlank;
|
||||
|
||||
/* Fill in HSync values */
|
||||
Mode->HSyncEnd = Mode->HDisplay + HBlank / 2;
|
||||
|
||||
Mode->HSyncStart = Mode->HSyncEnd -
|
||||
(Mode->HTotal * CVT_HSYNC_PERCENTAGE) / 100;
|
||||
Mode->HSyncStart += CVT_H_GRANULARITY -
|
||||
Mode->HSyncStart % CVT_H_GRANULARITY;
|
||||
|
||||
/* Fill in VSync values */
|
||||
Mode->VSyncStart = Mode->VDisplay + CVT_MIN_V_PORCH;
|
||||
Mode->VSyncEnd = Mode->VSyncStart + VSync;
|
||||
|
||||
} else { /* Reduced blanking */
|
||||
/* Minimum vertical blanking interval time (µs) - default 460 */
|
||||
#define CVT_RB_MIN_VBLANK 460.0
|
||||
|
||||
/* Fixed number of clocks for horizontal sync */
|
||||
#define CVT_RB_H_SYNC 32.0
|
||||
|
||||
/* Fixed number of clocks for horizontal blanking */
|
||||
#define CVT_RB_H_BLANK 160.0
|
||||
|
||||
/* Fixed number of lines for vertical front porch - default 3 */
|
||||
#define CVT_RB_VFPORCH 3
|
||||
|
||||
int VBILines;
|
||||
|
||||
/* 8. Estimate Horizontal period. */
|
||||
HPeriod = ((float) (1000000.0 / VFieldRate - CVT_RB_MIN_VBLANK)) /
|
||||
(VDisplayRnd + 2*VMargin);
|
||||
|
||||
/* 9. Find number of lines in vertical blanking */
|
||||
VBILines = ((float) CVT_RB_MIN_VBLANK) / HPeriod + 1;
|
||||
|
||||
/* 10. Check if vertical blanking is sufficient */
|
||||
if (VBILines < (CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH))
|
||||
VBILines = CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH;
|
||||
|
||||
/* 11. Find total number of lines in vertical field */
|
||||
Mode->VTotal = VDisplayRnd + 2 * VMargin + Interlace + VBILines;
|
||||
|
||||
/* 12. Find total number of pixels in a line */
|
||||
Mode->HTotal = Mode->HDisplay + CVT_RB_H_BLANK;
|
||||
|
||||
/* Fill in HSync values */
|
||||
Mode->HSyncEnd = Mode->HDisplay + CVT_RB_H_BLANK / 2;
|
||||
Mode->HSyncStart = Mode->HSyncEnd - CVT_RB_H_SYNC;
|
||||
|
||||
/* Fill in VSync values */
|
||||
Mode->VSyncStart = Mode->VDisplay + CVT_RB_VFPORCH;
|
||||
Mode->VSyncEnd = Mode->VSyncStart + VSync;
|
||||
}
|
||||
|
||||
/* 15/13. Find pixel clock frequency (kHz for xf86) */
|
||||
Mode->Clock = Mode->HTotal * 1000.0 / HPeriod;
|
||||
Mode->Clock -= Mode->Clock % CVT_CLOCK_STEP;
|
||||
|
||||
/* 16/14. Find actual Horizontal Frequency (kHz) */
|
||||
Mode->HSync = ((float) Mode->Clock) / ((float) Mode->HTotal);
|
||||
|
||||
/* 17/15. Find actual Field rate */
|
||||
Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
|
||||
((float) (Mode->HTotal * Mode->VTotal));
|
||||
|
||||
/* 18/16. Find actual vertical frame frequency */
|
||||
/* ignore - just set the mode flag for interlaced */
|
||||
if (Interlaced)
|
||||
Mode->VTotal *= 2;
|
||||
|
||||
{
|
||||
char Name[256];
|
||||
Name[0] = 0;
|
||||
|
||||
snprintf(Name, 256, "%dx%d", HDisplay, VDisplay);
|
||||
|
||||
Mode->name = xnfalloc(strlen(Name) + 1);
|
||||
memcpy(Mode->name, Name, strlen(Name) + 1);
|
||||
}
|
||||
|
||||
if (Reduced)
|
||||
Mode->Flags |= V_PHSYNC | V_NVSYNC;
|
||||
else
|
||||
Mode->Flags |= V_NHSYNC | V_PVSYNC;
|
||||
|
||||
if (Interlaced)
|
||||
Mode->Flags |= V_INTERLACE;
|
||||
|
||||
return Mode;
|
||||
}
|
@ -1,112 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1997 Metro Link Incorporated
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the Metro Link shall not be
|
||||
* used in advertising or otherwise to promote the sale, use or other dealings
|
||||
* in this Software without prior written authorization from Metro Link.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1997-2001 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This file contains the Option Record that is passed between the Parser,
|
||||
* and Module setup procs.
|
||||
*/
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _xf86Optrec_h_
|
||||
#define _xf86Optrec_h_
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
* all records that need to be linked lists should contain a GenericList as
|
||||
* their first field.
|
||||
*/
|
||||
typedef struct generic_list_rec
|
||||
{
|
||||
void *next;
|
||||
}
|
||||
GenericListRec, *GenericListPtr, *glp;
|
||||
|
||||
/*
|
||||
* All options are stored using this data type.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *opt_name;
|
||||
char *opt_val;
|
||||
int opt_used;
|
||||
char *opt_comment;
|
||||
}
|
||||
XF86OptionRec, *XF86OptionPtr;
|
||||
|
||||
|
||||
XF86OptionPtr xf86addNewOption(XF86OptionPtr head, char *name, char *val);
|
||||
XF86OptionPtr xf86optionListDup(XF86OptionPtr opt);
|
||||
void xf86optionListFree(XF86OptionPtr opt);
|
||||
char *xf86optionName(XF86OptionPtr opt);
|
||||
char *xf86optionValue(XF86OptionPtr opt);
|
||||
XF86OptionPtr xf86newOption(char *name, char *value);
|
||||
XF86OptionPtr xf86nextOption(XF86OptionPtr list);
|
||||
XF86OptionPtr xf86findOption(XF86OptionPtr list, const char *name);
|
||||
char *xf86findOptionValue(XF86OptionPtr list, const char *name);
|
||||
int xf86findOptionBoolean (XF86OptionPtr, const char *, int);
|
||||
XF86OptionPtr xf86optionListCreate(const char **options, int count, int used);
|
||||
XF86OptionPtr xf86optionListMerge(XF86OptionPtr head, XF86OptionPtr tail);
|
||||
char *xf86configStrdup (const char *s);
|
||||
int xf86nameCompare (const char *s1, const char *s2);
|
||||
char *xf86uLongToString(unsigned long i);
|
||||
void xf86debugListOptions(XF86OptionPtr);
|
||||
XF86OptionPtr xf86parseOption(XF86OptionPtr head);
|
||||
void xf86printOptionList(FILE *fp, XF86OptionPtr list, int tabs);
|
||||
|
||||
|
||||
#endif /* _xf86Optrec_h_ */
|
@ -1,484 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1997 Metro Link Incorporated
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the Metro Link shall not be
|
||||
* used in advertising or otherwise to promote the sale, use or other dealings
|
||||
* in this Software without prior written authorization from Metro Link.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This file contains the external interfaces for the XFree86 configuration
|
||||
* file parser.
|
||||
*/
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _xf86Parser_h_
|
||||
#define _xf86Parser_h_
|
||||
|
||||
#include "xf86Optrec.h"
|
||||
|
||||
#define HAVE_PARSER_DECLS
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *file_logfile;
|
||||
char *file_modulepath;
|
||||
char *file_inputdevs;
|
||||
char *file_fontpath;
|
||||
char *file_comment;
|
||||
}
|
||||
XF86ConfFilesRec, *XF86ConfFilesPtr;
|
||||
|
||||
/* Values for load_type */
|
||||
#define XF86_LOAD_MODULE 0
|
||||
#define XF86_LOAD_DRIVER 1
|
||||
#define XF86_DISABLE_MODULE 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
int load_type;
|
||||
char *load_name;
|
||||
XF86OptionPtr load_opt;
|
||||
char *load_comment;
|
||||
int ignore;
|
||||
}
|
||||
XF86LoadRec, *XF86LoadPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
XF86LoadPtr mod_load_lst;
|
||||
XF86LoadPtr mod_disable_lst;
|
||||
char *mod_comment;
|
||||
}
|
||||
XF86ConfModuleRec, *XF86ConfModulePtr;
|
||||
|
||||
#define CONF_IMPLICIT_KEYBOARD "Implicit Core Keyboard"
|
||||
|
||||
#define CONF_IMPLICIT_POINTER "Implicit Core Pointer"
|
||||
|
||||
#define XF86CONF_PHSYNC 0x0001
|
||||
#define XF86CONF_NHSYNC 0x0002
|
||||
#define XF86CONF_PVSYNC 0x0004
|
||||
#define XF86CONF_NVSYNC 0x0008
|
||||
#define XF86CONF_INTERLACE 0x0010
|
||||
#define XF86CONF_DBLSCAN 0x0020
|
||||
#define XF86CONF_CSYNC 0x0040
|
||||
#define XF86CONF_PCSYNC 0x0080
|
||||
#define XF86CONF_NCSYNC 0x0100
|
||||
#define XF86CONF_HSKEW 0x0200 /* hskew provided */
|
||||
#define XF86CONF_BCAST 0x0400
|
||||
#define XF86CONF_CUSTOM 0x0800 /* timing numbers customized by editor */
|
||||
#define XF86CONF_VSCAN 0x1000
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *ml_identifier;
|
||||
int ml_clock;
|
||||
int ml_hdisplay;
|
||||
int ml_hsyncstart;
|
||||
int ml_hsyncend;
|
||||
int ml_htotal;
|
||||
int ml_vdisplay;
|
||||
int ml_vsyncstart;
|
||||
int ml_vsyncend;
|
||||
int ml_vtotal;
|
||||
int ml_vscan;
|
||||
int ml_flags;
|
||||
int ml_hskew;
|
||||
char *ml_comment;
|
||||
}
|
||||
XF86ConfModeLineRec, *XF86ConfModeLinePtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *vp_identifier;
|
||||
XF86OptionPtr vp_option_lst;
|
||||
char *vp_comment;
|
||||
}
|
||||
XF86ConfVideoPortRec, *XF86ConfVideoPortPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *va_identifier;
|
||||
char *va_vendor;
|
||||
char *va_board;
|
||||
char *va_busid;
|
||||
char *va_driver;
|
||||
XF86OptionPtr va_option_lst;
|
||||
XF86ConfVideoPortPtr va_port_lst;
|
||||
char *va_fwdref;
|
||||
char *va_comment;
|
||||
}
|
||||
XF86ConfVideoAdaptorRec, *XF86ConfVideoAdaptorPtr;
|
||||
|
||||
#define CONF_MAX_HSYNC 8
|
||||
#define CONF_MAX_VREFRESH 8
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float hi, lo;
|
||||
}
|
||||
parser_range;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int red, green, blue;
|
||||
}
|
||||
parser_rgb;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *modes_identifier;
|
||||
XF86ConfModeLinePtr mon_modeline_lst;
|
||||
char *modes_comment;
|
||||
}
|
||||
XF86ConfModesRec, *XF86ConfModesPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *ml_modes_str;
|
||||
XF86ConfModesPtr ml_modes;
|
||||
}
|
||||
XF86ConfModesLinkRec, *XF86ConfModesLinkPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *mon_identifier;
|
||||
char *mon_vendor;
|
||||
char *mon_modelname;
|
||||
int mon_width; /* in mm */
|
||||
int mon_height; /* in mm */
|
||||
XF86ConfModeLinePtr mon_modeline_lst;
|
||||
int mon_n_hsync;
|
||||
parser_range mon_hsync[CONF_MAX_HSYNC];
|
||||
int mon_n_vrefresh;
|
||||
parser_range mon_vrefresh[CONF_MAX_VREFRESH];
|
||||
float mon_gamma_red;
|
||||
float mon_gamma_green;
|
||||
float mon_gamma_blue;
|
||||
XF86OptionPtr mon_option_lst;
|
||||
XF86ConfModesLinkPtr mon_modes_sect_lst;
|
||||
char *mon_comment;
|
||||
}
|
||||
XF86ConfMonitorRec, *XF86ConfMonitorPtr;
|
||||
|
||||
#define CONF_MAXDACSPEEDS 4
|
||||
#define CONF_MAXCLOCKS 128
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *dev_identifier;
|
||||
char *dev_vendor;
|
||||
char *dev_board;
|
||||
char *dev_chipset;
|
||||
char *dev_busid;
|
||||
char *dev_card;
|
||||
char *dev_driver;
|
||||
char *dev_ramdac;
|
||||
int dev_dacSpeeds[CONF_MAXDACSPEEDS];
|
||||
int dev_videoram;
|
||||
int dev_textclockfreq;
|
||||
unsigned long dev_bios_base;
|
||||
unsigned long dev_mem_base;
|
||||
unsigned long dev_io_base;
|
||||
char *dev_clockchip;
|
||||
int dev_clocks;
|
||||
int dev_clock[CONF_MAXCLOCKS];
|
||||
int dev_chipid;
|
||||
int dev_chiprev;
|
||||
int dev_irq;
|
||||
int dev_screen;
|
||||
XF86OptionPtr dev_option_lst;
|
||||
char *dev_comment;
|
||||
}
|
||||
XF86ConfDeviceRec, *XF86ConfDevicePtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *mode_name;
|
||||
}
|
||||
XF86ModeRec, *XF86ModePtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
int disp_frameX0;
|
||||
int disp_frameY0;
|
||||
int disp_virtualX;
|
||||
int disp_virtualY;
|
||||
int disp_depth;
|
||||
int disp_bpp;
|
||||
char *disp_visual;
|
||||
parser_rgb disp_weight;
|
||||
parser_rgb disp_black;
|
||||
parser_rgb disp_white;
|
||||
XF86ModePtr disp_mode_lst;
|
||||
XF86OptionPtr disp_option_lst;
|
||||
char *disp_comment;
|
||||
}
|
||||
XF86ConfDisplayRec, *XF86ConfDisplayPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
XF86OptionPtr flg_option_lst;
|
||||
char *flg_comment;
|
||||
}
|
||||
XF86ConfFlagsRec, *XF86ConfFlagsPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *al_adaptor_str;
|
||||
XF86ConfVideoAdaptorPtr al_adaptor;
|
||||
}
|
||||
XF86ConfAdaptorLinkRec, *XF86ConfAdaptorLinkPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *scrn_identifier;
|
||||
char *scrn_obso_driver;
|
||||
int scrn_defaultdepth;
|
||||
int scrn_defaultbpp;
|
||||
int scrn_defaultfbbpp;
|
||||
char *scrn_monitor_str;
|
||||
XF86ConfMonitorPtr scrn_monitor;
|
||||
char *scrn_device_str;
|
||||
XF86ConfDevicePtr scrn_device;
|
||||
XF86ConfAdaptorLinkPtr scrn_adaptor_lst;
|
||||
XF86ConfDisplayPtr scrn_display_lst;
|
||||
XF86OptionPtr scrn_option_lst;
|
||||
char *scrn_comment;
|
||||
int scrn_virtualX, scrn_virtualY;
|
||||
}
|
||||
XF86ConfScreenRec, *XF86ConfScreenPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *inp_identifier;
|
||||
char *inp_driver;
|
||||
XF86OptionPtr inp_option_lst;
|
||||
char *inp_comment;
|
||||
}
|
||||
XF86ConfInputRec, *XF86ConfInputPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
XF86ConfInputPtr iref_inputdev;
|
||||
char *iref_inputdev_str;
|
||||
XF86OptionPtr iref_option_lst;
|
||||
}
|
||||
XF86ConfInputrefRec, *XF86ConfInputrefPtr;
|
||||
|
||||
/* Values for adj_where */
|
||||
#define CONF_ADJ_OBSOLETE -1
|
||||
#define CONF_ADJ_ABSOLUTE 0
|
||||
#define CONF_ADJ_RIGHTOF 1
|
||||
#define CONF_ADJ_LEFTOF 2
|
||||
#define CONF_ADJ_ABOVE 3
|
||||
#define CONF_ADJ_BELOW 4
|
||||
#define CONF_ADJ_RELATIVE 5
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
int adj_scrnum;
|
||||
XF86ConfScreenPtr adj_screen;
|
||||
char *adj_screen_str;
|
||||
XF86ConfScreenPtr adj_top;
|
||||
char *adj_top_str;
|
||||
XF86ConfScreenPtr adj_bottom;
|
||||
char *adj_bottom_str;
|
||||
XF86ConfScreenPtr adj_left;
|
||||
char *adj_left_str;
|
||||
XF86ConfScreenPtr adj_right;
|
||||
char *adj_right_str;
|
||||
int adj_where;
|
||||
int adj_x;
|
||||
int adj_y;
|
||||
char *adj_refscreen;
|
||||
}
|
||||
XF86ConfAdjacencyRec, *XF86ConfAdjacencyPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *inactive_device_str;
|
||||
XF86ConfDevicePtr inactive_device;
|
||||
}
|
||||
XF86ConfInactiveRec, *XF86ConfInactivePtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *lay_identifier;
|
||||
XF86ConfAdjacencyPtr lay_adjacency_lst;
|
||||
XF86ConfInactivePtr lay_inactive_lst;
|
||||
XF86ConfInputrefPtr lay_input_lst;
|
||||
XF86OptionPtr lay_option_lst;
|
||||
char *lay_comment;
|
||||
}
|
||||
XF86ConfLayoutRec, *XF86ConfLayoutPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *vs_name;
|
||||
char *vs_identifier;
|
||||
XF86OptionPtr vs_option_lst;
|
||||
char *vs_comment;
|
||||
}
|
||||
XF86ConfVendSubRec, *XF86ConfVendSubPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
char *vnd_identifier;
|
||||
XF86OptionPtr vnd_option_lst;
|
||||
XF86ConfVendSubPtr vnd_sub_lst;
|
||||
char *vnd_comment;
|
||||
}
|
||||
XF86ConfVendorRec, *XF86ConfVendorPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GenericListRec list;
|
||||
int buf_count;
|
||||
int buf_size;
|
||||
char *buf_flags;
|
||||
char *buf_comment;
|
||||
}
|
||||
XF86ConfBuffersRec, *XF86ConfBuffersPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *dri_group_name;
|
||||
int dri_group;
|
||||
int dri_mode;
|
||||
XF86ConfBuffersPtr dri_buffers_lst;
|
||||
char *dri_comment;
|
||||
}
|
||||
XF86ConfDRIRec, *XF86ConfDRIPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
XF86OptionPtr ext_option_lst;
|
||||
char *extensions_comment;
|
||||
}
|
||||
XF86ConfExtensionsRec, *XF86ConfExtensionsPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
XF86ConfFilesPtr conf_files;
|
||||
XF86ConfModulePtr conf_modules;
|
||||
XF86ConfFlagsPtr conf_flags;
|
||||
XF86ConfVideoAdaptorPtr conf_videoadaptor_lst;
|
||||
XF86ConfModesPtr conf_modes_lst;
|
||||
XF86ConfMonitorPtr conf_monitor_lst;
|
||||
XF86ConfDevicePtr conf_device_lst;
|
||||
XF86ConfScreenPtr conf_screen_lst;
|
||||
XF86ConfInputPtr conf_input_lst;
|
||||
XF86ConfLayoutPtr conf_layout_lst;
|
||||
XF86ConfVendorPtr conf_vendor_lst;
|
||||
XF86ConfDRIPtr conf_dri;
|
||||
XF86ConfExtensionsPtr conf_extensions;
|
||||
char *conf_comment;
|
||||
}
|
||||
XF86ConfigRec, *XF86ConfigPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int token; /* id of the token */
|
||||
char *name; /* pointer to the LOWERCASED name */
|
||||
}
|
||||
xf86ConfigSymTabRec, *xf86ConfigSymTabPtr;
|
||||
|
||||
/*
|
||||
* prototypes for public functions
|
||||
*/
|
||||
extern const char *xf86openConfigFile (const char *, const char *,
|
||||
const char *);
|
||||
extern void xf86setBuiltinConfig(const char *config[]);
|
||||
extern XF86ConfigPtr xf86readConfigFile (void);
|
||||
extern void xf86closeConfigFile (void);
|
||||
extern void xf86freeConfig (XF86ConfigPtr p);
|
||||
extern int xf86writeConfigFile (const char *, XF86ConfigPtr);
|
||||
XF86ConfDevicePtr xf86findDevice(const char *ident, XF86ConfDevicePtr p);
|
||||
XF86ConfLayoutPtr xf86findLayout(const char *name, XF86ConfLayoutPtr list);
|
||||
XF86ConfMonitorPtr xf86findMonitor(const char *ident, XF86ConfMonitorPtr p);
|
||||
XF86ConfModesPtr xf86findModes(const char *ident, XF86ConfModesPtr p);
|
||||
XF86ConfModeLinePtr xf86findModeLine(const char *ident, XF86ConfModeLinePtr p);
|
||||
XF86ConfScreenPtr xf86findScreen(const char *ident, XF86ConfScreenPtr p);
|
||||
XF86ConfInputPtr xf86findInput(const char *ident, XF86ConfInputPtr p);
|
||||
XF86ConfInputPtr xf86findInputByDriver(const char *driver, XF86ConfInputPtr p);
|
||||
XF86ConfVideoAdaptorPtr xf86findVideoAdaptor(const char *ident,
|
||||
XF86ConfVideoAdaptorPtr p);
|
||||
|
||||
GenericListPtr xf86addListItem(GenericListPtr head, GenericListPtr c_new);
|
||||
int xf86itemNotSublist(GenericListPtr list_1, GenericListPtr list_2);
|
||||
|
||||
int xf86pathIsAbsolute(const char *path);
|
||||
int xf86pathIsSafe(const char *path);
|
||||
char *xf86addComment(char *cur, char *add);
|
||||
|
||||
#endif /* _xf86Parser_h_ */
|
Loading…
Reference in New Issue
Block a user