1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/* Driver data structures */
#include "radeon.h"
/* Allocates memory, either by resizing the allocation pointed to by mem_struct,
* or by freeing mem_struct (if non-NULL) and allocating a new space. The size
* is measured in bytes, and the offset from the beginning of card space is
* returned.
*/
uint32_t
radeon_allocate_memory(ScrnInfoPtr pScrn,
void **mem_struct,
int size,
int align)
{
ScreenPtr pScreen;
RADEONInfoPtr info = RADEONPTR(pScrn);
int offset = 0;
pScreen = screenInfo.screens[pScrn->scrnIndex];
#ifdef USE_EXA
if (info->useEXA) {
ExaOffscreenArea *area = *mem_struct;
if (area != NULL) {
if (area->size >= size)
return area->offset;
exaOffscreenFree(pScrn->pScreen, area);
}
area = exaOffscreenAlloc(pScrn->pScreen, size, align, TRUE,
NULL, NULL);
*mem_struct = area;
if (area == NULL)
return 0;
offset = area->offset;
}
#endif /* USE_EXA */
#ifdef USE_XAA
if (!info->useEXA) {
FBLinearPtr linear = *mem_struct;
int cpp = info->CurrentLayout.bitsPerPixel / 8;
/* XAA allocates in units of pixels at the screen bpp, so adjust size
* appropriately.
*/
size = (size + cpp - 1) / cpp;
align = (align + cpp - 1) / cpp;
if (linear) {
if(linear->size >= size)
return linear->offset * cpp;
if(xf86ResizeOffscreenLinear(linear, size))
return linear->offset * cpp;
xf86FreeOffscreenLinear(linear);
}
linear = xf86AllocateOffscreenLinear(pScreen, size, align,
NULL, NULL, NULL);
*mem_struct = linear;
if (!linear) {
int max_size;
xf86QueryLargestOffscreenLinear(pScreen, &max_size, align,
PRIORITY_EXTREME);
if (max_size < size)
return 0;
xf86PurgeUnlockedOffscreenAreas(pScreen);
linear = xf86AllocateOffscreenLinear(pScreen, size, align,
NULL, NULL, NULL);
*mem_struct = linear;
if (!linear)
return 0;
}
offset = linear->offset * cpp;
}
#endif /* USE_XAA */
return offset;
}
void
radeon_free_memory(ScrnInfoPtr pScrn,
void *mem_struct)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
#ifdef USE_EXA
if (info->useEXA) {
ExaOffscreenArea *area = mem_struct;
if (area != NULL)
exaOffscreenFree(pScrn->pScreen, area);
area = NULL;
}
#endif /* USE_EXA */
#ifdef USE_XAA
if (!info->useEXA) {
FBLinearPtr linear = mem_struct;
if (linear != NULL)
xf86FreeOffscreenLinear(linear);
linear = NULL;
}
#endif /* USE_XAA */
}
|