Rev 2342 | Rev 2351 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2342 | Rev 2344 | ||
---|---|---|---|
Line 6... | Line 6... | ||
6 | #include "bitmap.h" |
6 | #include "bitmap.h" |
7 | 7 | ||
Line 8... | Line 8... | ||
8 | void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) |
8 | void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) |
9 | { |
9 | { |
10 | /* |
- | |
11 | * |
- | |
12 | * |
- | |
- | 10 | printf("destroy bitmap %d\n", bitmap->handle); |
|
- | 11 | free_handle(&bm_man, bitmap->handle); |
|
13 | * |
12 | bitmap->handle = 0; |
14 | */ |
- | |
- | 13 | i915_gem_object_unpin(bitmap->obj); |
|
- | 14 | drm_gem_object_unreference(&bitmap->obj->base); |
|
15 | __DestroyObject(bitmap); |
15 | __DestroyObject(bitmap); |
16 | }; |
16 | }; |
Line 17... | Line 17... | ||
17 | 17 | ||
Line 28... | Line 28... | ||
28 | return ret; |
28 | return ret; |
29 | }; |
29 | }; |
Line 30... | Line 30... | ||
30 | 30 | ||
31 | 31 | ||
32 | int create_bitmap(struct ubitmap *pbitmap) |
32 | int create_surface(struct io_call_10 *pbitmap) |
Line 33... | Line 33... | ||
33 | { |
33 | { |
34 | struct drm_i915_gem_object *obj; |
34 | struct drm_i915_gem_object *obj; |
35 | 35 | ||
36 | bitmap_t *bitmap; |
36 | bitmap_t *bitmap; |
37 | u32 handle; |
37 | u32 handle; |
38 | u32 width; |
38 | u32 width, max_width; |
39 | u32 height; |
39 | u32 height, max_height; |
Line 40... | Line 40... | ||
40 | u32 size; |
40 | u32 size, max_size; |
Line 41... | Line 41... | ||
41 | u32 pitch; |
41 | u32 pitch, max_pitch; |
42 | void *uaddr; |
42 | void *uaddr; |
Line 43... | Line 43... | ||
43 | 43 | ||
44 | int ret; |
44 | int ret; |
Line -... | Line 45... | ||
- | 45 | ||
45 | 46 | pbitmap->handle = 0; |
|
46 | pbitmap->handle = 0; |
47 | pbitmap->data = (void*)-1; |
Line -... | Line 48... | ||
- | 48 | ||
- | 49 | width = pbitmap->width; |
|
- | 50 | height = pbitmap->height; |
|
- | 51 | ||
- | 52 | /* |
|
- | 53 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
|
- | 54 | goto err1; |
|
- | 55 | ||
- | 56 | if( ((pbitmap->max_width !=0 ) && |
|
- | 57 | (pbitmap->max_width < width)) || |
|
- | 58 | (pbitmap->max_width > 4096) ) |
|
- | 59 | goto err1; |
|
- | 60 | ||
- | 61 | if( ((pbitmap->max_height !=0 ) && |
|
- | 62 | (pbitmap->max_height < width)) || |
|
- | 63 | (pbitmap->max_height > 4096) ) |
|
- | 64 | goto err1; |
|
47 | pbitmap->data = NULL; |
65 | |
48 | 66 | if( pbitmap->format != 0) |
|
Line 49... | Line 67... | ||
49 | width = pbitmap->width; |
67 | goto err1; |
50 | height = pbitmap->height; |
68 | */ |
Line 71... | Line 89... | ||
71 | 89 | ||
Line 72... | Line 90... | ||
72 | pitch = ALIGN(width*4,64); |
90 | pitch = ALIGN(width*4,64); |
Line 73... | Line 91... | ||
73 | 91 | ||
- | 92 | size = roundup(pitch*height, PAGE_SIZE); |
|
74 | size = roundup(pitch*height, PAGE_SIZE); |
93 | |
Line 75... | Line 94... | ||
75 | // printf("pitch %d size %d\n", pitch, size); |
94 | // printf("pitch %d size %d\n", pitch, size); |
76 | 95 | ||
77 | obj = i915_gem_alloc_object(main_device, size); |
96 | obj = i915_gem_alloc_object(main_device, size); |
Line 78... | Line 97... | ||
78 | if (obj == NULL) |
97 | if (obj == NULL) |
79 | goto err2; |
98 | goto err2; |
80 | 99 | ||
Line -... | Line 100... | ||
- | 100 | ret = i915_gem_object_pin(obj, 4096, true); |
|
- | 101 | if (ret) |
|
- | 102 | goto err3; |
|
81 | ret = i915_gem_object_pin(obj, 4096, true); |
103 | |
82 | if (ret) |
104 | max_pitch = ALIGN(max_width*4,64); |
83 | goto err3; |
105 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
84 | 106 | ||
85 | uaddr = UserAlloc(size); |
107 | uaddr = UserAlloc(max_size); |
86 | if( uaddr == NULL) |
108 | if( uaddr == NULL) |
87 | goto err4; |
109 | goto err4; |
Line 88... | Line 110... | ||
88 | else |
110 | else |
Line 89... | Line 111... | ||
89 | { |
111 | { |
90 | u32_t *src, *dst; |
112 | u32_t *src, *dst; |
91 | int count; |
113 | u32 count, max_count; |
- | 114 | ||
Line 92... | Line 115... | ||
92 | 115 | #define page_tabs 0xFDC00000 /* really dirty hack */ |
|
93 | #define page_tabs 0xFDC00000 /* really dirty hack */ |
116 | |
94 | 117 | src = (u32_t*)obj->pages; |
|
95 | src = (u32_t*)obj->pages; |
118 | dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; |
- | 119 | count = size/4096; |
|
- | 120 | max_count = max_size/4096 - count; |
|
96 | dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; |
121 | |
Line 97... | Line 122... | ||
97 | count = size/4096; |
122 | while(count--) |
98 | 123 | { |
|
99 | while(count--) |
- | |
100 | { |
124 | *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page |
101 | *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page |
125 | }; |
- | 126 | // while(max_count--) |
|
102 | }; |
127 | // *dst++ = 0; // cleanup unused space |
- | 128 | } |
|
- | 129 | ||
- | 130 | bitmap->handle = handle; |
|
- | 131 | bitmap->uaddr = uaddr; |
|
103 | } |
132 | bitmap->pitch = pitch; |
104 | 133 | bitmap->gaddr = obj->gtt_offset; |
|
Line 105... | Line -... | ||
105 | bitmap->handle = handle; |
- | |
106 | bitmap->width = width; |
134 | |
107 | bitmap->height = height; |
135 | bitmap->width = width; |
- | 136 | bitmap->height = height; |
|
Line -... | Line 137... | ||
- | 137 | bitmap->max_width = max_width; |
|
108 | bitmap->pitch = pitch; |
138 | bitmap->max_height = max_height; |
109 | bitmap->gaddr = obj->gtt_offset; |
139 | |
Line 110... | Line 140... | ||
110 | bitmap->uaddr = uaddr; |
140 | bitmap->obj = obj; |
Line 111... | Line 141... | ||
111 | bitmap->obj = obj; |
141 | bitmap->header.destroy = destroy_bitmap; |
112 | bitmap->header.destroy = destroy_bitmap; |
142 | |
113 | 143 | pbitmap->handle = handle; |
|
114 | pbitmap->pitch = pitch; |
144 | pbitmap->data = uaddr; |
115 | pbitmap->handle = handle; |
145 | pbitmap->pitch = pitch; |
116 | pbitmap->data = uaddr; |
146 | |
117 | 147 | ||
118 | // printf("%s handle %d pitch %d gpu %x user %x\n", |
148 | printf("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n", |
119 | // __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
149 | __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
Line 120... | Line 150... | ||
120 | 150 | ||
Line -... | Line 151... | ||
- | 151 | return 0; |
|
- | 152 | ||
121 | return 0; |
153 | err4: |
122 | 154 | i915_gem_object_unpin(obj); |
|
123 | err4: |
155 | err3: |
Line 124... | Line 156... | ||
124 | // drm_gem_object_unpin; |
156 | drm_gem_object_unreference(&obj->base); |