Rev 868 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 868 | Rev 876 | ||
---|---|---|---|
Line 1... | Line -... | ||
1 | #define BRUSH_MONO (0<<4) |
- | |
2 | - | ||
Line 3... | Line 1... | ||
3 | 1 | int DrawRect(draw_t* draw) |
|
4 | int DrawRect(draw_t* draw) |
2 | { |
5 | { |
3 | int x0, y0, x1, y1; |
Line 6... | Line 4... | ||
6 | int x0, y0, x1, y1; |
4 | |
- | 5 | local_pixmap_t *dstpixmap; |
|
Line 7... | Line 6... | ||
7 | 6 | clip_t dst_clip; |
|
- | 7 | ||
- | 8 | dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; |
|
- | 9 | ||
- | 10 | x0 = draw->x0; |
|
- | 11 | y0 = draw->y0; |
|
- | 12 | ||
Line 8... | Line 13... | ||
8 | pixmap_t *dstpixmap; |
13 | x1 = x0+draw->w-1; |
9 | 14 | y1 = y0+draw->h-1; |
|
- | 15 | ||
- | 16 | dst_clip.xmin = 0; |
|
Line 10... | Line -... | ||
10 | dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; |
- | |
11 | - | ||
Line 12... | Line 17... | ||
12 | x0 = draw->x; |
17 | dst_clip.ymin = 0; |
13 | y0 = draw->y; |
18 | dst_clip.xmax = dstpixmap->width-1; |
Line 14... | Line 19... | ||
14 | 19 | dst_clip.ymax = dstpixmap->height-1; |
|
15 | x1 = x0+draw->w-1; |
20 | |
16 | y1 = y0+draw->h-1; |
21 | |
17 | 22 | // dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n", |
|
18 | // dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n", |
23 | // x0, y0, x1, y1, draw->color); |
Line 19... | Line 24... | ||
19 | // x0, y0, x1, y1, draw->color); |
24 | |
20 | 25 | if( ! BlockClip( &dst_clip, &x0, &y0, &x1, &y1)) |
|
21 | if( ! BlockClip( &x0, &y0, &x1, &y1)) |
- | |
22 | { |
- | |
Line -... | Line 26... | ||
- | 26 | { |
|
Line 23... | Line 27... | ||
23 | u32 *ring, write; |
27 | u32_t *ring, write; |
Line 24... | Line 28... | ||
24 | int w, h; |
28 | u32_t ifl; |
25 | u32 ifl; |
- | |
26 | - | ||
27 | w = x1-x0+1; |
- | |
28 | h = y1-y0+1; |
- | |
29 | - | ||
30 | ifl = safe_cli(); |
- | |
31 | - | ||
32 | - | ||
33 | #if R300_PIO |
- | |
34 | - | ||
35 | R5xxFIFOWait(7); |
- | |
Line -... | Line 29... | ||
- | 29 | int w, h; |
|
- | 30 | ||
- | 31 | w = x1-x0+1; |
|
- | 32 | h = y1-y0+1; |
|
- | 33 | ||
- | 34 | ifl = safe_cli(); |
|
- | 35 | ||
- | 36 | #if R300_PIO |
|
- | 37 | ||
- | 38 | R5xxFIFOWait(6); |
|
- | 39 | ||
- | 40 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
|
- | 41 | rhd.gui_control | |
|
- | 42 | R5XX_ROP3_P | |
|
36 | 43 | R5XX_GMC_BRUSH_SOLID_COLOR | |
|
- | 44 | R5XX_GMC_SRC_DATATYPE_COLOR | |
|
- | 45 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
|
Line 37... | Line -... | ||
37 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | R5XX_ROP3_P | |
- | |
38 | R5XX_GMC_BRUSH_SOLID_COLOR | |
- | |
39 | R5XX_GMC_SRC_DATATYPE_COLOR); |
- | |
40 | 46 | R5XX_GMC_WR_MSK_DIS |
|
41 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); |
47 | ); |
42 | OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF); |
48 | |
43 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
49 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); |
- | 50 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
|
- | 51 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
|
44 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
52 | OUTREG(R5XX_DST_Y_X,(draw->y0<<16)|draw->x0); |
- | 53 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
|
45 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
54 | #else |
46 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
55 | BEGIN_RING(); |
47 | 56 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
|
48 | #else |
57 | |
49 | 58 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
|
50 | BEGIN_RING(); |
59 | RADEON_GMC_BRUSH_SOLID_COLOR | |
51 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
- | |
52 | 60 | RADEON_GMC_DST_32BPP | |
|
53 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
- | |
54 | RADEON_GMC_BRUSH_SOLID_COLOR | |
61 | RADEON_GMC_SRC_DATATYPE_COLOR | |
55 | RADEON_GMC_DST_32BPP | |
62 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
56 | RADEON_GMC_SRC_DATATYPE_COLOR | |
63 | R5XX_GMC_WR_MSK_DIS | |
57 | (1 << 28)+(1 << 30) | R5XX_ROP3_P); |
64 | R5XX_ROP3_P |
Line 58... | Line 65... | ||
58 | 65 | ); |
|
59 | OUT_RING(dstpixmap->pitch_offset); |
66 | |
60 | OUT_RING(draw->color); |
67 | OUT_RING(dstpixmap->pitch_offset); |
- | 68 | OUT_RING(draw->color); |
|
61 | OUT_RING((x0<<16)|y0); |
69 | OUT_RING((draw->x0<<16)|y0); |
62 | OUT_RING((w<<16)|h); |
70 | OUT_RING((w<<16)|h); |
63 | COMMIT_RING(); |
71 | COMMIT_RING(); |
64 | 72 | #endif |
|
65 | #endif |
73 | safe_sti(ifl); |
66 | 74 | }; |
|
67 | safe_sti(ifl); |
75 | return ERR_OK; |
68 | } ; |
76 | } |
69 | return ERR_OK; |
77 | |
- | 78 | int FillRect(fill_t *fill) |
|
- | 79 | { |
|
- | 80 | local_pixmap_t *dstpixmap; |
|
- | 81 | clip_t dst_clip; |
|
- | 82 | int x0, y0, x1, y1; |
|
Line 70... | Line 83... | ||
70 | } |
83 | |
71 | 84 | dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ; |
|
Line 72... | Line 85... | ||
72 | int FillRect(fill_t *fill) |
85 | |
73 | { |
86 | x0 = fill->x; |
74 | pixmap_t *dstpixmap; |
87 | y0 = fill->y; |
75 | int x0, y0, x1, y1; |
- | |
76 | - | ||
77 | dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ; |
88 | |
Line 78... | Line 89... | ||
78 | 89 | x1 = x0+fill->w-1; |
|
Line -... | Line 90... | ||
- | 90 | y1 = y0+fill->h-1; |
|
79 | x0 = fill->x; |
91 | |
Line 80... | Line 92... | ||
80 | y0 = fill->y; |
92 | dst_clip.xmin = 0; |
81 | - | ||
82 | x1 = x0+fill->w-1; |
- | |
83 | y1 = y0+fill->h-1; |
- | |
84 | - | ||
85 | // dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n", |
- | |
86 | // x0, y0, x1, y1); |
- | |
87 | - | ||
88 | if( ! BlockClip( &x0, &y0, &x1, &y1)) |
- | |
89 | { |
- | |
90 | u32 *ring, write; |
- | |
Line 91... | Line 93... | ||
91 | u32 ifl; |
93 | dst_clip.ymin = 0; |
- | 94 | dst_clip.xmax = dstpixmap->width-1; |
|
- | 95 | dst_clip.ymax = dstpixmap->height-1; |
|
- | 96 | ||
- | 97 | // dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n", |
|
- | 98 | // x0, y0, x1, y1); |
|
- | 99 | ||
92 | 100 | if( ! BlockClip(&dst_clip, &x0, &y0, &x1, &y1)) |
|
- | 101 | { |
|
Line 93... | Line 102... | ||
93 | ifl = safe_cli(); |
102 | u32_t *ring, write; |
94 | 103 | u32_t ifl = safe_cli(); |
|
95 | #if R300_PIO |
- | |
Line 96... | Line -... | ||
96 | - | ||
- | 104 | ||
- | 105 | #if R300_PIO |
|
Line -... | Line 106... | ||
- | 106 | ||
- | 107 | int w = x1-x0+1; |
|
- | 108 | int h = y1-y0+1; |
|
- | 109 | ||
- | 110 | R5xxFIFOWait(9); |
|
- | 111 | ||
- | 112 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
|
- | 113 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
|
- | 114 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
|
- | 115 | RADEON_GMC_DST_32BPP | |
|
- | 116 | R5XX_GMC_SRC_DATATYPE_COLOR | |
|
- | 117 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
|
- | 118 | R5XX_GMC_WR_MSK_DIS | |
|
- | 119 | R5XX_ROP3_P |
|
- | 120 | ); |
|
- | 121 | ||
- | 122 | OUTREG(R5XX_DP_BRUSH_BKGD_CLR, fill->bkcolor); |
|
- | 123 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->fcolor); |
|
- | 124 | ||
- | 125 | OUTREG(R5XX_BRUSH_DATA0, fill->bmp0); |
|
- | 126 | OUTREG(R5XX_BRUSH_DATA1, fill->bmp1); |
|
- | 127 | ||
- | 128 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
|
- | 129 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
|
- | 130 | ||
- | 131 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
|
- | 132 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(h<<16)|w); |
|
- | 133 | #else |
|
- | 134 | BEGIN_RING(); |
|
97 | #else |
135 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7)); |
98 | 136 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
|
99 | BEGIN_RING(); |
137 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
100 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7)); |
138 | RADEON_GMC_DST_32BPP | |
Line -... | Line 139... | ||
- | 139 | RADEON_GMC_SRC_DATATYPE_COLOR | |
|
101 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
140 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
102 | BRUSH_MONO | |
141 | R5XX_GMC_WR_MSK_DIS | |
103 | RADEON_GMC_DST_32BPP | |
142 | R5XX_ROP3_P |
Line 104... | Line 143... | ||
104 | RADEON_GMC_SRC_DATATYPE_COLOR | |
143 | ); |
Line 132... | Line 171... | ||
132 | x1 = x0+blit->w-1; |
171 | y1 = y0+blit->h-1; |
133 | y1 = y0+blit->h-1; |
172 | |
Line 134... | Line 173... | ||
134 | 173 | ||
135 | 174 | if( ! BlockClip(&clip, &x0, &y0, &x1, &y1)) |
|
136 | if( ! BlockClip( &x0, &y0, &x1, &y1)) |
175 | { |
137 | { |
176 | u32 *ring, write; |
138 | u32 *ring, write; |
177 | int w, h; |
Line 174... | Line 213... | ||
174 | } ; |
213 | return ERR_OK; |
175 | return ERR_OK; |
214 | } |
176 | } |
215 | |
177 | 216 | int Line2P(draw_t *draw) |
|
Line 178... | Line 217... | ||
178 | int Line2P(line2p_t *draw) |
217 | { |
179 | { |
218 | local_pixmap_t *dstpixmap; |
180 | - | ||
- | 219 | int x0, y0, x1, y1; |
|
181 | int x0, y0, x1, y1; |
220 | |
Line -... | Line 221... | ||
- | 221 | dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; |
|
- | 222 | ||
182 | 223 | x0 = draw->x0; |
|
183 | x0 = draw->x0; |
224 | y0 = draw->y0; |
Line 184... | Line 225... | ||
184 | y0 = draw->y0; |
225 | |
185 | 226 | x1 = draw->x1; |
|
Line 186... | Line 227... | ||
186 | x1 = draw->x1; |
227 | y1 = draw->y1; |
187 | y1 = draw->y1; |
228 | |
188 | 229 | if ( !LineClip(&clip, &x0, &y0, &x1, &y1 )) |
|
189 | if ( !LineClip( &x0, &y0, &x1, &y1 )) |
230 | { |
Line 190... | Line 231... | ||
190 | { |
231 | u32 efl; |
Line 191... | Line 232... | ||
191 | u32 ifl; |
232 | u32 *ring, write; |
Line 192... | Line 233... | ||
192 | u32 *ring, write; |
233 | |
Line 232... | Line 273... | ||
232 | OUT_RING((y1<<16)|x1); |
273 | COMMIT_RING(); |
233 | COMMIT_RING(); |
274 | |
234 | 275 | #endif |
|
Line 235... | Line 276... | ||
235 | #endif |
276 | safe_sti(efl); |
236 | safe_sti(ifl); |
277 | |
Line 237... | Line 278... | ||
237 | 278 | }; |
|
238 | }; |
279 | return ERR_OK; |
239 | return ERR_OK; |
280 | } |
- | 281 | #endif |
|
Line 240... | Line -... | ||
240 | } |
- | |
241 | 282 | ||
242 | 283 | int CreatePixmap(pixmap_t *io) |
|
- | 284 | { |
|
Line -... | Line 285... | ||
- | 285 | local_pixmap_t *pixmap; |
|
243 | int CreatePixmap(userpixmap_t *io) |
286 | |
Line 244... | Line -... | ||
244 | { |
- | |
245 | 287 | unsigned pitch; |
|
Line 246... | Line 288... | ||
246 | pixmap_t *pixmap; |
288 | size_t size; |
247 | 289 | ||
248 | u32_t pitch; |
290 | void *local; |
249 | void *raw; |
291 | |
- | 292 | if( (io->width == 0) || (io->width > 2048)|| |
|
- | 293 | (io->height == 0)|| (io->height > 2048)) |
|
- | 294 | { |
|
- | 295 | dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height); |
|
- | 296 | return ERR_PARAM; |
|
- | 297 | }; |
|
- | 298 | ||
- | 299 | pitch = ((io->width+15)&~15)*4; |
|
- | 300 | size = pitch*io->height; |
|
- | 301 | ||
- | 302 | dbgprintf("pitch = %d\n", pitch); |
|
- | 303 | ||
- | 304 | local = rhd_mem_alloc(&rhd,RHD_MEM_FB,size) ; |
|
- | 305 | if ( !local) |
|
- | 306 | { |
|
- | 307 | dbgprintf("Not enough memory for pixmap\n"); |
|
- | 308 | return ERR_PARAM; |
|
- | 309 | }; |
|
- | 310 | ||
- | 311 | pixmap = malloc(sizeof(local_pixmap_t)); |
|
- | 312 | if(!pixmap) |
|
- | 313 | { |
|
- | 314 | rhd_mem_free(&rhd, RHD_MEM_FB,local); |
|
- | 315 | return ERR_PARAM; |
|
- | 316 | } |
|
- | 317 | else |
|
- | 318 | { |
|
- | 319 | void *mapped; |
|
- | 320 | ||
- | 321 | size = (size+4095) & ~ 4095; |
|
- | 322 | ||
- | 323 | if (mapped = UserAlloc(size)) |
|
- | 324 | { |
|
- | 325 | CommitPages(mapped, ((u32_t)local+rhd.PhisBase)|7|(1<<9), size); |
|
- | 326 | ||
- | 327 | io->mapped = mapped; |
|
- | 328 | io->pitch = pitch; |
|
- | 329 | io->handle = (u32_t)pixmap; |
|
- | 330 | ||
- | 331 | pixmap->width = io->width; |
|
- | 332 | pixmap->height = io->height; |
|
- | 333 | pixmap->format = PICT_a8r8g8b8; |
|
- | 334 | pixmap->flags = io->flags; |
|
- | 335 | pixmap->pitch = pitch; |
|
- | 336 | pixmap->mapped = mapped; |
|
- | 337 | pixmap->pitch_offset = ((pitch/64)<<22)| (((u32_t)local+rhd.FbIntAddress)>>10); |
|
- | 338 | pixmap->local = local; |
|
- | 339 | ||
- | 340 | dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset); |
|
- | 341 | dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height ); |
|
- | 342 | dbgprintf("map at %x\n", pixmap->mapped); |
|
- | 343 | ||
- | 344 | return ERR_OK; |
|
250 | 345 | }; |
|
- | 346 | rhd_mem_free(&rhd, RHD_MEM_FB,local); |
|
Line 251... | Line -... | ||
251 | if( (io->width == 0) || (io->width > 2048)|| |
- | |
252 | (io->height == 0)|| (io->height > 2048)) |
- | |
253 | { |
- | |
254 | dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height); |
- | |
255 | return ERR_PARAM; |
- | |
256 | - | ||
257 | }; |
- | |
258 | - | ||
259 | pitch = ((io->width+15)&~15)*4; |
- | |
260 | dbgprintf("pitch = %d\n", pitch); |
- | |
261 | - | ||
Line 262... | Line 347... | ||
262 | raw = rhd_mem_alloc(&rhd,RHD_MEM_FB,pitch*io->height) ; |
347 | free(pixmap); |
263 | if (! raw) |
- | |
264 | { |
348 | }; |
265 | dbgprintf("Not enough memory for pixmap\n"); |
- | |
266 | return ERR_PARAM; |
- | |
267 | }; |
- | |
268 | - | ||
269 | pixmap = malloc(sizeof(pixmap_t)); |
- | |
270 | if(!pixmap) |
349 | return ERR_PARAM; |
271 | { |
- | |
272 | rhd_mem_free(&rhd, RHD_MEM_FB,raw); |
- | |
273 | return ERR_PARAM; |
350 | }; |
274 | } |
- | |
275 | else |
- | |
276 | { |
- | |
277 | io->pixmap = pixmap; |
- | |
278 | io->usermap = NULL; |
- | |
279 | io->format = PICT_a8r8g8b8; |
- | |
280 | io->pitch = 0; |
- | |
281 | - | ||
282 | pixmap->width = io->width; |
- | |
283 | pixmap->height = io->height; |
- | |
284 | pixmap->format = PICT_a8r8g8b8; |
- | |
285 | pixmap->flags = 0; |
- | |
286 | pixmap->pitch = pitch; |
- | |
287 | pixmap->offset = (u32_t)raw+rhd.FbIntAddress; |
- | |
Line 288... | Line -... | ||
288 | pixmap->pitch_offset = ((pitch/64)<<22)| (pixmap->offset>>10); |
- | |
289 | pixmap->raw = raw; |
351 | |
290 | pixmap->usermap = NULL; |
- | |
Line 291... | Line 352... | ||
291 | 352 | ||
- | 353 | int DestroyPixmap( pixmap_t *io ) |
|
292 | dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset); |
354 | { |
293 | dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height ); |
355 | local_pixmap_t *pixmap; |
Line 294... | Line 356... | ||
294 | dbgprintf("pixmap.offset: %x\n", pixmap->offset); |
356 | size_t size; |
Line 295... | Line 357... | ||
295 | 357 | ||
296 | } |
- | |
297 | return ERR_OK; |
- | |
298 | } |
358 | dbgprintf("Destroy pixmap %x\n", io->handle); |
Line 299... | Line 359... | ||
299 | 359 | ||
300 | int DestroyPixmap( userpixmap_t *io) |
360 | if(io->handle == -1) |
Line 301... | Line -... | ||
301 | { |
- | |
302 | pixmap_t *pixmap; |
- | |
303 | - | ||
304 | dbgprintf("Destroy pixmap %x\n", io->pixmap); |
- | |
305 | 361 | return ERR_PARAM; |
|
306 | if(io->pixmap == (pixmap_t*)-1) |
362 | else |
307 | return ERR_PARAM; |
363 | pixmap = (local_pixmap_t*)io->handle; |
308 | else |
364 | |
Line 309... | Line 365... | ||
309 | pixmap = io->pixmap; |
365 | size = (pixmap->pitch*pixmap->height+4095) & ~ 4095; |
310 | 366 | ||
Line -... | Line 367... | ||
- | 367 | UnmapPages(pixmap->mapped, size); |
|
- | 368 | UserFree(pixmap->mapped); |
|
311 | if( (pixmap->flags & 1) == PX_LOCK ) |
369 | |
312 | UnlockPixmap(io); |
370 | rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->local); |
313 | 371 | free(pixmap); |
|
314 | UserFree(pixmap->usermap); |
372 | |
315 | rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->raw); |
373 | io->format = 0; |
Line 389... | Line 447... | ||
389 | 447 | return ERR_OK; |
|
Line 390... | Line 448... | ||
390 | return ERR_OK; |
448 | }; |
391 | }; |
449 | |
Line -... | Line 450... | ||
- | 450 | #endif |
|
Line 392... | Line 451... | ||
392 | 451 | ||
393 | 452 | int PixBlit(pixblit_t *blit) |
|
- | 453 | { |
|
Line 394... | Line -... | ||
394 | int PixBlit(pixblit_t *blit) |
- | |
395 | { |
- | |
396 | - | ||
397 | u32 *ring, write; |
- | |
398 | int w, h; |
- | |
399 | u32 ifl; |
454 | clip_t src_clip, dst_clip; |
400 | int x0, y0; |
455 | |
Line 401... | Line 456... | ||
401 | 456 | local_pixmap_t *srcpixmap; |
|
Line 402... | Line 457... | ||
402 | pixmap_t *srcpixmap; |
457 | local_pixmap_t *dstpixmap; |
403 | pixmap_t *dstpixmap; |
458 | |
Line 413... | Line 468... | ||
413 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
468 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
414 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
469 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
415 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
470 | |
416 | 471 | src_clip.xmin = 0; |
|
Line -... | Line 472... | ||
- | 472 | src_clip.ymin = 0; |
|
- | 473 | src_clip.xmax = srcpixmap->width-1; |
|
- | 474 | src_clip.ymax = srcpixmap->height-1; |
|
- | 475 | ||
- | 476 | dst_clip.xmin = 0; |
|
- | 477 | dst_clip.ymin = 0; |
|
- | 478 | dst_clip.xmax = dstpixmap->width-1; |
|
- | 479 | dst_clip.ymax = dstpixmap->height-1; |
|
- | 480 | ||
- | 481 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
|
- | 482 | &src_clip, &blit->src_x, &blit->src_y, |
|
- | 483 | &blit->w, &blit->h) ) |
|
- | 484 | { |
|
- | 485 | u32_t *ring, write; |
|
- | 486 | ||
- | 487 | u32_t ifl = safe_cli(); |
|
417 | ifl = safe_cli(); |
488 | |
Line 418... | Line 489... | ||
418 | 489 | #if R300_PIO |
|
Line 419... | Line 490... | ||
419 | #if R300_PIO |
490 | |
Line 420... | Line 491... | ||
420 | 491 | R5xxFIFOWait(7); |
|
421 | R5xxFIFOWait(7); |
492 | |
422 | 493 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
|
423 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
494 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
424 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
495 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
425 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
496 | RADEON_GMC_BRUSH_NONE | |
426 | RADEON_GMC_BRUSH_NONE | |
497 | RADEON_GMC_DST_32BPP | |
427 | RADEON_GMC_DST_32BPP | |
498 | RADEON_GMC_SRC_DATATYPE_COLOR | |
428 | RADEON_GMC_SRC_DATATYPE_COLOR | |
499 | RADEON_DP_SRC_SOURCE_MEMORY | |
429 | RADEON_DP_SRC_SOURCE_MEMORY | |
500 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
430 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
501 | R5XX_GMC_WR_MSK_DIS | |
431 | R5XX_GMC_WR_MSK_DIS | |
502 | R5XX_ROP3_S |
432 | R5XX_ROP3_S |
503 | ); |
433 | ); |
504 | |
434 | 505 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
|
435 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
506 | |
436 | 507 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
|
437 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
508 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
438 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
509 | |
439 | 510 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
|
Line 440... | Line 511... | ||
440 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
511 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
Line 441... | Line 512... | ||
441 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
512 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
442 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
513 | |
443 | - | ||
444 | #else |
- | |
445 | - | ||
446 | BEGIN_RING(); |
- | |
447 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
- | |
448 | - | ||
449 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
- | |
450 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
- | |
451 | RADEON_GMC_BRUSH_NONE | |
- | |
452 | RADEON_GMC_DST_32BPP | |
- | |
453 | RADEON_GMC_SRC_DATATYPE_COLOR | |
- | |
454 | RADEON_DP_SRC_SOURCE_MEMORY | |
- | |
455 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
- | |
456 | R5XX_GMC_WR_MSK_DIS | |
- | |
Line -... | Line 514... | ||
- | 514 | #else |
|
- | 515 | ||
- | 516 | BEGIN_RING(); |
|
- | 517 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
|
- | 518 | ||
- | 519 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
|
- | 520 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
|
- | 521 | RADEON_GMC_BRUSH_NONE | |
|
- | 522 | RADEON_GMC_DST_32BPP | |
|
- | 523 | RADEON_GMC_SRC_DATATYPE_COLOR | |
|
- | 524 | RADEON_DP_SRC_SOURCE_MEMORY | |
|
- | 525 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
|
- | 526 | R5XX_GMC_WR_MSK_DIS | |
|
- | 527 | R5XX_ROP3_S |
|
457 | R5XX_ROP3_S |
528 | ); |
458 | ); |
529 | |
459 | 530 | OUT_RING(srcpixmap->pitch_offset); |
|
460 | OUT_RING(srcpixmap->pitch_offset); |
531 | OUT_RING(dstpixmap->pitch_offset); |
Line 461... | Line 532... | ||
461 | OUT_RING(dstpixmap->pitch_offset); |
532 | |
462 | - | ||
463 | OUT_RING((blit->src_x<<16)|blit->src_y); |
533 | OUT_RING((blit->src_x<<16)|blit->src_y); |
- | 534 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
|
464 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
535 | OUT_RING((blit->w<<16)|blit->h); |
465 | OUT_RING((blit->w<<16)|blit->h); |
536 | COMMIT_RING(); |
Line 466... | Line 537... | ||
466 | COMMIT_RING(); |
537 | |
467 | 538 | #endif |
|
- | 539 | safe_sti(ifl); |
|
Line 468... | Line -... | ||
468 | #endif |
- | |
469 | - | ||
470 | safe_sti(ifl); |
- | |
471 | return ERR_OK; |
- | |
472 | } |
- | |
473 | 540 | }; |
|
474 | 541 | return ERR_OK; |
|
Line 475... | Line 542... | ||
475 | int TransBlit(pixblit_t *blit) |
542 | }; |
Line 476... | Line 543... | ||
476 | { |
543 | |
477 | 544 | ||
Line 493... | Line 560... | ||
493 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
560 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
494 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
561 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
495 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
562 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
496 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
563 | src_clip.xmin = 0; |
- | 564 | src_clip.ymin = 0; |
|
- | 565 | src_clip.xmax = srcpixmap->width-1; |
|
- | 566 | src_clip.ymax = srcpixmap->height-1; |
|
- | 567 | ||
- | 568 | dst_clip.xmin = 0; |
|
- | 569 | dst_clip.ymin = 0; |
|
- | 570 | dst_clip.xmax = dstpixmap->width-1; |
|
- | 571 | dst_clip.ymax = dstpixmap->height-1; |
|
- | 572 | ||
- | 573 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
|
- | 574 | &src_clip, &blit->src_x, &blit->src_y, |
|
- | 575 | &blit->w, &blit->h) ) |
|
- | 576 | { |
|
- | 577 | u32_t *ring, write; |
|
- | 578 | ||
Line 497... | Line 579... | ||
497 | 579 | u32_t ifl = safe_cli(); |
|
Line 498... | Line 580... | ||
498 | ifl = safe_cli(); |
580 | |
Line 499... | Line 581... | ||
499 | 581 | #if R300_PIO |
|
Line 500... | Line 582... | ||
500 | #if R300_PIO |
582 | |
501 | 583 | R5xxFIFOWait(10); |
|
502 | R5xxFIFOWait(10); |
584 | |
503 | 585 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
|
504 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
586 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
505 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
587 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
506 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
588 | RADEON_GMC_BRUSH_NONE | |
507 | RADEON_GMC_BRUSH_NONE | |
589 | RADEON_GMC_DST_32BPP | |
508 | RADEON_GMC_DST_32BPP | |
590 | RADEON_GMC_SRC_DATATYPE_COLOR | |
509 | RADEON_GMC_SRC_DATATYPE_COLOR | |
591 | RADEON_DP_SRC_SOURCE_MEMORY | |
510 | RADEON_DP_SRC_SOURCE_MEMORY | |
592 | R5XX_GMC_WR_MSK_DIS | |
511 | R5XX_GMC_WR_MSK_DIS | |
593 | R5XX_ROP3_S |
512 | R5XX_ROP3_S |
594 | ); |
513 | ); |
595 | |
514 | 596 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
|
515 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
597 | |
516 | 598 | OUTREG(R5XX_CLR_CMP_CLR_SRC, 0xFF000000); |
|
517 | OUTREG(R5XX_CLR_CMP_CLR_SRC, 0xFF000000); |
599 | OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK); |
518 | OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK); |
600 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
519 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
601 | |
520 | 602 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
|
521 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
603 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
522 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
604 | |
Line 523... | Line 605... | ||
523 | 605 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
|
Line 524... | Line 606... | ||
524 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
606 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
525 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
607 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
Line 526... | Line 608... | ||
526 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
608 | |
527 | 609 | #else |
|
528 | #else |
610 | |
529 | 611 | BEGIN_RING(); |
|
530 | BEGIN_RING(); |
612 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
531 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
613 | |
532 | 614 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
|
533 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
615 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
534 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
616 | RADEON_GMC_BRUSH_NONE | |
- | 617 | RADEON_GMC_DST_32BPP | |
|
- | 618 | RADEON_GMC_SRC_DATATYPE_COLOR | |
|
- | 619 | RADEON_DP_SRC_SOURCE_MEMORY | |
|
- | 620 | R5XX_GMC_WR_MSK_DIS | |
|
- | 621 | R5XX_ROP3_S |
|
- | 622 | ); |
|
- | 623 | ||
- | 624 | OUT_RING(srcpixmap->pitch_offset); |
|
- | 625 | OUT_RING(dstpixmap->pitch_offset); |
|
- | 626 | ||
- | 627 | OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR); |
|
Line 535... | Line -... | ||
535 | RADEON_GMC_BRUSH_NONE | |
- | |
536 | RADEON_GMC_DST_32BPP | |
- | |
537 | RADEON_GMC_SRC_DATATYPE_COLOR | |
- | |
538 | RADEON_DP_SRC_SOURCE_MEMORY | |
- | |
539 | R5XX_GMC_WR_MSK_DIS | |
- | |
540 | R5XX_ROP3_S |
- | |
541 | ); |
- | |
542 | - | ||
543 | OUT_RING(srcpixmap->pitch_offset); |
- | |
544 | OUT_RING(dstpixmap->pitch_offset); |
- | |
545 | - | ||
546 | OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR); |
628 | OUT_RING(0xFF000000); |
Line 547... | Line 629... | ||
547 | OUT_RING(0xFF000000); |
629 | OUT_RING(0xFF000000); |
Line 548... | Line 630... | ||
548 | OUT_RING(0xFF000000); |
630 | |
- | 631 | OUT_RING((blit->src_x<<16)|blit->src_y); |
|
549 | 632 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
|
550 | OUT_RING((blit->src_x<<16)|blit->src_y); |
633 | OUT_RING((blit->w<<16)|blit->h); |