1/*
2 * Copyright 2005-2012, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Lotz <mmlr@mlotz.ch>
7 *		Stephan Aßmus <superstippi@gmx.de>
8 */
9#ifndef ACCELERANT_HW_INTERFACE_H
10#define ACCELERANT_HW_INTERFACE_H
11
12
13#include "HWInterface.h"
14
15#include <image.h>
16#include <video_overlay.h>
17
18
19class AccelerantBuffer;
20class RenderingBuffer;
21
22
23class AccelerantHWInterface : public HWInterface {
24public:
25								AccelerantHWInterface();
26	virtual						~AccelerantHWInterface();
27
28	virtual	status_t			Initialize();
29	virtual	status_t			Shutdown();
30
31	virtual	status_t			SetMode(const display_mode& mode);
32	virtual	void				GetMode(display_mode* mode);
33
34	virtual status_t			GetDeviceInfo(accelerant_device_info* info);
35	virtual status_t			GetFrameBufferConfig(
36									frame_buffer_config& config);
37
38	virtual status_t			GetModeList(display_mode** _modeList,
39									uint32* _count);
40	virtual status_t			GetPixelClockLimits(display_mode* mode,
41									uint32* _low, uint32* _high);
42	virtual status_t			GetTimingConstraints(display_timing_constraints*
43									constraints);
44	virtual status_t			ProposeMode(display_mode* candidate,
45									const display_mode* low,
46									const display_mode* high);
47	virtual	status_t			GetPreferredMode(display_mode* mode);
48	virtual status_t			GetMonitorInfo(monitor_info* info);
49
50	virtual sem_id				RetraceSemaphore();
51	virtual status_t			WaitForRetrace(
52									bigtime_t timeout = B_INFINITE_TIMEOUT);
53
54	virtual status_t			SetDPMSMode(uint32 state);
55	virtual uint32				DPMSMode();
56	virtual uint32				DPMSCapabilities();
57
58	virtual status_t			GetAccelerantPath(BString& path);
59	virtual status_t			GetDriverPath(BString& path);
60
61	// query for available hardware accleration
62	virtual	uint32				AvailableHWAcceleration() const;
63
64	// accelerated drawing
65	virtual	void				CopyRegion(const clipping_rect* sortedRectList,
66									uint32 count, int32 xOffset, int32 yOffset);
67	virtual	void				FillRegion(/*const*/ BRegion& region,
68									const rgb_color& color, bool autoSync);
69	virtual	void				InvertRegion(/*const*/ BRegion& region);
70
71	virtual	void				Sync();
72
73	// overlay support
74	virtual overlay_token		AcquireOverlayChannel();
75	virtual void				ReleaseOverlayChannel(overlay_token token);
76
77	virtual status_t			GetOverlayRestrictions(const Overlay* overlay,
78									overlay_restrictions* restrictions);
79	virtual bool				CheckOverlayRestrictions(int32 width,
80									int32 height, color_space colorSpace);
81	virtual const overlay_buffer* AllocateOverlayBuffer(int32 width,
82									int32 height, color_space space);
83	virtual void				FreeOverlayBuffer(const overlay_buffer* buffer);
84
85	virtual void				ConfigureOverlay(Overlay* overlay);
86	virtual void				HideOverlay(Overlay* overlay);
87
88	// cursor handling
89	virtual	void				SetCursor(ServerCursor* cursor);
90	virtual	void				SetCursorVisible(bool visible);
91	virtual	void				MoveCursorTo(float x, float y);
92
93	// frame buffer access
94	virtual	RenderingBuffer*	FrontBuffer() const;
95	virtual	RenderingBuffer*	BackBuffer() const;
96	virtual	bool				IsDoubleBuffered() const;
97
98protected:
99	virtual	void				_CopyBackToFront(/*const*/ BRegion& region);
100
101	virtual	void				_DrawCursor(IntRect area) const;
102
103private:
104			int					_OpenGraphicsDevice(int deviceNumber);
105			status_t			_OpenAccelerant(int device);
106			status_t			_SetupDefaultHooks();
107			status_t			_UpdateModeList();
108			status_t			_UpdateFrameBufferConfig();
109			void				_RegionToRectParams(/*const*/ BRegion* region,
110									uint32* count) const;
111			void				_CopyRegion(const clipping_rect* sortedRectList,
112									uint32 count, int32 xOffset, int32 yOffset,
113									bool inBackBuffer);
114			uint32				_NativeColor(const rgb_color& color) const;
115			status_t			_FindBestMode(const display_mode& compareMode,
116									float compareAspectRatio,
117									display_mode& modeFound,
118									int32 *_diff = NULL) const;
119			status_t			_SetFallbackMode(display_mode& mode) const;
120			void				_SetSystemPalette();
121			void				_SetGrayscalePalette();
122
123private:
124			int					fCardFD;
125			image_id			fAccelerantImage;
126			GetAccelerantHook	fAccelerantHook;
127			engine_token*		fEngineToken;
128			sync_token			fSyncToken;
129
130			// required hooks - guaranteed to be valid
131			acquire_engine			fAccAcquireEngine;
132			release_engine			fAccReleaseEngine;
133			sync_to_token			fAccSyncToToken;
134			accelerant_mode_count	fAccGetModeCount;
135			get_mode_list			fAccGetModeList;
136			get_frame_buffer_config	fAccGetFrameBufferConfig;
137			set_display_mode		fAccSetDisplayMode;
138			get_display_mode		fAccGetDisplayMode;
139			get_pixel_clock_limits	fAccGetPixelClockLimits;
140
141			// optional accelerant hooks
142			get_timing_constraints	fAccGetTimingConstraints;
143			propose_display_mode	fAccProposeDisplayMode;
144			get_preferred_display_mode fAccGetPreferredDisplayMode;
145			get_monitor_info		fAccGetMonitorInfo;
146			get_edid_info			fAccGetEDIDInfo;
147			fill_rectangle			fAccFillRect;
148			invert_rectangle		fAccInvertRect;
149			screen_to_screen_blit	fAccScreenBlit;
150			set_cursor_shape		fAccSetCursorShape;
151			set_cursor_bitmap		fAccSetCursorBitmap;
152			move_cursor				fAccMoveCursor;
153			show_cursor				fAccShowCursor;
154
155			// dpms hooks
156			dpms_capabilities	fAccDPMSCapabilities;
157			dpms_mode			fAccDPMSMode;
158			set_dpms_mode		fAccSetDPMSMode;
159
160			// overlay hooks
161			overlay_count				fAccOverlayCount;
162			overlay_supported_spaces	fAccOverlaySupportedSpaces;
163			overlay_supported_features	fAccOverlaySupportedFeatures;
164			allocate_overlay_buffer		fAccAllocateOverlayBuffer;
165			release_overlay_buffer		fAccReleaseOverlayBuffer;
166			get_overlay_constraints		fAccGetOverlayConstraints;
167			allocate_overlay			fAccAllocateOverlay;
168			release_overlay				fAccReleaseOverlay;
169			configure_overlay			fAccConfigureOverlay;
170
171			frame_buffer_config	fFrameBufferConfig;
172			int					fModeCount;
173			display_mode*		fModeList;
174
175			RenderingBuffer*	fBackBuffer;
176			AccelerantBuffer*	fFrontBuffer;
177			bool				fOffscreenBackBuffer;
178
179			display_mode		fDisplayMode;
180			bool				fInitialModeSwitch;
181
182			sem_id				fRetraceSemaphore;
183
184	mutable	fill_rect_params*	fRectParams;
185	mutable	uint32				fRectParamsCount;
186	mutable	blit_params*		fBlitParams;
187	mutable	uint32				fBlitParamsCount;
188};
189
190#endif // ACCELERANT_HW_INTERFACE_H
191