1428d7b3dSmrg/************************************************************************** 2428d7b3dSmrg 3428d7b3dSmrgCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 4428d7b3dSmrgCopyright © 2002 David Dawes 5428d7b3dSmrg 6428d7b3dSmrgAll Rights Reserved. 7428d7b3dSmrg 8428d7b3dSmrgPermission is hereby granted, free of charge, to any person obtaining a 9428d7b3dSmrgcopy of this software and associated documentation files (the 10428d7b3dSmrg"Software"), to deal in the Software without restriction, including 11428d7b3dSmrgwithout limitation the rights to use, copy, modify, merge, publish, 12428d7b3dSmrgdistribute, sub license, and/or sell copies of the Software, and to 13428d7b3dSmrgpermit persons to whom the Software is furnished to do so, subject to 14428d7b3dSmrgthe following conditions: 15428d7b3dSmrg 16428d7b3dSmrgThe above copyright notice and this permission notice (including the 17428d7b3dSmrgnext paragraph) shall be included in all copies or substantial portions 18428d7b3dSmrgof the Software. 19428d7b3dSmrg 20428d7b3dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21428d7b3dSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22428d7b3dSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23428d7b3dSmrgIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 24428d7b3dSmrgANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25428d7b3dSmrgTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26428d7b3dSmrgSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27428d7b3dSmrg 28428d7b3dSmrg**************************************************************************/ 29428d7b3dSmrg 30428d7b3dSmrg/* 31428d7b3dSmrg * Authors: 32428d7b3dSmrg * Keith Whitwell <keith@tungstengraphics.com> 33428d7b3dSmrg * David Dawes <dawes@xfree86.org> 34428d7b3dSmrg * 35428d7b3dSmrg */ 36428d7b3dSmrg 37428d7b3dSmrg#ifdef HAVE_CONFIG_H 38428d7b3dSmrg#include "config.h" 39428d7b3dSmrg#endif 40428d7b3dSmrg 41428d7b3dSmrg#if 0 42428d7b3dSmrg#define I830DEBUG 43428d7b3dSmrg#endif 44428d7b3dSmrg 45428d7b3dSmrg#include <stdint.h> 46428d7b3dSmrg 47428d7b3dSmrg#ifndef REMAP_RESERVED 48428d7b3dSmrg#define REMAP_RESERVED 0 49428d7b3dSmrg#endif 50428d7b3dSmrg 51428d7b3dSmrg#ifndef _I830_H_ 52428d7b3dSmrg#define _I830_H_ 53428d7b3dSmrg 54428d7b3dSmrg#include "xorg-server.h" 55428d7b3dSmrg#include "xf86_OSproc.h" 56428d7b3dSmrg#include "compiler.h" 57428d7b3dSmrg#include "xf86Cursor.h" 58428d7b3dSmrg#include "xf86xv.h" 59428d7b3dSmrg#include "xf86Crtc.h" 60428d7b3dSmrg#include "xf86RandR12.h" 61428d7b3dSmrg 62428d7b3dSmrg#include "xorg-server.h" 63428d7b3dSmrg#include <pciaccess.h> 64428d7b3dSmrg 65428d7b3dSmrg#define _XF86DRI_SERVER_ 66428d7b3dSmrg#include "drm.h" 67428d7b3dSmrg#include "dri2.h" 68428d7b3dSmrg#include "intel_bufmgr.h" 69428d7b3dSmrg#include "i915_drm.h" 70428d7b3dSmrg 71428d7b3dSmrg#include "intel_driver.h" 72428d7b3dSmrg#include "intel_options.h" 73428d7b3dSmrg#include "intel_list.h" 74428d7b3dSmrg#include "compat-api.h" 75428d7b3dSmrg 76428d7b3dSmrg#if HAVE_UDEV 77428d7b3dSmrg#include <libudev.h> 78428d7b3dSmrg#endif 79428d7b3dSmrg 80428d7b3dSmrg#if HAVE_DRI3 81428d7b3dSmrg#include "misync.h" 82428d7b3dSmrg#endif 83428d7b3dSmrg 84428d7b3dSmrg/* remain compatible to xorg-server 1.6 */ 85428d7b3dSmrg#ifndef MONITOR_EDID_COMPLETE_RAWDATA 86428d7b3dSmrg#define MONITOR_EDID_COMPLETE_RAWDATA EDID_COMPLETE_RAWDATA 87428d7b3dSmrg#endif 88428d7b3dSmrg 89428d7b3dSmrg#if XF86_CRTC_VERSION >= 5 90428d7b3dSmrg#define INTEL_PIXMAP_SHARING 1 91428d7b3dSmrg#endif 92428d7b3dSmrg 93428d7b3dSmrg#define MAX_PIPES 4 /* consider making all users dynamic */ 94428d7b3dSmrg 95428d7b3dSmrg#include "common.h" 96428d7b3dSmrg 97428d7b3dSmrg#define PITCH_NONE 0 98428d7b3dSmrg 99428d7b3dSmrg/** enumeration of 3d consumers so some can maintain invariant state. */ 100428d7b3dSmrgenum last_3d { 101428d7b3dSmrg LAST_3D_OTHER, 102428d7b3dSmrg LAST_3D_VIDEO, 103428d7b3dSmrg LAST_3D_RENDER, 104428d7b3dSmrg LAST_3D_ROTATION 105428d7b3dSmrg}; 106428d7b3dSmrg 107428d7b3dSmrgenum dri_type { 108428d7b3dSmrg DRI_DISABLED, 109428d7b3dSmrg DRI_NONE, 110428d7b3dSmrg DRI_ACTIVE 111428d7b3dSmrg}; 112428d7b3dSmrg 113428d7b3dSmrgtypedef struct intel_screen_private { 114428d7b3dSmrg ScrnInfoPtr scrn; 115428d7b3dSmrg struct intel_device *dev; 116428d7b3dSmrg int cpp; 117428d7b3dSmrg 118428d7b3dSmrg#define RENDER_BATCH I915_EXEC_RENDER 119428d7b3dSmrg#define BLT_BATCH I915_EXEC_BLT 120428d7b3dSmrg unsigned int current_batch; 121428d7b3dSmrg 122428d7b3dSmrg void *modes; 123428d7b3dSmrg drm_intel_bo *front_buffer, *back_buffer; 124428d7b3dSmrg unsigned int back_name; 125428d7b3dSmrg long front_pitch, front_tiling; 126428d7b3dSmrg 127428d7b3dSmrg dri_bufmgr *bufmgr; 128428d7b3dSmrg 129428d7b3dSmrg#if USE_UXA 130428d7b3dSmrg uint32_t batch_ptr[4096]; 131428d7b3dSmrg /** Byte offset in batch_ptr for the next dword to be emitted. */ 132428d7b3dSmrg unsigned int batch_used; 133428d7b3dSmrg /** Position in batch_ptr at the start of the current BEGIN_BATCH */ 134428d7b3dSmrg unsigned int batch_emit_start; 135428d7b3dSmrg /** Number of bytes to be emitted in the current BEGIN_BATCH. */ 136428d7b3dSmrg uint32_t batch_emitting; 137428d7b3dSmrg dri_bo *batch_bo, *last_batch_bo[2]; 138428d7b3dSmrg /** Whether we're in a section of code that can't tolerate flushing */ 139428d7b3dSmrg Bool in_batch_atomic; 140428d7b3dSmrg /** Ending batch_used that was verified by intel_start_batch_atomic() */ 141428d7b3dSmrg int batch_atomic_limit; 142428d7b3dSmrg struct list batch_pixmaps; 143428d7b3dSmrg drm_intel_bo *wa_scratch_bo; 144428d7b3dSmrg OsTimerPtr cache_expire; 145428d7b3dSmrg#endif 146428d7b3dSmrg 147428d7b3dSmrg /* For Xvideo */ 148428d7b3dSmrg Bool use_overlay; 149428d7b3dSmrg#ifdef INTEL_XVMC 150428d7b3dSmrg /* For XvMC */ 151428d7b3dSmrg Bool XvMCEnabled; 152428d7b3dSmrg#endif 153428d7b3dSmrg 154428d7b3dSmrg CreateScreenResourcesProcPtr CreateScreenResources; 155428d7b3dSmrg 156428d7b3dSmrg Bool shadow_present; 157428d7b3dSmrg 158428d7b3dSmrg unsigned int tiling; 159428d7b3dSmrg#define INTEL_TILING_FB 0x1 160428d7b3dSmrg#define INTEL_TILING_2D 0x2 161428d7b3dSmrg#define INTEL_TILING_3D 0x4 162428d7b3dSmrg#define INTEL_TILING_ALL (~0) 163428d7b3dSmrg 164428d7b3dSmrg Bool swapbuffers_wait; 165428d7b3dSmrg Bool has_relaxed_fencing; 166428d7b3dSmrg 167428d7b3dSmrg int Chipset; 168428d7b3dSmrg EntityInfoPtr pEnt; 169428d7b3dSmrg const struct intel_device_info *info; 170428d7b3dSmrg 171428d7b3dSmrg unsigned int BR[20]; 172428d7b3dSmrg 173428d7b3dSmrg CloseScreenProcPtr CloseScreen; 174428d7b3dSmrg 175428d7b3dSmrg void (*context_switch) (struct intel_screen_private *intel, 176428d7b3dSmrg int new_mode); 177428d7b3dSmrg void (*vertex_flush) (struct intel_screen_private *intel); 178428d7b3dSmrg void (*batch_flush) (struct intel_screen_private *intel); 179428d7b3dSmrg void (*batch_commit_notify) (struct intel_screen_private *intel); 180428d7b3dSmrg 181428d7b3dSmrg#if USE_UXA 182428d7b3dSmrg struct _UxaDriver *uxa_driver; 183428d7b3dSmrg int uxa_flags; 184428d7b3dSmrg#endif 185428d7b3dSmrg Bool need_sync; 186428d7b3dSmrg int accel_pixmap_offset_alignment; 187428d7b3dSmrg int accel_max_x; 188428d7b3dSmrg int accel_max_y; 189428d7b3dSmrg int max_bo_size; 190428d7b3dSmrg int max_gtt_map_size; 191428d7b3dSmrg int max_tiling_size; 192428d7b3dSmrg 193428d7b3dSmrg Bool XvDisabled; /* Xv disabled in PreInit. */ 194428d7b3dSmrg Bool XvEnabled; /* Xv enabled for this generation. */ 195428d7b3dSmrg Bool XvPreferOverlay; 196428d7b3dSmrg 197428d7b3dSmrg int colorKey; 198428d7b3dSmrg XF86VideoAdaptorPtr adaptor; 199428d7b3dSmrg ScreenBlockHandlerProcPtr BlockHandler; 200428d7b3dSmrg Bool overlayOn; 201428d7b3dSmrg 202428d7b3dSmrg struct { 203428d7b3dSmrg drm_intel_bo *gen4_vs_bo; 204428d7b3dSmrg drm_intel_bo *gen4_sf_bo; 205428d7b3dSmrg drm_intel_bo *gen4_wm_packed_bo; 206428d7b3dSmrg drm_intel_bo *gen4_wm_planar_bo; 207428d7b3dSmrg drm_intel_bo *gen4_cc_bo; 208428d7b3dSmrg drm_intel_bo *gen4_cc_vp_bo; 209428d7b3dSmrg drm_intel_bo *gen4_sampler_bo; 210428d7b3dSmrg drm_intel_bo *gen4_sip_kernel_bo; 211428d7b3dSmrg drm_intel_bo *wm_prog_packed_bo; 212428d7b3dSmrg drm_intel_bo *wm_prog_planar_bo; 213428d7b3dSmrg drm_intel_bo *gen6_blend_bo; 214428d7b3dSmrg drm_intel_bo *gen6_depth_stencil_bo; 215428d7b3dSmrg } video; 216428d7b3dSmrg 217428d7b3dSmrg#if USE_UXA 218428d7b3dSmrg /* Render accel state */ 219428d7b3dSmrg float scale_units[2][2]; 220428d7b3dSmrg /** Transform pointers for src/mask, or NULL if identity */ 221428d7b3dSmrg PictTransform *transform[2]; 222428d7b3dSmrg 223428d7b3dSmrg PixmapPtr render_source, render_mask, render_dest; 224428d7b3dSmrg PicturePtr render_source_picture, render_mask_picture, render_dest_picture; 225428d7b3dSmrg Bool needs_3d_invariant; 226428d7b3dSmrg Bool needs_render_state_emit; 227428d7b3dSmrg Bool needs_render_vertex_emit; 228428d7b3dSmrg 229428d7b3dSmrg /* i830 render accel state */ 230428d7b3dSmrg uint32_t render_dest_format; 231428d7b3dSmrg uint32_t cblend, ablend, s8_blendctl; 232428d7b3dSmrg 233428d7b3dSmrg /* i915 render accel state */ 234428d7b3dSmrg PixmapPtr texture[2]; 235428d7b3dSmrg uint32_t mapstate[6]; 236428d7b3dSmrg uint32_t samplerstate[6]; 237428d7b3dSmrg 238428d7b3dSmrg struct { 239428d7b3dSmrg int op; 240428d7b3dSmrg uint32_t dst_format; 241428d7b3dSmrg } i915_render_state; 242428d7b3dSmrg 243428d7b3dSmrg struct { 244428d7b3dSmrg int num_sf_outputs; 245428d7b3dSmrg int drawrect; 246428d7b3dSmrg uint32_t blend; 247428d7b3dSmrg dri_bo *samplers; 248428d7b3dSmrg dri_bo *kernel; 249428d7b3dSmrg } gen6_render_state; 250428d7b3dSmrg 251428d7b3dSmrg uint32_t prim_offset; 252428d7b3dSmrg void (*prim_emit)(struct intel_screen_private *intel, 253428d7b3dSmrg int srcX, int srcY, 254428d7b3dSmrg int maskX, int maskY, 255428d7b3dSmrg int dstX, int dstY, 256428d7b3dSmrg int w, int h); 257428d7b3dSmrg int floats_per_vertex; 258428d7b3dSmrg int last_floats_per_vertex; 259428d7b3dSmrg uint16_t vertex_offset; 260428d7b3dSmrg uint16_t vertex_count; 261428d7b3dSmrg uint16_t vertex_index; 262428d7b3dSmrg uint16_t vertex_used; 263428d7b3dSmrg uint32_t vertex_id; 264428d7b3dSmrg float vertex_ptr[4*1024]; 265428d7b3dSmrg dri_bo *vertex_bo; 266428d7b3dSmrg 267428d7b3dSmrg uint8_t surface_data[16*1024]; 268428d7b3dSmrg uint16_t surface_used; 269428d7b3dSmrg uint16_t surface_table; 270428d7b3dSmrg uint32_t surface_reloc; 271428d7b3dSmrg dri_bo *surface_bo; 272428d7b3dSmrg 273428d7b3dSmrg /* 965 render acceleration state */ 274428d7b3dSmrg struct gen4_render_state *gen4_render_state; 275428d7b3dSmrg#endif 276428d7b3dSmrg 277428d7b3dSmrg /* DRI enabled this generation. */ 278428d7b3dSmrg enum dri_type dri2, dri3; 279428d7b3dSmrg int drmSubFD; 280428d7b3dSmrg char *deviceName; 281428d7b3dSmrg 282428d7b3dSmrg Bool use_pageflipping; 283428d7b3dSmrg Bool use_triple_buffer; 284428d7b3dSmrg Bool force_fallback; 285428d7b3dSmrg Bool has_kernel_flush; 286428d7b3dSmrg Bool needs_flush; 287428d7b3dSmrg 288428d7b3dSmrg struct _DRI2FrameEvent *pending_flip[MAX_PIPES]; 289428d7b3dSmrg 290428d7b3dSmrg /* Broken-out options. */ 291428d7b3dSmrg OptionInfoPtr Options; 292428d7b3dSmrg 293428d7b3dSmrg /* Driver phase/state information */ 294428d7b3dSmrg Bool suspended; 295428d7b3dSmrg 296428d7b3dSmrg enum last_3d last_3d; 297428d7b3dSmrg 298428d7b3dSmrg /** 299428d7b3dSmrg * User option to print acceleration fallback info to the server log. 300428d7b3dSmrg */ 301428d7b3dSmrg Bool fallback_debug; 302428d7b3dSmrg unsigned debug_flush; 303428d7b3dSmrg#if HAVE_UDEV 304428d7b3dSmrg struct udev_monitor *uevent_monitor; 305428d7b3dSmrg pointer uevent_handler; 306428d7b3dSmrg#endif 307428d7b3dSmrg Bool has_prime_vmap_flush; 308428d7b3dSmrg 309428d7b3dSmrg#if HAVE_DRI3 310428d7b3dSmrg SyncScreenFuncsRec save_sync_screen_funcs; 311428d7b3dSmrg#endif 312428d7b3dSmrg void (*flush_rendering)(struct intel_screen_private *intel); 313428d7b3dSmrg} intel_screen_private; 314428d7b3dSmrg 315428d7b3dSmrg#define INTEL_INFO(intel) ((intel)->info) 316428d7b3dSmrg#define IS_GENx(intel, X) (INTEL_INFO(intel)->gen >= 8*(X) && INTEL_INFO(intel)->gen < 8*((X)+1)) 317428d7b3dSmrg#define IS_GEN1(intel) IS_GENx(intel, 1) 318428d7b3dSmrg#define IS_GEN2(intel) IS_GENx(intel, 2) 319428d7b3dSmrg#define IS_GEN3(intel) IS_GENx(intel, 3) 320428d7b3dSmrg#define IS_GEN4(intel) IS_GENx(intel, 4) 321428d7b3dSmrg#define IS_GEN5(intel) IS_GENx(intel, 5) 322428d7b3dSmrg#define IS_GEN6(intel) IS_GENx(intel, 6) 323428d7b3dSmrg#define IS_GEN7(intel) IS_GENx(intel, 7) 324428d7b3dSmrg#define IS_HSW(intel) (INTEL_INFO(intel)->gen == 075) 325428d7b3dSmrg 326428d7b3dSmrg/* Some chips have specific errata (or limits) that we need to workaround. */ 327428d7b3dSmrg#define IS_I830(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_I830_M) 328428d7b3dSmrg#define IS_845G(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_845_G) 329428d7b3dSmrg#define IS_I865G(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_I865_G) 330428d7b3dSmrg 331428d7b3dSmrg#define IS_I915G(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I915_G || intel_get_device_id((intel)->dev) == PCI_CHIP_E7221_G) 332428d7b3dSmrg#define IS_I915GM(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I915_GM) 333428d7b3dSmrg 334428d7b3dSmrg#define IS_965_Q(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I965_Q) 335428d7b3dSmrg 336428d7b3dSmrg/* supports Y tiled surfaces (pre-965 Mesa isn't ready yet) */ 337428d7b3dSmrg#define SUPPORTS_YTILING(pI810) (INTEL_INFO(intel)->gen >= 040) 338428d7b3dSmrg#define HAS_BLT(pI810) (INTEL_INFO(intel)->gen >= 060) 339428d7b3dSmrg 340428d7b3dSmrg#ifndef I915_PARAM_HAS_PRIME_VMAP_FLUSH 341428d7b3dSmrg#define I915_PARAM_HAS_PRIME_VMAP_FLUSH 21 342428d7b3dSmrg#endif 343428d7b3dSmrg 344428d7b3dSmrgenum { 345428d7b3dSmrg DEBUG_FLUSH_BATCHES = 0x1, 346428d7b3dSmrg DEBUG_FLUSH_CACHES = 0x2, 347428d7b3dSmrg DEBUG_FLUSH_WAIT = 0x4, 348428d7b3dSmrg}; 349428d7b3dSmrg 350428d7b3dSmrgextern Bool intel_mode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp); 351428d7b3dSmrgextern void intel_mode_init(struct intel_screen_private *intel); 352428d7b3dSmrgextern void intel_mode_disable_unused_functions(ScrnInfoPtr scrn); 353428d7b3dSmrgextern void intel_mode_remove_fb(intel_screen_private *intel); 354428d7b3dSmrgextern void intel_mode_close(intel_screen_private *intel); 355428d7b3dSmrgextern void intel_mode_fini(intel_screen_private *intel); 356428d7b3dSmrgextern int intel_mode_read_drm_events(intel_screen_private *intel); 357428d7b3dSmrgextern void intel_mode_hotplug(intel_screen_private *intel); 358428d7b3dSmrg 359428d7b3dSmrgtypedef void (*intel_drm_handler_proc)(ScrnInfoPtr scrn, 360428d7b3dSmrg xf86CrtcPtr crtc, 361428d7b3dSmrg uint64_t seq, 362428d7b3dSmrg uint64_t usec, 363428d7b3dSmrg void *data); 364428d7b3dSmrg 365428d7b3dSmrgtypedef void (*intel_drm_abort_proc)(ScrnInfoPtr scrn, 366428d7b3dSmrg xf86CrtcPtr crtc, 367428d7b3dSmrg void *data); 368428d7b3dSmrg 369428d7b3dSmrgextern uint32_t intel_drm_queue_alloc(ScrnInfoPtr scrn, xf86CrtcPtr crtc, void *data, intel_drm_handler_proc handler, intel_drm_abort_proc abort); 370428d7b3dSmrgextern void intel_drm_abort(ScrnInfoPtr scrn, Bool (*match)(void *data, void *match_data), void *match_data); 371428d7b3dSmrg 372428d7b3dSmrgextern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc); 373428d7b3dSmrgextern int intel_crtc_id(xf86CrtcPtr crtc); 374428d7b3dSmrgextern int intel_output_dpms_status(xf86OutputPtr output); 375428d7b3dSmrgextern void intel_copy_fb(ScrnInfoPtr scrn); 376428d7b3dSmrg 377428d7b3dSmrgint 378428d7b3dSmrgintel_get_crtc_msc_ust(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t *msc, uint64_t *ust); 379428d7b3dSmrg 380428d7b3dSmrguint32_t 381428d7b3dSmrgintel_crtc_msc_to_sequence(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t expect); 382428d7b3dSmrg 383428d7b3dSmrguint64_t 384428d7b3dSmrgintel_sequence_to_crtc_msc(xf86CrtcPtr crtc, uint32_t sequence); 385428d7b3dSmrg 386428d7b3dSmrgenum DRI2FrameEventType { 387428d7b3dSmrg DRI2_SWAP, 388428d7b3dSmrg DRI2_SWAP_CHAIN, 389428d7b3dSmrg DRI2_FLIP, 390428d7b3dSmrg DRI2_WAITMSC, 391428d7b3dSmrg}; 392428d7b3dSmrg 393428d7b3dSmrg#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,7,99,3,0) 394428d7b3dSmrgtypedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type, 395428d7b3dSmrg CARD64 ust, CARD64 msc, CARD64 sbc); 396428d7b3dSmrg#endif 397428d7b3dSmrg 398428d7b3dSmrgtypedef void (*intel_pageflip_handler_proc) (uint64_t frame, 399428d7b3dSmrg uint64_t usec, 400428d7b3dSmrg void *data); 401428d7b3dSmrg 402428d7b3dSmrgtypedef void (*intel_pageflip_abort_proc) (void *data); 403428d7b3dSmrg 404428d7b3dSmrgtypedef struct _DRI2FrameEvent { 405428d7b3dSmrg struct intel_screen_private *intel; 406428d7b3dSmrg 407428d7b3dSmrg XID drawable_id; 408428d7b3dSmrg ClientPtr client; 409428d7b3dSmrg enum DRI2FrameEventType type; 410428d7b3dSmrg int frame; 411428d7b3dSmrg int pipe; 412428d7b3dSmrg 413428d7b3dSmrg struct list drawable_resource, client_resource; 414428d7b3dSmrg 415428d7b3dSmrg /* for swaps & flips only */ 416428d7b3dSmrg DRI2SwapEventPtr event_complete; 417428d7b3dSmrg void *event_data; 418428d7b3dSmrg DRI2BufferPtr front; 419428d7b3dSmrg DRI2BufferPtr back; 420428d7b3dSmrg 421428d7b3dSmrg struct _DRI2FrameEvent *chain; 422428d7b3dSmrg} DRI2FrameEventRec, *DRI2FrameEventPtr; 423428d7b3dSmrg 424428d7b3dSmrgextern Bool intel_do_pageflip(intel_screen_private *intel, 425428d7b3dSmrg dri_bo *new_front, 426428d7b3dSmrg int ref_crtc_hw_id, 427428d7b3dSmrg Bool async, 428428d7b3dSmrg void *pageflip_data, 429428d7b3dSmrg intel_pageflip_handler_proc pageflip_handler, 430428d7b3dSmrg intel_pageflip_abort_proc pageflip_abort); 431428d7b3dSmrg 432428d7b3dSmrgstatic inline intel_screen_private * 433428d7b3dSmrgintel_get_screen_private(ScrnInfoPtr scrn) 434428d7b3dSmrg{ 435428d7b3dSmrg return (intel_screen_private *)(scrn->driverPrivate); 436428d7b3dSmrg} 437428d7b3dSmrg 438428d7b3dSmrg#ifndef ARRAY_SIZE 439428d7b3dSmrg#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 440428d7b3dSmrg#endif 441428d7b3dSmrg 442428d7b3dSmrg#ifndef ALIGN 443428d7b3dSmrg#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1)) 444428d7b3dSmrg#endif 445428d7b3dSmrg 446428d7b3dSmrg#ifndef MIN 447428d7b3dSmrg#define MIN(a,b) ((a) < (b) ? (a) : (b)) 448428d7b3dSmrg#endif 449428d7b3dSmrg 450428d7b3dSmrgextern void intel_video_init(ScreenPtr pScreen); 451428d7b3dSmrgextern void intel_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b); 452428d7b3dSmrgextern void intel_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box); 453428d7b3dSmrg 454428d7b3dSmrgextern xf86CrtcPtr intel_covering_crtc(ScrnInfoPtr scrn, BoxPtr box, 455428d7b3dSmrg xf86CrtcPtr desired, BoxPtr crtc_box_ret); 456428d7b3dSmrg 457428d7b3dSmrgBool I830DRI2ScreenInit(ScreenPtr pScreen); 458428d7b3dSmrgvoid I830DRI2CloseScreen(ScreenPtr pScreen); 459428d7b3dSmrgvoid I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, 460428d7b3dSmrg unsigned int tv_usec, DRI2FrameEventPtr flip_info); 461428d7b3dSmrgvoid I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, 462428d7b3dSmrg unsigned int tv_usec, DRI2FrameEventPtr flip_info); 463428d7b3dSmrg 464428d7b3dSmrg/* intel_dri3.c */ 465428d7b3dSmrgBool intel_dri3_screen_init(ScreenPtr screen); 466428d7b3dSmrg 467428d7b3dSmrgextern Bool intel_crtc_on(xf86CrtcPtr crtc); 468428d7b3dSmrgint intel_crtc_to_pipe(xf86CrtcPtr crtc); 469428d7b3dSmrg 470428d7b3dSmrg/* intel_memory.c */ 471428d7b3dSmrgunsigned long intel_get_fence_size(intel_screen_private *intel, unsigned long size); 472428d7b3dSmrgunsigned long intel_get_fence_pitch(intel_screen_private *intel, unsigned long pitch, 473428d7b3dSmrg uint32_t tiling_mode); 474428d7b3dSmrgBool intel_check_display_stride(ScrnInfoPtr scrn, int stride, Bool tiling); 475428d7b3dSmrgvoid intel_set_gem_max_sizes(ScrnInfoPtr scrn); 476428d7b3dSmrg 477428d7b3dSmrgunsigned int 478428d7b3dSmrgintel_compute_size(struct intel_screen_private *intel, 479428d7b3dSmrg int w, int h, int bpp, unsigned usage, 480428d7b3dSmrg uint32_t *tiling, int *stride); 481428d7b3dSmrg 482428d7b3dSmrgdrm_intel_bo *intel_allocate_framebuffer(ScrnInfoPtr scrn, 483428d7b3dSmrg int width, int height, int cpp, 484428d7b3dSmrg int *out_stride, 485428d7b3dSmrg uint32_t *out_tiling); 486428d7b3dSmrg 487428d7b3dSmrgstatic inline PixmapPtr get_drawable_pixmap(DrawablePtr drawable) 488428d7b3dSmrg{ 489428d7b3dSmrg ScreenPtr screen = drawable->pScreen; 490428d7b3dSmrg 491428d7b3dSmrg if (drawable->type == DRAWABLE_PIXMAP) 492428d7b3dSmrg return (PixmapPtr) drawable; 493428d7b3dSmrg else 494428d7b3dSmrg return screen->GetWindowPixmap((WindowPtr) drawable); 495428d7b3dSmrg} 496428d7b3dSmrg 497428d7b3dSmrgstatic inline Bool pixmap_is_scanout(PixmapPtr pixmap) 498428d7b3dSmrg{ 499428d7b3dSmrg ScreenPtr screen = pixmap->drawable.pScreen; 500428d7b3dSmrg 501428d7b3dSmrg return pixmap == screen->GetScreenPixmap(screen); 502428d7b3dSmrg} 503428d7b3dSmrg 504428d7b3dSmrgstatic inline int 505428d7b3dSmrgintel_pixmap_pitch(PixmapPtr pixmap) 506428d7b3dSmrg{ 507428d7b3dSmrg return (unsigned long)pixmap->devKind; 508428d7b3dSmrg} 509428d7b3dSmrg 510428d7b3dSmrg/* 511428d7b3dSmrg * intel_sync.c 512428d7b3dSmrg */ 513428d7b3dSmrg 514428d7b3dSmrg#if HAVE_DRI3 515428d7b3dSmrgBool intel_sync_init(ScreenPtr screen); 516428d7b3dSmrgvoid intel_sync_close(ScreenPtr screen); 517428d7b3dSmrg#else 518428d7b3dSmrgstatic inline Bool intel_sync_init(ScreenPtr screen) { return 0; } 519428d7b3dSmrgstatic inline void intel_sync_close(ScreenPtr screen) { } 520428d7b3dSmrg#endif 521428d7b3dSmrg 522428d7b3dSmrg/* 523428d7b3dSmrg * intel_present.c 524428d7b3dSmrg */ 525428d7b3dSmrg 526428d7b3dSmrg#if 0 527428d7b3dSmrg#define DebugPresent(x) ErrorF x 528428d7b3dSmrg#else 529428d7b3dSmrg#define DebugPresent(x) 530428d7b3dSmrg#endif 531428d7b3dSmrg 532428d7b3dSmrg#if HAVE_PRESENT 533428d7b3dSmrgBool intel_present_screen_init(ScreenPtr screen); 534428d7b3dSmrg#else 535428d7b3dSmrgstatic inline Bool intel_present_screen_init(ScreenPtr screen) { return 0; } 536428d7b3dSmrg#endif 537428d7b3dSmrg 538428d7b3dSmrgdri_bo * 539428d7b3dSmrgintel_get_pixmap_bo(PixmapPtr pixmap); 540428d7b3dSmrg 541428d7b3dSmrgvoid 542428d7b3dSmrgintel_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo); 543428d7b3dSmrg 544428d7b3dSmrgvoid 545428d7b3dSmrgintel_flush(intel_screen_private *intel); 546428d7b3dSmrg 547428d7b3dSmrg#endif /* _I830_H_ */ 548