intel.h revision 42542f5f
103b705cfSriastradh/************************************************************************** 203b705cfSriastradh 303b705cfSriastradhCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 403b705cfSriastradhCopyright © 2002 David Dawes 503b705cfSriastradh 603b705cfSriastradhAll Rights Reserved. 703b705cfSriastradh 803b705cfSriastradhPermission is hereby granted, free of charge, to any person obtaining a 903b705cfSriastradhcopy of this software and associated documentation files (the 1003b705cfSriastradh"Software"), to deal in the Software without restriction, including 1103b705cfSriastradhwithout limitation the rights to use, copy, modify, merge, publish, 1203b705cfSriastradhdistribute, sub license, and/or sell copies of the Software, and to 1303b705cfSriastradhpermit persons to whom the Software is furnished to do so, subject to 1403b705cfSriastradhthe following conditions: 1503b705cfSriastradh 1603b705cfSriastradhThe above copyright notice and this permission notice (including the 1703b705cfSriastradhnext paragraph) shall be included in all copies or substantial portions 1803b705cfSriastradhof the Software. 1903b705cfSriastradh 2003b705cfSriastradhTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2103b705cfSriastradhOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2203b705cfSriastradhMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2303b705cfSriastradhIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 2403b705cfSriastradhANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2503b705cfSriastradhTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2603b705cfSriastradhSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2703b705cfSriastradh 2803b705cfSriastradh**************************************************************************/ 2903b705cfSriastradh 3003b705cfSriastradh/* 3103b705cfSriastradh * Authors: 3203b705cfSriastradh * Keith Whitwell <keith@tungstengraphics.com> 3303b705cfSriastradh * David Dawes <dawes@xfree86.org> 3403b705cfSriastradh * 3503b705cfSriastradh */ 3603b705cfSriastradh 3703b705cfSriastradh#ifdef HAVE_CONFIG_H 3803b705cfSriastradh#include "config.h" 3903b705cfSriastradh#endif 4003b705cfSriastradh 4103b705cfSriastradh#if 0 4203b705cfSriastradh#define I830DEBUG 4303b705cfSriastradh#endif 4403b705cfSriastradh 4503b705cfSriastradh#include <stdint.h> 4603b705cfSriastradh 4703b705cfSriastradh#ifndef REMAP_RESERVED 4803b705cfSriastradh#define REMAP_RESERVED 0 4903b705cfSriastradh#endif 5003b705cfSriastradh 5103b705cfSriastradh#ifndef _I830_H_ 5203b705cfSriastradh#define _I830_H_ 5303b705cfSriastradh 5442542f5fSchristos#include "xorg-server.h" 5503b705cfSriastradh#include "xf86_OSproc.h" 5603b705cfSriastradh#include "compiler.h" 5703b705cfSriastradh#include "xf86Pci.h" 5803b705cfSriastradh#include "xf86Cursor.h" 5903b705cfSriastradh#include "xf86xv.h" 6003b705cfSriastradh#include "xf86Crtc.h" 6103b705cfSriastradh#include "xf86RandR12.h" 6203b705cfSriastradh 6303b705cfSriastradh#include "xorg-server.h" 6403b705cfSriastradh#include <pciaccess.h> 6503b705cfSriastradh 6603b705cfSriastradh#define _XF86DRI_SERVER_ 6742542f5fSchristos#include "drm.h" 6803b705cfSriastradh#include "dri2.h" 6903b705cfSriastradh#include "intel_bufmgr.h" 7003b705cfSriastradh#include "i915_drm.h" 7103b705cfSriastradh 7203b705cfSriastradh#include "intel_driver.h" 7303b705cfSriastradh#include "intel_options.h" 7403b705cfSriastradh#include "intel_list.h" 7503b705cfSriastradh#include "compat-api.h" 7603b705cfSriastradh 7703b705cfSriastradh#if HAVE_UDEV 7803b705cfSriastradh#include <libudev.h> 7903b705cfSriastradh#endif 8003b705cfSriastradh 8142542f5fSchristos#if HAVE_DRI3 8242542f5fSchristos#include "misync.h" 8342542f5fSchristos#endif 8442542f5fSchristos 8503b705cfSriastradh/* remain compatible to xorg-server 1.6 */ 8603b705cfSriastradh#ifndef MONITOR_EDID_COMPLETE_RAWDATA 8703b705cfSriastradh#define MONITOR_EDID_COMPLETE_RAWDATA EDID_COMPLETE_RAWDATA 8803b705cfSriastradh#endif 8903b705cfSriastradh 9003b705cfSriastradh#if XF86_CRTC_VERSION >= 5 9103b705cfSriastradh#define INTEL_PIXMAP_SHARING 1 9203b705cfSriastradh#endif 9303b705cfSriastradh 9442542f5fSchristos#define MAX_PIPES 4 /* consider making all users dynamic */ 9542542f5fSchristos 9603b705cfSriastradhstruct intel_pixmap { 9703b705cfSriastradh dri_bo *bo; 9803b705cfSriastradh 9903b705cfSriastradh struct list batch; 10003b705cfSriastradh 10103b705cfSriastradh uint16_t stride; 10203b705cfSriastradh uint8_t tiling; 10303b705cfSriastradh int8_t busy :2; 10403b705cfSriastradh uint8_t dirty :1; 10503b705cfSriastradh uint8_t offscreen :1; 10642542f5fSchristos uint8_t pinned :5; 10703b705cfSriastradh#define PIN_SCANOUT 0x1 10842542f5fSchristos#define PIN_DRI2 0x2 10942542f5fSchristos#define PIN_DRI3 0x4 11042542f5fSchristos#define PIN_PRIME 0x8 11142542f5fSchristos#define PIN_GLAMOR 0x10 11203b705cfSriastradh}; 11303b705cfSriastradh 11403b705cfSriastradh#if HAS_DEVPRIVATEKEYREC 11503b705cfSriastradhextern DevPrivateKeyRec uxa_pixmap_index; 11603b705cfSriastradh#else 11703b705cfSriastradhextern int uxa_pixmap_index; 11803b705cfSriastradh#endif 11903b705cfSriastradh 12003b705cfSriastradhstatic inline struct intel_pixmap *intel_get_pixmap_private(PixmapPtr pixmap) 12103b705cfSriastradh{ 12203b705cfSriastradh#if HAS_DEVPRIVATEKEYREC 12303b705cfSriastradh return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index); 12403b705cfSriastradh#else 12503b705cfSriastradh return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index); 12603b705cfSriastradh#endif 12703b705cfSriastradh} 12803b705cfSriastradh 12903b705cfSriastradhstatic inline Bool intel_pixmap_is_busy(struct intel_pixmap *priv) 13003b705cfSriastradh{ 13103b705cfSriastradh if (priv->busy == -1) 13203b705cfSriastradh priv->busy = drm_intel_bo_busy(priv->bo); 13303b705cfSriastradh return priv->busy; 13403b705cfSriastradh} 13503b705cfSriastradh 13603b705cfSriastradhstatic inline void intel_set_pixmap_private(PixmapPtr pixmap, struct intel_pixmap *intel) 13703b705cfSriastradh{ 13803b705cfSriastradh dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, intel); 13903b705cfSriastradh} 14003b705cfSriastradh 14103b705cfSriastradhstatic inline Bool intel_pixmap_is_dirty(PixmapPtr pixmap) 14203b705cfSriastradh{ 14303b705cfSriastradh return pixmap && intel_get_pixmap_private(pixmap)->dirty; 14403b705cfSriastradh} 14503b705cfSriastradh 14603b705cfSriastradhstatic inline Bool intel_pixmap_tiled(PixmapPtr pixmap) 14703b705cfSriastradh{ 14803b705cfSriastradh return intel_get_pixmap_private(pixmap)->tiling != I915_TILING_NONE; 14903b705cfSriastradh} 15003b705cfSriastradh 15103b705cfSriastradhdri_bo *intel_get_pixmap_bo(PixmapPtr pixmap); 15203b705cfSriastradhvoid intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo); 15303b705cfSriastradh 15403b705cfSriastradh#include "common.h" 15503b705cfSriastradh 15603b705cfSriastradh#define PITCH_NONE 0 15703b705cfSriastradh 15803b705cfSriastradh/** enumeration of 3d consumers so some can maintain invariant state. */ 15903b705cfSriastradhenum last_3d { 16003b705cfSriastradh LAST_3D_OTHER, 16103b705cfSriastradh LAST_3D_VIDEO, 16203b705cfSriastradh LAST_3D_RENDER, 16303b705cfSriastradh LAST_3D_ROTATION 16403b705cfSriastradh}; 16503b705cfSriastradh 16603b705cfSriastradhenum dri_type { 16703b705cfSriastradh DRI_DISABLED, 16803b705cfSriastradh DRI_NONE, 16942542f5fSchristos DRI_ACTIVE 17003b705cfSriastradh}; 17103b705cfSriastradh 17203b705cfSriastradhtypedef struct intel_screen_private { 17303b705cfSriastradh ScrnInfoPtr scrn; 17403b705cfSriastradh int cpp; 17503b705cfSriastradh 17603b705cfSriastradh#define RENDER_BATCH I915_EXEC_RENDER 17703b705cfSriastradh#define BLT_BATCH I915_EXEC_BLT 17803b705cfSriastradh unsigned int current_batch; 17903b705cfSriastradh 18003b705cfSriastradh void *modes; 18103b705cfSriastradh drm_intel_bo *front_buffer, *back_buffer; 18203b705cfSriastradh PixmapPtr back_pixmap; 18303b705cfSriastradh unsigned int back_name; 18403b705cfSriastradh long front_pitch, front_tiling; 18503b705cfSriastradh 18603b705cfSriastradh dri_bufmgr *bufmgr; 18703b705cfSriastradh 18803b705cfSriastradh uint32_t batch_ptr[4096]; 18903b705cfSriastradh /** Byte offset in batch_ptr for the next dword to be emitted. */ 19003b705cfSriastradh unsigned int batch_used; 19103b705cfSriastradh /** Position in batch_ptr at the start of the current BEGIN_BATCH */ 19203b705cfSriastradh unsigned int batch_emit_start; 19303b705cfSriastradh /** Number of bytes to be emitted in the current BEGIN_BATCH. */ 19403b705cfSriastradh uint32_t batch_emitting; 19503b705cfSriastradh dri_bo *batch_bo, *last_batch_bo[2]; 19603b705cfSriastradh /** Whether we're in a section of code that can't tolerate flushing */ 19703b705cfSriastradh Bool in_batch_atomic; 19803b705cfSriastradh /** Ending batch_used that was verified by intel_start_batch_atomic() */ 19903b705cfSriastradh int batch_atomic_limit; 20003b705cfSriastradh struct list batch_pixmaps; 20103b705cfSriastradh drm_intel_bo *wa_scratch_bo; 20203b705cfSriastradh OsTimerPtr cache_expire; 20303b705cfSriastradh 20403b705cfSriastradh /* For Xvideo */ 20503b705cfSriastradh Bool use_overlay; 20603b705cfSriastradh#ifdef INTEL_XVMC 20703b705cfSriastradh /* For XvMC */ 20803b705cfSriastradh Bool XvMCEnabled; 20903b705cfSriastradh#endif 21003b705cfSriastradh 21103b705cfSriastradh CreateScreenResourcesProcPtr CreateScreenResources; 21203b705cfSriastradh 21303b705cfSriastradh Bool shadow_present; 21403b705cfSriastradh 21503b705cfSriastradh unsigned int tiling; 21603b705cfSriastradh#define INTEL_TILING_FB 0x1 21703b705cfSriastradh#define INTEL_TILING_2D 0x2 21803b705cfSriastradh#define INTEL_TILING_3D 0x4 21903b705cfSriastradh#define INTEL_TILING_ALL (~0) 22003b705cfSriastradh 22103b705cfSriastradh Bool swapbuffers_wait; 22203b705cfSriastradh Bool has_relaxed_fencing; 22303b705cfSriastradh 22403b705cfSriastradh int Chipset; 22503b705cfSriastradh EntityInfoPtr pEnt; 22603b705cfSriastradh struct pci_device *PciInfo; 22703b705cfSriastradh const struct intel_device_info *info; 22803b705cfSriastradh 22903b705cfSriastradh unsigned int BR[20]; 23003b705cfSriastradh 23103b705cfSriastradh CloseScreenProcPtr CloseScreen; 23203b705cfSriastradh 23303b705cfSriastradh void (*context_switch) (struct intel_screen_private *intel, 23403b705cfSriastradh int new_mode); 23503b705cfSriastradh void (*vertex_flush) (struct intel_screen_private *intel); 23603b705cfSriastradh void (*batch_flush) (struct intel_screen_private *intel); 23703b705cfSriastradh void (*batch_commit_notify) (struct intel_screen_private *intel); 23803b705cfSriastradh 23903b705cfSriastradh struct _UxaDriver *uxa_driver; 24003b705cfSriastradh int uxa_flags; 24103b705cfSriastradh Bool need_sync; 24203b705cfSriastradh int accel_pixmap_offset_alignment; 24303b705cfSriastradh int accel_max_x; 24403b705cfSriastradh int accel_max_y; 24503b705cfSriastradh int max_bo_size; 24603b705cfSriastradh int max_gtt_map_size; 24703b705cfSriastradh int max_tiling_size; 24803b705cfSriastradh 24903b705cfSriastradh Bool XvDisabled; /* Xv disabled in PreInit. */ 25003b705cfSriastradh Bool XvEnabled; /* Xv enabled for this generation. */ 25103b705cfSriastradh Bool XvPreferOverlay; 25203b705cfSriastradh 25303b705cfSriastradh int colorKey; 25403b705cfSriastradh XF86VideoAdaptorPtr adaptor; 25503b705cfSriastradh ScreenBlockHandlerProcPtr BlockHandler; 25603b705cfSriastradh Bool overlayOn; 25703b705cfSriastradh 25803b705cfSriastradh struct { 25903b705cfSriastradh drm_intel_bo *gen4_vs_bo; 26003b705cfSriastradh drm_intel_bo *gen4_sf_bo; 26103b705cfSriastradh drm_intel_bo *gen4_wm_packed_bo; 26203b705cfSriastradh drm_intel_bo *gen4_wm_planar_bo; 26303b705cfSriastradh drm_intel_bo *gen4_cc_bo; 26403b705cfSriastradh drm_intel_bo *gen4_cc_vp_bo; 26503b705cfSriastradh drm_intel_bo *gen4_sampler_bo; 26603b705cfSriastradh drm_intel_bo *gen4_sip_kernel_bo; 26703b705cfSriastradh drm_intel_bo *wm_prog_packed_bo; 26803b705cfSriastradh drm_intel_bo *wm_prog_planar_bo; 26903b705cfSriastradh drm_intel_bo *gen6_blend_bo; 27003b705cfSriastradh drm_intel_bo *gen6_depth_stencil_bo; 27103b705cfSriastradh } video; 27203b705cfSriastradh 27303b705cfSriastradh /* Render accel state */ 27403b705cfSriastradh float scale_units[2][2]; 27503b705cfSriastradh /** Transform pointers for src/mask, or NULL if identity */ 27603b705cfSriastradh PictTransform *transform[2]; 27703b705cfSriastradh 27803b705cfSriastradh PixmapPtr render_source, render_mask, render_dest; 27903b705cfSriastradh PicturePtr render_source_picture, render_mask_picture, render_dest_picture; 28003b705cfSriastradh Bool needs_3d_invariant; 28103b705cfSriastradh Bool needs_render_state_emit; 28203b705cfSriastradh Bool needs_render_vertex_emit; 28303b705cfSriastradh 28403b705cfSriastradh /* i830 render accel state */ 28503b705cfSriastradh uint32_t render_dest_format; 28603b705cfSriastradh uint32_t cblend, ablend, s8_blendctl; 28703b705cfSriastradh 28803b705cfSriastradh /* i915 render accel state */ 28903b705cfSriastradh PixmapPtr texture[2]; 29003b705cfSriastradh uint32_t mapstate[6]; 29103b705cfSriastradh uint32_t samplerstate[6]; 29203b705cfSriastradh 29303b705cfSriastradh struct { 29403b705cfSriastradh int op; 29503b705cfSriastradh uint32_t dst_format; 29603b705cfSriastradh } i915_render_state; 29703b705cfSriastradh 29803b705cfSriastradh struct { 29903b705cfSriastradh int num_sf_outputs; 30003b705cfSriastradh int drawrect; 30103b705cfSriastradh uint32_t blend; 30203b705cfSriastradh dri_bo *samplers; 30303b705cfSriastradh dri_bo *kernel; 30403b705cfSriastradh } gen6_render_state; 30503b705cfSriastradh 30603b705cfSriastradh uint32_t prim_offset; 30703b705cfSriastradh void (*prim_emit)(struct intel_screen_private *intel, 30803b705cfSriastradh int srcX, int srcY, 30903b705cfSriastradh int maskX, int maskY, 31003b705cfSriastradh int dstX, int dstY, 31103b705cfSriastradh int w, int h); 31203b705cfSriastradh int floats_per_vertex; 31303b705cfSriastradh int last_floats_per_vertex; 31403b705cfSriastradh uint16_t vertex_offset; 31503b705cfSriastradh uint16_t vertex_count; 31603b705cfSriastradh uint16_t vertex_index; 31703b705cfSriastradh uint16_t vertex_used; 31803b705cfSriastradh uint32_t vertex_id; 31903b705cfSriastradh float vertex_ptr[4*1024]; 32003b705cfSriastradh dri_bo *vertex_bo; 32103b705cfSriastradh 32203b705cfSriastradh uint8_t surface_data[16*1024]; 32303b705cfSriastradh uint16_t surface_used; 32403b705cfSriastradh uint16_t surface_table; 32503b705cfSriastradh uint32_t surface_reloc; 32603b705cfSriastradh dri_bo *surface_bo; 32703b705cfSriastradh 32803b705cfSriastradh /* 965 render acceleration state */ 32903b705cfSriastradh struct gen4_render_state *gen4_render_state; 33003b705cfSriastradh 33142542f5fSchristos /* DRI enabled this generation. */ 33242542f5fSchristos enum dri_type dri2, dri3; 33303b705cfSriastradh int drmSubFD; 33403b705cfSriastradh char *deviceName; 33503b705cfSriastradh 33603b705cfSriastradh Bool use_pageflipping; 33703b705cfSriastradh Bool use_triple_buffer; 33803b705cfSriastradh Bool force_fallback; 33903b705cfSriastradh Bool has_kernel_flush; 34003b705cfSriastradh Bool needs_flush; 34103b705cfSriastradh 34242542f5fSchristos struct _DRI2FrameEvent *pending_flip[MAX_PIPES]; 34303b705cfSriastradh 34403b705cfSriastradh /* Broken-out options. */ 34503b705cfSriastradh OptionInfoPtr Options; 34603b705cfSriastradh 34703b705cfSriastradh /* Driver phase/state information */ 34803b705cfSriastradh Bool suspended; 34903b705cfSriastradh 35003b705cfSriastradh enum last_3d last_3d; 35103b705cfSriastradh 35203b705cfSriastradh /** 35303b705cfSriastradh * User option to print acceleration fallback info to the server log. 35403b705cfSriastradh */ 35503b705cfSriastradh Bool fallback_debug; 35603b705cfSriastradh unsigned debug_flush; 35703b705cfSriastradh#if HAVE_UDEV 35803b705cfSriastradh struct udev_monitor *uevent_monitor; 35942542f5fSchristos pointer uevent_handler; 36003b705cfSriastradh#endif 36103b705cfSriastradh Bool has_prime_vmap_flush; 36242542f5fSchristos 36342542f5fSchristos#if HAVE_DRI3 36442542f5fSchristos SyncScreenFuncsRec save_sync_screen_funcs; 36542542f5fSchristos#endif 36642542f5fSchristos void (*flush_rendering)(struct intel_screen_private *intel); 36703b705cfSriastradh} intel_screen_private; 36803b705cfSriastradh 36903b705cfSriastradh#define INTEL_INFO(intel) ((intel)->info) 37003b705cfSriastradh#define IS_GENx(intel, X) (INTEL_INFO(intel)->gen >= 8*(X) && INTEL_INFO(intel)->gen < 8*((X)+1)) 37103b705cfSriastradh#define IS_GEN1(intel) IS_GENx(intel, 1) 37203b705cfSriastradh#define IS_GEN2(intel) IS_GENx(intel, 2) 37303b705cfSriastradh#define IS_GEN3(intel) IS_GENx(intel, 3) 37403b705cfSriastradh#define IS_GEN4(intel) IS_GENx(intel, 4) 37503b705cfSriastradh#define IS_GEN5(intel) IS_GENx(intel, 5) 37603b705cfSriastradh#define IS_GEN6(intel) IS_GENx(intel, 6) 37703b705cfSriastradh#define IS_GEN7(intel) IS_GENx(intel, 7) 37803b705cfSriastradh#define IS_HSW(intel) (INTEL_INFO(intel)->gen == 075) 37903b705cfSriastradh 38003b705cfSriastradh/* Some chips have specific errata (or limits) that we need to workaround. */ 38103b705cfSriastradh#define IS_I830(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I830_M) 38203b705cfSriastradh#define IS_845G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_845_G) 38303b705cfSriastradh#define IS_I865G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I865_G) 38403b705cfSriastradh 38503b705cfSriastradh#define IS_I915G(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_G || (intel)->PciInfo->device_id == PCI_CHIP_E7221_G) 38603b705cfSriastradh#define IS_I915GM(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_GM) 38703b705cfSriastradh 38803b705cfSriastradh#define IS_965_Q(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I965_Q) 38903b705cfSriastradh 39003b705cfSriastradh/* supports Y tiled surfaces (pre-965 Mesa isn't ready yet) */ 39103b705cfSriastradh#define SUPPORTS_YTILING(pI810) (INTEL_INFO(intel)->gen >= 040) 39203b705cfSriastradh#define HAS_BLT(pI810) (INTEL_INFO(intel)->gen >= 060) 39303b705cfSriastradh 39403b705cfSriastradh#ifndef I915_PARAM_HAS_PRIME_VMAP_FLUSH 39503b705cfSriastradh#define I915_PARAM_HAS_PRIME_VMAP_FLUSH 21 39603b705cfSriastradh#endif 39703b705cfSriastradh 39803b705cfSriastradhenum { 39903b705cfSriastradh DEBUG_FLUSH_BATCHES = 0x1, 40003b705cfSriastradh DEBUG_FLUSH_CACHES = 0x2, 40103b705cfSriastradh DEBUG_FLUSH_WAIT = 0x4, 40203b705cfSriastradh}; 40303b705cfSriastradh 40403b705cfSriastradhextern Bool intel_mode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp); 40503b705cfSriastradhextern void intel_mode_init(struct intel_screen_private *intel); 40603b705cfSriastradhextern void intel_mode_disable_unused_functions(ScrnInfoPtr scrn); 40703b705cfSriastradhextern void intel_mode_remove_fb(intel_screen_private *intel); 40803b705cfSriastradhextern void intel_mode_close(intel_screen_private *intel); 40903b705cfSriastradhextern void intel_mode_fini(intel_screen_private *intel); 41042542f5fSchristosextern int intel_mode_read_drm_events(intel_screen_private *intel); 41142542f5fSchristosextern void intel_mode_hotplug(intel_screen_private *intel); 41242542f5fSchristos 41342542f5fSchristostypedef void (*intel_drm_handler_proc)(ScrnInfoPtr scrn, 41442542f5fSchristos xf86CrtcPtr crtc, 41542542f5fSchristos uint64_t seq, 41642542f5fSchristos uint64_t usec, 41742542f5fSchristos void *data); 41842542f5fSchristos 41942542f5fSchristostypedef void (*intel_drm_abort_proc)(ScrnInfoPtr scrn, 42042542f5fSchristos xf86CrtcPtr crtc, 42142542f5fSchristos void *data); 42242542f5fSchristos 42342542f5fSchristosextern uint32_t intel_drm_queue_alloc(ScrnInfoPtr scrn, xf86CrtcPtr crtc, void *data, intel_drm_handler_proc handler, intel_drm_abort_proc abort); 42442542f5fSchristosextern void intel_drm_abort(ScrnInfoPtr scrn, Bool (*match)(void *data, void *match_data), void *match_data); 42503b705cfSriastradh 42603b705cfSriastradhextern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc); 42703b705cfSriastradhextern int intel_crtc_id(xf86CrtcPtr crtc); 42803b705cfSriastradhextern int intel_output_dpms_status(xf86OutputPtr output); 42903b705cfSriastradhextern void intel_copy_fb(ScrnInfoPtr scrn); 43003b705cfSriastradh 43142542f5fSchristosint 43242542f5fSchristosintel_get_crtc_msc_ust(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t *msc, uint64_t *ust); 43342542f5fSchristos 43442542f5fSchristosuint32_t 43542542f5fSchristosintel_crtc_msc_to_sequence(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t expect); 43642542f5fSchristos 43742542f5fSchristosuint64_t 43842542f5fSchristosintel_sequence_to_crtc_msc(xf86CrtcPtr crtc, uint32_t sequence); 43942542f5fSchristos 44003b705cfSriastradhenum DRI2FrameEventType { 44103b705cfSriastradh DRI2_SWAP, 44203b705cfSriastradh DRI2_SWAP_CHAIN, 44303b705cfSriastradh DRI2_FLIP, 44403b705cfSriastradh DRI2_WAITMSC, 44503b705cfSriastradh}; 44603b705cfSriastradh 44703b705cfSriastradh#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,7,99,3,0) 44803b705cfSriastradhtypedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type, 44903b705cfSriastradh CARD64 ust, CARD64 msc, CARD64 sbc); 45003b705cfSriastradh#endif 45103b705cfSriastradh 45242542f5fSchristostypedef void (*intel_pageflip_handler_proc) (uint64_t frame, 45342542f5fSchristos uint64_t usec, 45442542f5fSchristos void *data); 45542542f5fSchristos 45642542f5fSchristostypedef void (*intel_pageflip_abort_proc) (void *data); 45742542f5fSchristos 45803b705cfSriastradhtypedef struct _DRI2FrameEvent { 45903b705cfSriastradh struct intel_screen_private *intel; 46003b705cfSriastradh 46103b705cfSriastradh XID drawable_id; 46203b705cfSriastradh ClientPtr client; 46303b705cfSriastradh enum DRI2FrameEventType type; 46403b705cfSriastradh int frame; 46503b705cfSriastradh int pipe; 46603b705cfSriastradh 46703b705cfSriastradh struct list drawable_resource, client_resource; 46803b705cfSriastradh 46903b705cfSriastradh /* for swaps & flips only */ 47003b705cfSriastradh DRI2SwapEventPtr event_complete; 47103b705cfSriastradh void *event_data; 47203b705cfSriastradh DRI2BufferPtr front; 47303b705cfSriastradh DRI2BufferPtr back; 47403b705cfSriastradh 47503b705cfSriastradh struct _DRI2FrameEvent *chain; 47603b705cfSriastradh} DRI2FrameEventRec, *DRI2FrameEventPtr; 47703b705cfSriastradh 47803b705cfSriastradhextern Bool intel_do_pageflip(intel_screen_private *intel, 47903b705cfSriastradh dri_bo *new_front, 48042542f5fSchristos int ref_crtc_hw_id, 48142542f5fSchristos Bool async, 48242542f5fSchristos void *pageflip_data, 48342542f5fSchristos intel_pageflip_handler_proc pageflip_handler, 48442542f5fSchristos intel_pageflip_abort_proc pageflip_abort); 48503b705cfSriastradh 48603b705cfSriastradhstatic inline intel_screen_private * 48703b705cfSriastradhintel_get_screen_private(ScrnInfoPtr scrn) 48803b705cfSriastradh{ 48903b705cfSriastradh return (intel_screen_private *)(scrn->driverPrivate); 49003b705cfSriastradh} 49103b705cfSriastradh 49203b705cfSriastradh#ifndef ARRAY_SIZE 49303b705cfSriastradh#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 49403b705cfSriastradh#endif 49503b705cfSriastradh 49603b705cfSriastradh#ifndef ALIGN 49703b705cfSriastradh#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1)) 49803b705cfSriastradh#endif 49903b705cfSriastradh 50003b705cfSriastradh#ifndef MIN 50103b705cfSriastradh#define MIN(a,b) ((a) < (b) ? (a) : (b)) 50203b705cfSriastradh#endif 50303b705cfSriastradh 50403b705cfSriastradhstatic inline unsigned long intel_pixmap_pitch(PixmapPtr pixmap) 50503b705cfSriastradh{ 50603b705cfSriastradh return (unsigned long)pixmap->devKind; 50703b705cfSriastradh} 50803b705cfSriastradh 50903b705cfSriastradh/* Batchbuffer support macros and functions */ 51003b705cfSriastradh#include "intel_batchbuffer.h" 51103b705cfSriastradh 51203b705cfSriastradh/* I830 specific functions */ 51303b705cfSriastradhextern void IntelEmitInvarientState(ScrnInfoPtr scrn); 51403b705cfSriastradhextern void I830EmitInvarientState(ScrnInfoPtr scrn); 51503b705cfSriastradhextern void I915EmitInvarientState(ScrnInfoPtr scrn); 51603b705cfSriastradh 51703b705cfSriastradhextern void I830EmitFlush(ScrnInfoPtr scrn); 51803b705cfSriastradh 51903b705cfSriastradhextern void I830InitVideo(ScreenPtr pScreen); 52003b705cfSriastradhextern xf86CrtcPtr intel_covering_crtc(ScrnInfoPtr scrn, BoxPtr box, 52103b705cfSriastradh xf86CrtcPtr desired, BoxPtr crtc_box_ret); 52203b705cfSriastradh 52303b705cfSriastradhBool I830DRI2ScreenInit(ScreenPtr pScreen); 52403b705cfSriastradhvoid I830DRI2CloseScreen(ScreenPtr pScreen); 52503b705cfSriastradhvoid I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, 52603b705cfSriastradh unsigned int tv_usec, DRI2FrameEventPtr flip_info); 52703b705cfSriastradhvoid I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, 52803b705cfSriastradh unsigned int tv_usec, DRI2FrameEventPtr flip_info); 52903b705cfSriastradh 53042542f5fSchristos/* intel_dri3.c */ 53142542f5fSchristosBool intel_dri3_screen_init(ScreenPtr screen); 53242542f5fSchristos 53303b705cfSriastradhextern Bool intel_crtc_on(xf86CrtcPtr crtc); 53403b705cfSriastradhint intel_crtc_to_pipe(xf86CrtcPtr crtc); 53503b705cfSriastradh 53603b705cfSriastradh/* intel_memory.c */ 53703b705cfSriastradhunsigned long intel_get_fence_size(intel_screen_private *intel, unsigned long size); 53803b705cfSriastradhunsigned long intel_get_fence_pitch(intel_screen_private *intel, unsigned long pitch, 53903b705cfSriastradh uint32_t tiling_mode); 54042542f5fSchristosBool intel_check_display_stride(ScrnInfoPtr scrn, int stride, Bool tiling); 54142542f5fSchristosvoid intel_set_gem_max_sizes(ScrnInfoPtr scrn); 54203b705cfSriastradh 54303b705cfSriastradhdrm_intel_bo *intel_allocate_framebuffer(ScrnInfoPtr scrn, 54442542f5fSchristos int width, int height, int cpp, 54542542f5fSchristos int *out_stride, 54642542f5fSchristos uint32_t *out_tiling); 54703b705cfSriastradh 54803b705cfSriastradh/* i830_render.c */ 54903b705cfSriastradhBool i830_check_composite(int op, 55003b705cfSriastradh PicturePtr sourcec, PicturePtr mask, PicturePtr dest, 55103b705cfSriastradh int width, int height); 55203b705cfSriastradhBool i830_check_composite_target(PixmapPtr pixmap); 55303b705cfSriastradhBool i830_check_composite_texture(ScreenPtr screen, PicturePtr picture); 55403b705cfSriastradhBool i830_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask, 55503b705cfSriastradh PicturePtr dest, PixmapPtr sourcecPixmap, 55603b705cfSriastradh PixmapPtr maskPixmap, PixmapPtr destPixmap); 55703b705cfSriastradhvoid i830_composite(PixmapPtr dest, int srcX, int srcY, 55803b705cfSriastradh int maskX, int maskY, int dstX, int dstY, int w, int h); 55903b705cfSriastradhvoid i830_vertex_flush(intel_screen_private *intel); 56003b705cfSriastradh 56103b705cfSriastradh/* i915_render.c */ 56203b705cfSriastradhBool i915_check_composite(int op, 56303b705cfSriastradh PicturePtr sourcec, PicturePtr mask, PicturePtr dest, 56403b705cfSriastradh int width, int height); 56503b705cfSriastradhBool i915_check_composite_target(PixmapPtr pixmap); 56603b705cfSriastradhBool i915_check_composite_texture(ScreenPtr screen, PicturePtr picture); 56703b705cfSriastradhBool i915_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask, 56803b705cfSriastradh PicturePtr dest, PixmapPtr sourcecPixmap, 56903b705cfSriastradh PixmapPtr maskPixmap, PixmapPtr destPixmap); 57003b705cfSriastradhvoid i915_composite(PixmapPtr dest, int srcX, int srcY, 57103b705cfSriastradh int maskX, int maskY, int dstX, int dstY, int w, int h); 57203b705cfSriastradhvoid i915_vertex_flush(intel_screen_private *intel); 57303b705cfSriastradhvoid i915_batch_commit_notify(intel_screen_private *intel); 57403b705cfSriastradhvoid i830_batch_commit_notify(intel_screen_private *intel); 57503b705cfSriastradh/* i965_render.c */ 57603b705cfSriastradhunsigned int gen4_render_state_size(ScrnInfoPtr scrn); 57703b705cfSriastradhvoid gen4_render_state_init(ScrnInfoPtr scrn); 57803b705cfSriastradhvoid gen4_render_state_cleanup(ScrnInfoPtr scrn); 57903b705cfSriastradhBool i965_check_composite(int op, 58003b705cfSriastradh PicturePtr sourcec, PicturePtr mask, PicturePtr dest, 58103b705cfSriastradh int width, int height); 58203b705cfSriastradhBool i965_check_composite_texture(ScreenPtr screen, PicturePtr picture); 58303b705cfSriastradhBool i965_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask, 58403b705cfSriastradh PicturePtr dest, PixmapPtr sourcecPixmap, 58503b705cfSriastradh PixmapPtr maskPixmap, PixmapPtr destPixmap); 58603b705cfSriastradhvoid i965_composite(PixmapPtr dest, int srcX, int srcY, 58703b705cfSriastradh int maskX, int maskY, int dstX, int dstY, int w, int h); 58803b705cfSriastradh 58903b705cfSriastradhvoid i965_vertex_flush(intel_screen_private *intel); 59003b705cfSriastradhvoid i965_batch_flush(intel_screen_private *intel); 59103b705cfSriastradhvoid i965_batch_commit_notify(intel_screen_private *intel); 59203b705cfSriastradh 59303b705cfSriastradh/* i965_3d.c */ 59403b705cfSriastradhvoid gen6_upload_invariant_states(intel_screen_private *intel); 59503b705cfSriastradhvoid gen6_upload_viewport_state_pointers(intel_screen_private *intel, 59603b705cfSriastradh drm_intel_bo *cc_vp_bo); 59703b705cfSriastradhvoid gen7_upload_viewport_state_pointers(intel_screen_private *intel, 59803b705cfSriastradh drm_intel_bo *cc_vp_bo); 59903b705cfSriastradhvoid gen6_upload_urb(intel_screen_private *intel); 60003b705cfSriastradhvoid gen7_upload_urb(intel_screen_private *intel); 60103b705cfSriastradhvoid gen6_upload_cc_state_pointers(intel_screen_private *intel, 60203b705cfSriastradh drm_intel_bo *blend_bo, drm_intel_bo *cc_bo, 60303b705cfSriastradh drm_intel_bo *depth_stencil_bo, 60403b705cfSriastradh uint32_t blend_offset); 60503b705cfSriastradhvoid gen7_upload_cc_state_pointers(intel_screen_private *intel, 60603b705cfSriastradh drm_intel_bo *blend_bo, drm_intel_bo *cc_bo, 60703b705cfSriastradh drm_intel_bo *depth_stencil_bo, 60803b705cfSriastradh uint32_t blend_offset); 60903b705cfSriastradhvoid gen6_upload_sampler_state_pointers(intel_screen_private *intel, 61003b705cfSriastradh drm_intel_bo *sampler_bo); 61103b705cfSriastradhvoid gen7_upload_sampler_state_pointers(intel_screen_private *intel, 61203b705cfSriastradh drm_intel_bo *sampler_bo); 61303b705cfSriastradhvoid gen7_upload_bypass_states(intel_screen_private *intel); 61403b705cfSriastradhvoid gen6_upload_gs_state(intel_screen_private *intel); 61503b705cfSriastradhvoid gen6_upload_vs_state(intel_screen_private *intel); 61603b705cfSriastradhvoid gen6_upload_clip_state(intel_screen_private *intel); 61703b705cfSriastradhvoid gen6_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset); 61803b705cfSriastradhvoid gen7_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset); 61903b705cfSriastradhvoid gen6_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset); 62003b705cfSriastradhvoid gen7_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset); 62103b705cfSriastradhvoid gen6_upload_depth_buffer_state(intel_screen_private *intel); 62203b705cfSriastradhvoid gen7_upload_depth_buffer_state(intel_screen_private *intel); 62303b705cfSriastradh 62403b705cfSriastradhBool intel_transform_is_affine(PictTransformPtr t); 62503b705cfSriastradhBool 62603b705cfSriastradhintel_get_transformed_coordinates(int x, int y, PictTransformPtr transform, 62703b705cfSriastradh float *x_out, float *y_out); 62803b705cfSriastradh 62903b705cfSriastradhBool 63003b705cfSriastradhintel_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform, 63103b705cfSriastradh float *x_out, float *y_out, float *z_out); 63203b705cfSriastradh 63303b705cfSriastradhstatic inline void 63403b705cfSriastradhintel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...) _X_ATTRIBUTE_PRINTF(2, 3); 63503b705cfSriastradh 63603b705cfSriastradhstatic inline void 63703b705cfSriastradhintel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...) 63803b705cfSriastradh{ 63903b705cfSriastradh intel_screen_private *intel = intel_get_screen_private(scrn); 64003b705cfSriastradh va_list ap; 64103b705cfSriastradh 64203b705cfSriastradh va_start(ap, format); 64303b705cfSriastradh if (intel->fallback_debug) { 64403b705cfSriastradh xf86DrvMsg(scrn->scrnIndex, X_INFO, "fallback: "); 64503b705cfSriastradh LogVMessageVerb(X_INFO, 1, format, ap); 64603b705cfSriastradh } 64703b705cfSriastradh va_end(ap); 64803b705cfSriastradh} 64903b705cfSriastradh 65003b705cfSriastradhstatic inline Bool 65103b705cfSriastradhintel_check_pitch_2d(PixmapPtr pixmap) 65203b705cfSriastradh{ 65303b705cfSriastradh uint32_t pitch = intel_pixmap_pitch(pixmap); 65403b705cfSriastradh if (pitch > KB(32)) { 65503b705cfSriastradh ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); 65603b705cfSriastradh intel_debug_fallback(scrn, "pitch exceeds 2d limit 32K\n"); 65703b705cfSriastradh return FALSE; 65803b705cfSriastradh } 65903b705cfSriastradh return TRUE; 66003b705cfSriastradh} 66103b705cfSriastradh 66203b705cfSriastradh/* For pre-965 chip only, as they have 8KB limit for 3D */ 66303b705cfSriastradhstatic inline Bool 66403b705cfSriastradhintel_check_pitch_3d(PixmapPtr pixmap) 66503b705cfSriastradh{ 66603b705cfSriastradh uint32_t pitch = intel_pixmap_pitch(pixmap); 66703b705cfSriastradh if (pitch > KB(8)) { 66803b705cfSriastradh ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); 66903b705cfSriastradh intel_debug_fallback(scrn, "pitch exceeds 3d limit 8K\n"); 67003b705cfSriastradh return FALSE; 67103b705cfSriastradh } 67203b705cfSriastradh return TRUE; 67303b705cfSriastradh} 67403b705cfSriastradh 67503b705cfSriastradh/** 67603b705cfSriastradh * Little wrapper around drm_intel_bo_reloc to return the initial value you 67703b705cfSriastradh * should stuff into the relocation entry. 67803b705cfSriastradh * 67903b705cfSriastradh * If only we'd done this before settling on the library API. 68003b705cfSriastradh */ 68103b705cfSriastradhstatic inline uint32_t 68203b705cfSriastradhintel_emit_reloc(drm_intel_bo * bo, uint32_t offset, 68303b705cfSriastradh drm_intel_bo * target_bo, uint32_t target_offset, 68403b705cfSriastradh uint32_t read_domains, uint32_t write_domain) 68503b705cfSriastradh{ 68603b705cfSriastradh drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset, 68703b705cfSriastradh read_domains, write_domain); 68803b705cfSriastradh 68903b705cfSriastradh return target_bo->offset + target_offset; 69003b705cfSriastradh} 69103b705cfSriastradh 69203b705cfSriastradhstatic inline drm_intel_bo *intel_bo_alloc_for_data(intel_screen_private *intel, 69303b705cfSriastradh const void *data, 69403b705cfSriastradh unsigned int size, 69503b705cfSriastradh const char *name) 69603b705cfSriastradh{ 69703b705cfSriastradh drm_intel_bo *bo; 69803b705cfSriastradh int ret; 69903b705cfSriastradh 70003b705cfSriastradh bo = drm_intel_bo_alloc(intel->bufmgr, name, size, 4096); 70103b705cfSriastradh assert(bo); 70203b705cfSriastradh 70303b705cfSriastradh ret = drm_intel_bo_subdata(bo, 0, size, data); 70403b705cfSriastradh assert(ret == 0); 70503b705cfSriastradh 70603b705cfSriastradh return bo; 70703b705cfSriastradh (void)ret; 70803b705cfSriastradh} 70903b705cfSriastradh 71003b705cfSriastradhvoid intel_debug_flush(ScrnInfoPtr scrn); 71103b705cfSriastradh 71203b705cfSriastradhstatic inline PixmapPtr get_drawable_pixmap(DrawablePtr drawable) 71303b705cfSriastradh{ 71403b705cfSriastradh ScreenPtr screen = drawable->pScreen; 71503b705cfSriastradh 71603b705cfSriastradh if (drawable->type == DRAWABLE_PIXMAP) 71703b705cfSriastradh return (PixmapPtr) drawable; 71803b705cfSriastradh else 71903b705cfSriastradh return screen->GetWindowPixmap((WindowPtr) drawable); 72003b705cfSriastradh} 72103b705cfSriastradh 72203b705cfSriastradhstatic inline Bool pixmap_is_scanout(PixmapPtr pixmap) 72303b705cfSriastradh{ 72403b705cfSriastradh ScreenPtr screen = pixmap->drawable.pScreen; 72503b705cfSriastradh 72603b705cfSriastradh return pixmap == screen->GetScreenPixmap(screen); 72703b705cfSriastradh} 72803b705cfSriastradh 72903b705cfSriastradhBool intel_uxa_init(ScreenPtr pScreen); 73003b705cfSriastradhBool intel_uxa_create_screen_resources(ScreenPtr pScreen); 73103b705cfSriastradhvoid intel_uxa_block_handler(intel_screen_private *intel); 73203b705cfSriastradhBool intel_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table, 73303b705cfSriastradh int num_bos); 73403b705cfSriastradh 73503b705cfSriastradhstatic inline Bool intel_pixmap_is_offscreen(PixmapPtr pixmap) 73603b705cfSriastradh{ 73703b705cfSriastradh struct intel_pixmap *priv = intel_get_pixmap_private(pixmap); 73803b705cfSriastradh return priv && priv->offscreen; 73903b705cfSriastradh} 74003b705cfSriastradh 74142542f5fSchristos#if HAVE_DRI3 74242542f5fSchristosBool intel_sync_init(ScreenPtr screen); 74342542f5fSchristosvoid intel_sync_close(ScreenPtr screen); 74442542f5fSchristos#else 74542542f5fSchristosstatic inline Bool intel_sync_init(ScreenPtr screen) { return 0; } 74642542f5fSchristosvoid intel_sync_close(ScreenPtr screen); 74742542f5fSchristos#endif 74842542f5fSchristos 74942542f5fSchristos/* 75042542f5fSchristos * intel_present.c 75142542f5fSchristos */ 75242542f5fSchristos 75342542f5fSchristos#if 0 75442542f5fSchristos#define DebugPresent(x) ErrorF x 75542542f5fSchristos#else 75642542f5fSchristos#define DebugPresent(x) 75742542f5fSchristos#endif 75842542f5fSchristos 75942542f5fSchristos#if HAVE_PRESENT 76042542f5fSchristosBool intel_present_screen_init(ScreenPtr screen); 76142542f5fSchristos#else 76242542f5fSchristosstatic inline Bool intel_present_screen_init(ScreenPtr screen) { return 0; } 76342542f5fSchristos#endif 76442542f5fSchristos 76503b705cfSriastradh#endif /* _I830_H_ */ 766