xref: /haiku/src/add-ons/accelerants/via/GetAccelerantHook.c (revision 644fa5a93845dc4a1bc155f1fd0f94ebdf0b47bc)
1  /*
2  	Copyright 1999, Be Incorporated.   All Rights Reserved.
3  	This file may be used under the terms of the Be Sample Code License.
4  
5  	Other authors:
6  	Mark Watson,
7  	Rudolf Cornelissen 10/2002-7/2005
8  */
9  
10  #define MODULE_BIT 0x08000000
11  
12  #include "acc_std.h"
13  
14  /*
15  The standard entry point.  Given a uint32 feature identifier, this routine
16  returns a pointer to the function that implements the feature.  Some features
17  require more information than just the identifier to select the proper
18  function.  The extra information (which is specific to the feature) is
19  pointed at by the void *data parameter.  By default, no extra information
20  is available.  Any extra information available to choose the function will be
21  noted on a case by case below.
22  */
23  
24  /*
25  These definitions are out of pure lazyness.
26  */
27  #define CHKO(x) case B_##x: \
28  	if (check_overlay_capability(B_##x) == B_OK) return (void *)x; else return (void *)0
29  #define CHKA(x) case B_##x: \
30  	if (check_acc_capability(B_##x) == B_OK) return (void *)x; else return (void *)0
31  #define HOOK(x) case B_##x: return (void *)x
32  #define ZERO(x) case B_##x: return (void *)0
33  #define HRDC(x) case B_##x: return si->settings.hardcursor? (void *)x: (void *)0; // apsed
34  
35  void *	get_accelerant_hook(uint32 feature, void *data)
36  {
37  	switch (feature)
38  	{
39  		/*
40  		One of either B_INIT_ACCELERANT or B_CLONE_ACCELERANT will be requested and
41  		subsequently called before any other hook is requested.  All other feature
42  		hook selections can be predicated on variables assigned during the accelerant
43  		initialization process.
44  		*/
45  
46  		/* initialization */
47  		HOOK(INIT_ACCELERANT);
48  		HOOK(CLONE_ACCELERANT);
49  
50  		HOOK(ACCELERANT_CLONE_INFO_SIZE);
51  		HOOK(GET_ACCELERANT_CLONE_INFO);
52  		HOOK(UNINIT_ACCELERANT);
53  		HOOK(GET_ACCELERANT_DEVICE_INFO);
54  		HOOK(ACCELERANT_RETRACE_SEMAPHORE);
55  
56  		/* mode configuration */
57  		HOOK(ACCELERANT_MODE_COUNT);
58  		HOOK(GET_MODE_LIST);
59  		HOOK(PROPOSE_DISPLAY_MODE);
60  		HOOK(SET_DISPLAY_MODE);
61  		HOOK(GET_DISPLAY_MODE);
62  		HOOK(GET_FRAME_BUFFER_CONFIG);
63  		HOOK(GET_PIXEL_CLOCK_LIMITS);
64  		HOOK(MOVE_DISPLAY);
65  		HOOK(SET_INDEXED_COLORS);
66  		HOOK(GET_TIMING_CONSTRAINTS);
67  
68  		HOOK(DPMS_CAPABILITIES);
69  		HOOK(DPMS_MODE);
70  		HOOK(SET_DPMS_MODE);
71  
72  		/* cursor managment */
73  		HRDC(SET_CURSOR_SHAPE);
74  		HRDC(MOVE_CURSOR);
75  		HRDC(SHOW_CURSOR);
76  
77  		/* synchronization */
78  		HOOK(ACCELERANT_ENGINE_COUNT);
79  		HOOK(ACQUIRE_ENGINE);
80  		HOOK(RELEASE_ENGINE);
81  		HOOK(WAIT_ENGINE_IDLE);
82  		HOOK(GET_SYNC_TOKEN);
83  		HOOK(SYNC_TO_TOKEN);
84  
85  		/*
86  		Depending on the engine architecture, you may choose to provide a different
87  		function to be used with each bit-depth for example.
88  
89  		Note: These hooks are re-acquired by the app_server after each mode switch.
90  		*/
91  
92  		/* only export video overlay functions if card is capable of it */
93  		CHKO(OVERLAY_COUNT);
94  		CHKO(OVERLAY_SUPPORTED_SPACES);
95  		CHKO(OVERLAY_SUPPORTED_FEATURES);
96  		CHKO(ALLOCATE_OVERLAY_BUFFER);
97  		CHKO(RELEASE_OVERLAY_BUFFER);
98  		CHKO(GET_OVERLAY_CONSTRAINTS);
99  		CHKO(ALLOCATE_OVERLAY);
100  		CHKO(RELEASE_OVERLAY);
101  		CHKO(CONFIGURE_OVERLAY);
102  
103  		/*
104  		When requesting an acceleration hook, the calling application provides a
105  		pointer to the display_mode for which the acceleration function will be used.
106  		Depending on the engine architecture, you may choose to provide a different
107  		function to be used with each bit-depth.  In the sample driver we return
108  		the same function all the time.
109  
110  		Note: These hooks are re-acquired by the app_server after each mode switch.
111  		*/
112  
113  		/* only export 2D acceleration functions in modes that are capable of it */
114  		/* used by the app_server and applications (BWindowScreen) */
115  		CHKA(SCREEN_TO_SCREEN_BLIT);
116  		CHKA(FILL_RECTANGLE);
117  		CHKA(INVERT_RECTANGLE);
118  		CHKA(FILL_SPAN);
119  		/* not (yet) used by the app_server:
120  		 * so just for application use (BWindowScreen) */
121  //		CHKA(SCREEN_TO_SCREEN_TRANSPARENT_BLIT);
122  //		CHKA(SCREEN_TO_SCREEN_SCALED_FILTERED_BLIT;
123  	}
124  
125  	/* Return a null pointer for any feature we don't understand. */
126  	return 0;
127  }
128  #undef CHKO
129  #undef CHKA
130  #undef HOOK
131  #undef ZERO
132  #undef HRDC
133  
134  status_t check_overlay_capability(uint32 feature)
135  {
136  	char *msg = "";
137  
138  	/* setup logmessage text */
139  	switch (feature)
140  	{
141  	case B_OVERLAY_COUNT:
142  		msg = "B_OVERLAY_COUNT";
143  		break;
144  	case B_OVERLAY_SUPPORTED_SPACES:
145  		msg = "B_OVERLAY_SUPPORTED_SPACES";
146  		break;
147  	case B_OVERLAY_SUPPORTED_FEATURES:
148  		msg = "B_OVERLAY_SUPPORTED_FEATURES";
149  		break;
150  	case B_ALLOCATE_OVERLAY_BUFFER:
151  		msg = "B_ALLOCATE_OVERLAY_BUFFER";
152  		break;
153  	case B_RELEASE_OVERLAY_BUFFER:
154  		msg = "B_RELEASE_OVERLAY_BUFFER";
155  		break;
156  	case B_GET_OVERLAY_CONSTRAINTS:
157  		msg = "B_GET_OVERLAY_CONSTRAINTS";
158  		break;
159  	case B_ALLOCATE_OVERLAY:
160  		msg = "B_ALLOCATE_OVERLAY";
161  		break;
162  	case B_RELEASE_OVERLAY:
163  		msg = "B_RELEASE_OVERLAY";
164  		break;
165  	case B_CONFIGURE_OVERLAY:
166  		msg = "B_CONFIGURE_OVERLAY";
167  		break;
168  	default:
169  		msg = "UNKNOWN";
170  		break;
171  	}
172  
173  	/* all supported cards have a bes, but it can't always be used... */
174  	if (eng_bes_chk_bandwidth())
175  		LOG(4, ("Overlay: Exporting hook %s.\n", msg));
176  	else
177  		LOG(4, ("Overlay: Not exporting hook %s.\n", msg));
178  
179  	return B_OK;
180  }
181  
182  status_t check_acc_capability(uint32 feature)
183  {
184  	char *msg = "";
185  
186  	/* setup logmessage text */
187  	switch (feature)
188  	{
189  	case B_SCREEN_TO_SCREEN_BLIT:
190  		msg = "B_SCREEN_TO_SCREEN_BLIT";
191  		break;
192  	case B_FILL_RECTANGLE:
193  		msg = "B_FILL_RECTANGLE";
194  		break;
195  	case B_INVERT_RECTANGLE:
196  		msg = "B_INVERT_RECTANGLE";
197  		break;
198  	case B_FILL_SPAN:
199  		msg = "B_FILL_SPAN";
200  		break;
201  	case B_SCREEN_TO_SCREEN_TRANSPARENT_BLIT:
202  		msg = "B_SCREEN_TO_SCREEN_TRANSPARENT_BLIT";
203  		break;
204  	case B_SCREEN_TO_SCREEN_SCALED_FILTERED_BLIT:
205  		msg = "B_SCREEN_TO_SCREEN_SCALED_FILTERED_BLIT";
206  		break;
207  	default:
208  		msg = "UNKNOWN";
209  		break;
210  	}
211  
212  	/* hardware acceleration is only supported in modes with upto a certain
213  	 * memory pitch.. */
214  	if (si->acc_mode)
215  	{
216  		LOG(4, ("Acc: Exporting hook %s.\n", msg));
217  		return B_OK;
218  	}
219  	else
220  	{
221  		LOG(4, ("Acc: Not exporting hook %s.\n", msg));
222  		return B_ERROR;
223  	}
224  }
225