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