Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | /* |
2 | * Copyright © 2006 Intel Corporation | |
3 | * | |
4 | * Permission is hereby granted, free of charge, to any person obtaining a | |
5 | * copy of this software and associated documentation files (the "Software"), | |
6 | * to deal in the Software without restriction, including without limitation | |
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
8 | * and/or sell copies of the Software, and to permit persons to whom the | |
9 | * Software is furnished to do so, subject to the following conditions: | |
10 | * | |
11 | * The above copyright notice and this permission notice (including the next | |
12 | * paragraph) shall be included in all copies or substantial portions of the | |
13 | * Software. | |
14 | * | |
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
18 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
21 | * SOFTWARE. | |
22 | * | |
23 | * Authors: | |
24 | * Eric Anholt <anholt@FreeBSD.org> | |
25 | * | |
26 | */ | |
27 | ||
28 | #ifdef HAVE_CONFIG_H | |
29 | #include <xorg-config.h> | |
30 | #endif | |
31 | ||
32 | #include <string.h> | |
33 | ||
34 | #include "exa_priv.h" | |
35 | ||
36 | #include "xf86str.h" | |
37 | #include "xf86.h" | |
38 | ||
39 | typedef struct _ExaXorgScreenPrivRec { | |
40 | CloseScreenProcPtr SavedCloseScreen; | |
41 | xf86EnableDisableFBAccessProc *SavedEnableDisableFBAccess; | |
42 | OptionInfoPtr options; | |
43 | } ExaXorgScreenPrivRec, *ExaXorgScreenPrivPtr; | |
44 | ||
45 | static DevPrivateKeyRec exaXorgScreenPrivateKeyRec; | |
46 | ||
47 | #define exaXorgScreenPrivateKey (&exaXorgScreenPrivateKeyRec) | |
48 | ||
49 | typedef enum { | |
50 | EXAOPT_MIGRATION_HEURISTIC, | |
51 | EXAOPT_NO_COMPOSITE, | |
52 | EXAOPT_NO_UTS, | |
53 | EXAOPT_NO_DFS, | |
54 | EXAOPT_OPTIMIZE_MIGRATION | |
55 | } EXAOpts; | |
56 | ||
57 | static const OptionInfoRec EXAOptions[] = { | |
58 | {EXAOPT_MIGRATION_HEURISTIC, "MigrationHeuristic", | |
59 | OPTV_ANYSTR, {0}, FALSE}, | |
60 | {EXAOPT_NO_COMPOSITE, "EXANoComposite", | |
61 | OPTV_BOOLEAN, {0}, FALSE}, | |
62 | {EXAOPT_NO_UTS, "EXANoUploadToScreen", | |
63 | OPTV_BOOLEAN, {0}, FALSE}, | |
64 | {EXAOPT_NO_DFS, "EXANoDownloadFromScreen", | |
65 | OPTV_BOOLEAN, {0}, FALSE}, | |
66 | {EXAOPT_OPTIMIZE_MIGRATION, "EXAOptimizeMigration", | |
67 | OPTV_BOOLEAN, {0}, FALSE}, | |
68 | {-1, NULL, | |
69 | OPTV_NONE, {0}, FALSE} | |
70 | }; | |
71 | ||
72 | static Bool | |
73 | exaXorgCloseScreen(ScreenPtr pScreen) | |
74 | { | |
75 | ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); | |
76 | ExaXorgScreenPrivPtr pScreenPriv = (ExaXorgScreenPrivPtr) | |
77 | dixLookupPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey); | |
78 | ||
79 | pScreen->CloseScreen = pScreenPriv->SavedCloseScreen; | |
80 | ||
81 | pScrn->EnableDisableFBAccess = pScreenPriv->SavedEnableDisableFBAccess; | |
82 | ||
83 | free(pScreenPriv->options); | |
84 | free(pScreenPriv); | |
85 | ||
86 | return pScreen->CloseScreen(pScreen); | |
87 | } | |
88 | ||
89 | static void | |
90 | exaXorgEnableDisableFBAccess(ScrnInfoPtr pScrn, Bool enable) | |
91 | { | |
92 | ScreenPtr pScreen = xf86ScrnToScreen(pScrn); | |
93 | ExaXorgScreenPrivPtr pScreenPriv = (ExaXorgScreenPrivPtr) | |
94 | dixLookupPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey); | |
95 | ||
96 | if (!enable) | |
97 | exaEnableDisableFBAccess(pScreen, enable); | |
98 | ||
99 | if (pScreenPriv->SavedEnableDisableFBAccess) | |
100 | pScreenPriv->SavedEnableDisableFBAccess(pScrn, enable); | |
101 | ||
102 | if (enable) | |
103 | exaEnableDisableFBAccess(pScreen, enable); | |
104 | } | |
105 | ||
106 | /** | |
107 | * This will be called during exaDriverInit, giving us the chance to set options | |
108 | * and hook in our EnableDisableFBAccess. | |
109 | */ | |
110 | void | |
111 | exaDDXDriverInit(ScreenPtr pScreen) | |
112 | { | |
113 | ExaScreenPriv(pScreen); | |
114 | ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); | |
115 | ExaXorgScreenPrivPtr pScreenPriv; | |
116 | ||
117 | if (!dixRegisterPrivateKey(&exaXorgScreenPrivateKeyRec, PRIVATE_SCREEN, 0)) | |
118 | return; | |
119 | ||
120 | pScreenPriv = calloc(1, sizeof(ExaXorgScreenPrivRec)); | |
121 | if (pScreenPriv == NULL) | |
122 | return; | |
123 | ||
124 | pScreenPriv->options = xnfalloc(sizeof(EXAOptions)); | |
125 | memcpy(pScreenPriv->options, EXAOptions, sizeof(EXAOptions)); | |
126 | xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pScreenPriv->options); | |
127 | ||
128 | if (pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) { | |
129 | if (!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS) && | |
130 | pExaScr->info->offScreenBase < pExaScr->info->memorySize) { | |
131 | char *heuristicName; | |
132 | ||
133 | heuristicName = xf86GetOptValString(pScreenPriv->options, | |
134 | EXAOPT_MIGRATION_HEURISTIC); | |
135 | if (heuristicName != NULL) { | |
136 | if (strcmp(heuristicName, "greedy") == 0) | |
137 | pExaScr->migration = ExaMigrationGreedy; | |
138 | else if (strcmp(heuristicName, "always") == 0) | |
139 | pExaScr->migration = ExaMigrationAlways; | |
140 | else if (strcmp(heuristicName, "smart") == 0) | |
141 | pExaScr->migration = ExaMigrationSmart; | |
142 | else { | |
143 | xf86DrvMsg(pScreen->myNum, X_WARNING, | |
144 | "EXA: unknown migration heuristic %s\n", | |
145 | heuristicName); | |
146 | } | |
147 | } | |
148 | } | |
149 | ||
150 | pExaScr->optimize_migration = | |
151 | xf86ReturnOptValBool(pScreenPriv->options, | |
152 | EXAOPT_OPTIMIZE_MIGRATION, TRUE); | |
153 | } | |
154 | ||
155 | if (xf86ReturnOptValBool(pScreenPriv->options, EXAOPT_NO_COMPOSITE, FALSE)) { | |
156 | xf86DrvMsg(pScreen->myNum, X_CONFIG, | |
157 | "EXA: Disabling Composite operation " | |
158 | "(RENDER acceleration)\n"); | |
159 | pExaScr->info->CheckComposite = NULL; | |
160 | pExaScr->info->PrepareComposite = NULL; | |
161 | } | |
162 | ||
163 | if (xf86ReturnOptValBool(pScreenPriv->options, EXAOPT_NO_UTS, FALSE)) { | |
164 | xf86DrvMsg(pScreen->myNum, X_CONFIG, "EXA: Disabling UploadToScreen\n"); | |
165 | pExaScr->info->UploadToScreen = NULL; | |
166 | } | |
167 | ||
168 | if (xf86ReturnOptValBool(pScreenPriv->options, EXAOPT_NO_DFS, FALSE)) { | |
169 | xf86DrvMsg(pScreen->myNum, X_CONFIG, | |
170 | "EXA: Disabling DownloadFromScreen\n"); | |
171 | pExaScr->info->DownloadFromScreen = NULL; | |
172 | } | |
173 | ||
174 | dixSetPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey, pScreenPriv); | |
175 | ||
176 | pScreenPriv->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess; | |
177 | pScrn->EnableDisableFBAccess = exaXorgEnableDisableFBAccess; | |
178 | ||
179 | pScreenPriv->SavedCloseScreen = pScreen->CloseScreen; | |
180 | pScreen->CloseScreen = exaXorgCloseScreen; | |
181 | ||
182 | } | |
183 | ||
184 | static XF86ModuleVersionInfo exaVersRec = { | |
185 | "exa", | |
186 | MODULEVENDORSTRING, | |
187 | MODINFOSTRING1, | |
188 | MODINFOSTRING2, | |
189 | XORG_VERSION_CURRENT, | |
190 | EXA_VERSION_MAJOR, EXA_VERSION_MINOR, EXA_VERSION_RELEASE, | |
191 | ABI_CLASS_VIDEODRV, /* requires the video driver ABI */ | |
192 | ABI_VIDEODRV_VERSION, | |
193 | MOD_CLASS_NONE, | |
194 | {0, 0, 0, 0} | |
195 | }; | |
196 | ||
197 | _X_EXPORT XF86ModuleData exaModuleData = { &exaVersRec, NULL, NULL }; |