Rev 2340 | Rev 2344 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2340 | Rev 2342 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | #include "i915_drv.h" |
4 | #include "i915_drv.h" |
5 | #include "intel_drv.h" |
5 | #include "intel_drv.h" |
6 | #include "bitmap.h" |
6 | #include "bitmap.h" |
7 | 7 | ||
Line -... | Line 8... | ||
- | 8 | void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) |
|
- | 9 | { |
|
- | 10 | /* |
|
- | 11 | * |
|
- | 12 | * |
|
- | 13 | * |
|
- | 14 | */ |
|
- | 15 | __DestroyObject(bitmap); |
|
- | 16 | }; |
|
- | 17 | ||
8 | extern struct drm_device *main_device; |
18 | extern struct drm_device *main_device; |
Line 9... | Line 19... | ||
9 | 19 | ||
Line 10... | Line 20... | ||
10 | struct hman bm_man; |
20 | struct hman bm_man; |
Line 18... | Line 28... | ||
18 | return ret; |
28 | return ret; |
19 | }; |
29 | }; |
Line 20... | Line 30... | ||
20 | 30 | ||
21 | 31 | ||
22 | int create_bitmap(struct ubitmap *pbitmap, int width, int height) |
32 | int create_bitmap(struct ubitmap *pbitmap) |
Line 23... | Line 33... | ||
23 | { |
33 | { |
24 | struct drm_i915_gem_object *obj; |
34 | struct drm_i915_gem_object *obj; |
- | 35 | ||
- | 36 | bitmap_t *bitmap; |
|
25 | 37 | u32 handle; |
|
26 | bitmap_t *bitmap; |
38 | u32 width; |
27 | u32 handle; |
39 | u32 height; |
Line 28... | Line 40... | ||
28 | u32 size; |
40 | u32 size; |
Line 29... | Line 41... | ||
29 | u32 pitch; |
41 | u32 pitch; |
30 | void *uaddr; |
42 | void *uaddr; |
Line -... | Line 43... | ||
- | 43 | ||
- | 44 | int ret; |
|
- | 45 | ||
31 | 46 | pbitmap->handle = 0; |
|
32 | int ret; |
47 | pbitmap->data = NULL; |
Line 33... | Line 48... | ||
33 | 48 | ||
- | 49 | width = pbitmap->width; |
|
Line 34... | Line 50... | ||
34 | pbitmap->handle = 0; |
50 | height = pbitmap->height; |
35 | pbitmap->data = NULL; |
51 | |
Line 36... | Line 52... | ||
36 | 52 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
|
- | 53 | goto err1; |
|
- | 54 | ||
- | 55 | handle = alloc_handle(&bm_man); |
|
- | 56 | // printf("%s %d\n",__FUNCTION__, handle); |
|
- | 57 | ||
37 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
58 | if(handle == 0) |
38 | goto err1; |
59 | goto err1; |
Line 39... | Line 60... | ||
39 | 60 | ||
Line 40... | Line 61... | ||
40 | handle = alloc_handle(&bm_man); |
61 | bitmap = CreateObject(GetPid(), sizeof(*bitmap)); |
Line 41... | Line 62... | ||
41 | 62 | bitmap->handle = handle; |
|
- | 63 | bitmap->header.destroy = destroy_bitmap; |
|
Line 42... | Line 64... | ||
42 | if(handle == 0) |
64 | bitmap->obj = NULL; |
43 | goto err1; |
65 | |
44 | 66 | // printf("bitmap %x\n", bitmap); |
|
Line 86... | Line 108... | ||
86 | bitmap->pitch = pitch; |
108 | bitmap->pitch = pitch; |
87 | bitmap->gaddr = obj->gtt_offset; |
109 | bitmap->gaddr = obj->gtt_offset; |
88 | bitmap->uaddr = uaddr; |
110 | bitmap->uaddr = uaddr; |
89 | bitmap->obj = obj; |
111 | bitmap->obj = obj; |
90 | 112 | bitmap->header.destroy = destroy_bitmap; |
|
- | 113 | ||
Line -... | Line 114... | ||
- | 114 | pbitmap->pitch = pitch; |
|
91 | pbitmap->handle = handle; |
115 | pbitmap->handle = handle; |
92 | pbitmap->data = uaddr; |
116 | pbitmap->data = uaddr; |
93 | return 0; |
- | |
94 | - | ||
95 | err4: |
- | |
96 | // drm_gem_object_unpin; |
- | |
97 | err3: |
- | |
98 | // drm_gem_object_unreference(&obj->base); |
- | |
99 | err2: |
- | |
100 | free_handle(&bm_man, handle); |
- | |
101 | DestroyObject(bitmap); |
- | |
102 | err1: |
- | |
103 | return -1; |
- | |
Line 104... | Line -... | ||
104 | - | ||
105 | }; |
- | |
106 | - | ||
107 | - | ||
108 | int create_video(int width, int height, u32_t *outp) |
- | |
109 | { |
- | |
110 | struct drm_i915_gem_object *obj; |
- | |
111 | - | ||
112 | size_t size; |
- | |
113 | size_t pitch; |
- | |
114 | void *uaddr; |
- | |
115 | - | ||
116 | int ret; |
- | |
117 | - | ||
118 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
- | |
119 | goto err1; |
- | |
120 | - | ||
121 | pitch = ALIGN(width*4,64); |
- | |
122 | 117 | ||
123 | size = roundup(pitch*height, PAGE_SIZE); |
- | |
124 | - | ||
125 | obj = i915_gem_alloc_object(main_device, size); |
- | |
126 | if (obj == NULL) |
- | |
127 | goto err2; |
- | |
128 | - | ||
129 | ret = i915_gem_object_pin(obj, 4096, true); |
- | |
130 | if (ret) |
- | |
131 | goto err3; |
- | |
132 | - | ||
133 | uaddr = UserAlloc(size); |
- | |
134 | if( uaddr == NULL) |
- | |
135 | goto err4; |
- | |
136 | else |
- | |
137 | { |
- | |
138 | u32_t *src, *dst; |
- | |
139 | int count; |
- | |
140 | - | ||
141 | #define page_tabs 0xFDC00000 /* really dirty hack */ |
- | |
142 | - | ||
143 | src = (u32_t*)obj->pages; |
- | |
144 | dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; |
- | |
145 | count = size/4096; |
- | |
146 | - | ||
147 | while(count--) |
- | |
148 | { |
118 | // printf("%s handle %d pitch %d gpu %x user %x\n", |
149 | *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page |
- | |
150 | }; |
- | |
151 | } |
- | |
152 | - | ||
153 | outp[0] = obj->gtt_offset; |
- | |
154 | outp[2] = (u32)uaddr; |
- | |
Line 155... | Line 119... | ||
155 | outp[3] = pitch; |
119 | // __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
Line 156... | Line 120... | ||
156 | 120 | ||
157 | return 0; |
121 | return 0; |
158 | 122 | ||
159 | err4: |
123 | err4: |
160 | // drm_gem_object_unpin; |
124 | // drm_gem_object_unpin; |
- | 125 | err3: |
|
- | 126 | // drm_gem_object_unreference(&obj->base); |
|
161 | err3: |
127 | err2: |
162 | // drm_gem_object_unreference(&obj->base); |
128 | free_handle(&bm_man, handle); |
- | 129 | __DestroyObject(bitmap); |
|
163 | err2: |
130 | err1: |
Line 164... | Line 131... | ||
164 | err1: |
131 | return -1; |
165 | return -1; |
132 |