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