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 189... | Line 189... | ||
189 | select_cursor_kms(os_display->cursor); |
189 | select_cursor_kms(os_display->cursor); |
190 | }; |
190 | }; |
191 | safe_sti(ifl); |
191 | safe_sti(ifl); |
Line 192... | Line -... | ||
192 | - | ||
193 | { |
192 | |
194 | #define XY_COLOR_BLT ((2<<29)|(0x50<<22)|(0x4)) |
193 | #define XY_COLOR_BLT ((2<<29)|(0x50<<22)|(0x4)) |
195 | #define BLT_WRITE_ALPHA (1<<21) |
194 | #define BLT_WRITE_ALPHA (1<<21) |
Line -... | Line 195... | ||
- | 195 | #define BLT_WRITE_RGB (1<<20) |
|
- | 196 | ||
- | 197 | #if 1 |
|
196 | #define BLT_WRITE_RGB (1<<20) |
198 | { |
197 | 199 | ||
198 | drm_i915_private_t *dev_priv = dev->dev_private; |
200 | drm_i915_private_t *dev_priv = dev->dev_private; |
Line 199... | Line -... | ||
199 | struct drm_i915_gem_object *obj; |
- | |
200 | struct intel_ring_buffer *ring; |
- | |
201 | - | ||
202 | u32_t br13, cmd, *b; |
- | |
203 | - | ||
204 | int n=0; |
- | |
205 | - | ||
206 | cmd = XY_COLOR_BLT | BLT_WRITE_ALPHA | BLT_WRITE_RGB; |
- | |
207 | br13 = os_display->pitch; |
- | |
208 | br13 |= 0xF0 << 16; |
201 | struct drm_i915_gem_object *obj; |
209 | br13 |= 3 << 24; |
202 | struct intel_ring_buffer *ring; |
Line 210... | Line 203... | ||
210 | 203 | ||
211 | obj = i915_gem_alloc_object(dev, 4096); |
204 | obj = i915_gem_alloc_object(dev, 4096); |
- | 205 | i915_gem_object_pin(obj, 4096, true); |
|
- | 206 | ||
Line 212... | Line -... | ||
212 | i915_gem_object_pin(obj, 4096, true); |
- | |
213 | - | ||
214 | cmd_buffer = MapIoMem(obj->pages[0], 4096, PG_SW|PG_NOCACHE); |
- | |
215 | cmd_offset = obj->gtt_offset; |
- | |
216 | - | ||
217 | b = (u32_t*)cmd_buffer; |
- | |
218 | b[n++] = cmd; |
- | |
219 | b[n++] = br13; |
- | |
220 | b[n++] = 0; // top, left |
207 | cmd_buffer = MapIoMem(obj->pages[0], 4096, PG_SW|PG_NOCACHE); |
221 | b[n++] = (128 << 16) | 128; // bottom, right |
- | |
222 | b[n++] = 0; // dst |
- | |
223 | b[n++] = 0x0000FF00; |
- | |
224 | b[n++] = MI_BATCH_BUFFER_END; |
- | |
225 | if( n & 1) |
- | |
226 | b[n++] = MI_NOOP; |
- | |
227 | - | ||
228 | // cmd_buffer = (u32_t)&b[n]; |
- | |
Line -... | Line 208... | ||
- | 208 | cmd_offset = obj->gtt_offset; |
|
- | 209 | }; |
|
- | 210 | #endif |
|
- | 211 | ||
229 | // i915_gem_object_set_to_gtt_domain(obj, false); |
212 | int err; |
Line 230... | Line 213... | ||
230 | 213 | ||
Line 231... | Line 214... | ||
231 | 214 | err = init_bitmaps(); |
|
Line 301... | Line 284... | ||
301 | fb = fb_helper->fb; |
284 | fb = fb_helper->fb; |
Line 302... | Line 285... | ||
302 | 285 | ||
303 | fb->width = reqmode->width; |
286 | fb->width = reqmode->width; |
- | 287 | fb->height = reqmode->height; |
|
304 | fb->height = reqmode->height; |
288 | fb->pitches[0] = ALIGN(reqmode->width * 4, 64); |
- | 289 | fb->pitches[1] = ALIGN(reqmode->width * 4, 64); |
|
- | 290 | fb->pitches[2] = ALIGN(reqmode->width * 4, 64); |
|
- | 291 | fb->pitches[3] = ALIGN(reqmode->width * 4, 64); |
|
305 | fb->pitch = ALIGN(reqmode->width * 4, 64); |
292 | |
306 | fb->bits_per_pixel = 32; |
293 | fb->bits_per_pixel = 32; |
Line 307... | Line 294... | ||
307 | fb->depth == 24; |
294 | fb->depth == 24; |
308 | 295 | ||
Line 318... | Line 305... | ||
318 | if (ret == true) |
305 | if (ret == true) |
319 | { |
306 | { |
320 | os_display->width = fb->width; |
307 | os_display->width = fb->width; |
321 | os_display->height = fb->height; |
308 | os_display->height = fb->height; |
322 | os_display->pitch = fb->pitch; |
309 | os_display->pitch = fb->pitches[0]; |
323 | os_display->vrefresh = drm_mode_vrefresh(mode); |
310 | os_display->vrefresh = drm_mode_vrefresh(mode); |
Line 324... | Line 311... | ||
324 | 311 | ||
Line 325... | Line 312... | ||
325 | sysSetScreen(fb->width, fb->height, fb->pitch); |
312 | sysSetScreen(fb->width, fb->height, fb->pitches[0]); |
326 | 313 | ||
327 | dbgprintf("new mode %d x %d pitch %d\n", |
314 | dbgprintf("new mode %d x %d pitch %d\n", |
328 | fb->width, fb->height, fb->pitch); |
315 | fb->width, fb->height, fb->pitches[0]); |
329 | } |
316 | } |
330 | else |
317 | else |
331 | DRM_ERROR("failed to set mode %d_%d on crtc %p\n", |
318 | DRM_ERROR("failed to set mode %d_%d on crtc %p\n", |
Line 404... | Line 391... | ||
404 | }; |
391 | }; |
405 | 392 | ||
Line 406... | Line 393... | ||
406 | void __attribute__((regparm(1))) destroy_cursor(cursor_t *cursor) |
393 | void __attribute__((regparm(1))) destroy_cursor(cursor_t *cursor) |
407 | { |
394 | { |
- | 395 | /* FIXME synchronization */ |
|
- | 396 | ||
408 | list_del(&cursor->list); |
397 | list_del(&cursor->list); |
409 | // radeon_bo_unpin(cursor->robj); |
398 | // radeon_bo_unpin(cursor->robj); |
410 | // KernelFree(cursor->data); |
399 | // KernelFree(cursor->data); |
411 | __DestroyObject(cursor); |
400 | __DestroyObject(cursor); |
412 | }; |
401 | }; |
Line 590... | Line 579... | ||
590 | extern struct drm_device *main_device; |
579 | extern struct drm_device *main_device; |
Line 591... | Line 580... | ||
591 | 580 | ||
Line -... | Line 581... | ||
- | 581 | #define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) |
|
- | 582 | ||
- | 583 | ||
- | 584 | typedef struct |
|
- | 585 | { |
|
- | 586 | int left; |
|
- | 587 | int top; |
|
- | 588 | int right; |
|
- | 589 | int bottom; |
|
- | 590 | }rect_t; |
|
- | 591 | ||
- | 592 | ||
592 | #define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) |
593 | #include "clip.inc" |
- | 594 | ||
593 | 595 | void FASTCALL GetWindowRect(rect_t *rc)__asm__("GetWindowRect"); |
|
- | 596 | ||
- | 597 | #define CURRENT_TASK (0x80003000) |
|
594 | int video_blit(uint64_t src_offset, int x, int y, |
598 | |
- | 599 | static u32_t get_display_map() |
|
- | 600 | { |
|
- | 601 | u32_t addr; |
|
- | 602 | ||
- | 603 | addr = (u32_t)os_display; |
|
- | 604 | addr+= sizeof(display_t); /* shoot me */ |
|
- | 605 | return *(u32_t*)addr; |
|
- | 606 | } |
|
- | 607 | ||
- | 608 | #define XY_SRC_COPY_CHROMA_CMD ((2<<29)|(0x73<<22)|8) |
|
- | 609 | #define ROP_COPY_SRC 0xCC |
|
- | 610 | #define FORMAT8888 3 |
|
- | 611 | ||
Line -... | Line 612... | ||
- | 612 | typedef int v4si __attribute__ ((vector_size (16))); |
|
- | 613 | ||
- | 614 | ||
595 | int w, int h, int pitch) |
615 | int blit_video(u32 hbitmap, int dst_x, int dst_y, |
596 | { |
616 | int src_x, int src_y, u32 w, u32 h) |
Line -... | Line 617... | ||
- | 617 | { |
|
- | 618 | drm_i915_private_t *dev_priv = main_device->dev_private; |
|
- | 619 | struct intel_ring_buffer *ring; |
|
- | 620 | ||
597 | 621 | bitmap_t *bitmap; |
|
598 | drm_i915_private_t *dev_priv = main_device->dev_private; |
622 | rect_t winrc; |
Line -... | Line 623... | ||
- | 623 | clip_t dst_clip; |
|
- | 624 | clip_t src_clip; |
|
- | 625 | u32_t width; |
|
599 | struct intel_ring_buffer *ring; |
626 | u32_t height; |
Line 600... | Line 627... | ||
600 | 627 | ||
601 | u32_t br13, cmd, *b; |
628 | u32_t br13, cmd, slot_mask, *b; |
Line 602... | Line 629... | ||
602 | u32_t offset; |
629 | u32_t offset; |
Line 603... | Line 630... | ||
603 | 630 | u8 slot; |
|
- | 631 | int n=0; |
|
Line 604... | Line -... | ||
604 | int n=0; |
- | |
Line 605... | Line -... | ||
605 | - | ||
606 | // if( cmd_buffer & 0xF80 ) |
632 | |
607 | // cmd_buffer&= 0xFFFFF000; |
- | |
608 | - | ||
Line -... | Line 633... | ||
- | 633 | if(unlikely(hbitmap==0)) |
|
- | 634 | return -1; |
|
- | 635 | ||
- | 636 | bitmap = (bitmap_t*)hman_get_data(&bm_man, hbitmap); |
|
- | 637 | ||
- | 638 | if(unlikely(bitmap==NULL)) |
|
- | 639 | return -1; |
|
- | 640 | ||
- | 641 | ||
- | 642 | GetWindowRect(&winrc); |
|
609 | // b = (u32_t*)ALIGN(cmd_buffer,16); |
643 | |
610 | 644 | dst_clip.xmin = 0; |
|
- | 645 | dst_clip.ymin = 0; |
|
611 | // offset = cmd_offset + ((u32_t)b & 0xFFF); |
646 | dst_clip.xmax = winrc.right-winrc.left-1; |
612 | 647 | dst_clip.ymax = winrc.bottom -winrc.top -1; |
|
613 | b = cmd_buffer; |
648 | |
614 | 649 | src_clip.xmin = 0; |
|
Line 615... | Line 650... | ||
615 | cmd = XY_SRC_COPY_BLT_CMD | BLT_WRITE_RGB; |
650 | src_clip.ymin = 0; |
616 | br13 = os_display->pitch; |
651 | src_clip.xmax = bitmap->width - 1; |
Line 617... | Line 652... | ||
617 | br13 |= 0xCC << 16; |
652 | src_clip.ymax = bitmap->height - 1; |
618 | br13 |= 3 << 24; |
- | |
619 | - | ||
Line 620... | Line 653... | ||
620 | b[n++] = cmd; |
653 | |
Line -... | Line 654... | ||
- | 654 | width = w; |
|
- | 655 | height = h; |
|
621 | b[n++] = br13; |
656 | |
622 | b[n++] = (y << 16) | x; |
657 | if( blit_clip(&dst_clip, &dst_x, &dst_y, |
Line 623... | Line -... | ||
623 | b[n++] = ( (y+h) << 16) | (x+w); // bottom, right |
- | |
624 | b[n++] = 0; // dst_offset |
658 | &src_clip, &src_x, &src_y, |
625 | b[n++] = 0; //src_top|src_left |
659 | &width, &height) ) |
Line 626... | Line -... | ||
626 | - | ||
627 | b[n++] = pitch; |
- | |
628 | b[n++] = (u32_t)src_offset; |
660 | return 0; |
629 | 661 | ||
630 | b[n++] = MI_BATCH_BUFFER_END; |
- | |
631 | if( n & 1) |
- | |
632 | b[n++] = MI_NOOP; |
- | |
633 | - | ||
Line -... | Line 662... | ||
- | 662 | dst_x+= winrc.left; |
|
- | 663 | dst_y+= winrc.top; |
|
Line -... | Line 664... | ||
- | 664 | ||
- | 665 | slot = *((u8*)CURRENT_TASK); |
|
- | 666 | ||
- | 667 | slot_mask = (u32_t)slot<<24; |
|
- | 668 | ||
- | 669 | { |
|
- | 670 | #if 0 |
|
- | 671 | static v4si write_mask = {0xFF000000, 0xFF000000, |
|
- | 672 | 0xFF000000, 0xFF000000}; |
|
- | 673 | ||
- | 674 | u8* src_offset; |
|
- | 675 | u8* dst_offset; |
|
634 | // i915_gem_object_set_to_gtt_domain(obj, false); |
676 | |
- | 677 | src_offset = (u8*)(src_y*bitmap->pitch + src_x*4); |
|
- | 678 | src_offset += (u32)bitmap->uaddr; |
|
- | 679 | ||
- | 680 | dst_offset = (u8*)(dst_y*os_display->width + dst_x); |
|
- | 681 | dst_offset+= get_display_map(); |
|
- | 682 | ||
- | 683 | u32_t tmp_h = height; |
|
- | 684 | ||
- | 685 | __asm__ __volatile__ ( |
|
635 | 686 | "movdqa %[write_mask], %%xmm7 \n" |
|
- | 687 | "movd %[slot_mask], %%xmm6 \n" |
|
- | 688 | "punpckldq %%xmm6, %%xmm6 \n" |
|
- | 689 | "punpcklqdq %%xmm6, %%xmm6 \n" |
|
- | 690 | :: [write_mask] "m" (write_mask), |
|
- | 691 | [slot_mask] "g" (slot_mask) |
|
- | 692 | :"xmm7", "xmm6"); |
|
- | 693 | ||
- | 694 | while( tmp_h--) |
|
- | 695 | { |
|
- | 696 | u32_t tmp_w = width; |
|
- | 697 | ||
- | 698 | u8* tmp_src = src_offset; |
|
- | 699 | u8* tmp_dst = dst_offset; |
|
- | 700 | ||
- | 701 | src_offset+= bitmap->pitch; |
|
- | 702 | dst_offset+= os_display->width; |
|
- | 703 | ||
636 | ring = &dev_priv->ring[BCS]; |
704 | while( tmp_w >= 8 ) |
Line -... | Line 705... | ||
- | 705 | { |
|
- | 706 | __asm__ __volatile__ ( |
|
- | 707 | "movq (%0), %%xmm0 \n" |
|
- | 708 | "punpcklbw %%xmm0, %%xmm0 \n" |
|
- | 709 | "movdqa %%xmm0, %%xmm1 \n" |
|
- | 710 | "punpcklwd %%xmm0, %%xmm0 \n" |
|
- | 711 | "punpckhwd %%xmm1, %%xmm1 \n" |
|
- | 712 | "pcmpeqb %%xmm6, %%xmm0 \n" |
|
- | 713 | "pcmpeqb %%xmm6, %%xmm1 \n" |
|
- | 714 | "maskmovdqu %%xmm7, %%xmm0 \n" |
|
- | 715 | "addl $16, %%edi \n" |
|
- | 716 | "maskmovdqu %%xmm7, %%xmm1 \n" |
|
- | 717 | :: "r" (tmp_dst), "D" (tmp_src) |
|
- | 718 | :"xmm0", "xmm1"); |
|
Line 637... | Line -... | ||
637 | ring->dispatch_execbuffer(ring, cmd_offset, n*4); |
- | |
638 | 719 | __asm__ __volatile__ ("":::"edi"); |
|
639 | intel_ring_begin(ring, 4); |
720 | tmp_w -= 8; |
640 | // if (ret) |
721 | tmp_src += 32; |
- | 722 | tmp_dst += 8; |
|
- | 723 | }; |
|
- | 724 | ||
- | 725 | if( tmp_w >= 4 ) |
|
- | 726 | { |
|
- | 727 | __asm__ __volatile__ ( |
|
641 | // return ret; |
728 | "movd (%0), %%xmm0 \n" |
Line 642... | Line 729... | ||
642 | 729 | "punpcklbw %%xmm0, %%xmm0 \n" |
|
643 | // cmd = MI_FLUSH_DW; |
730 | "punpcklwd %%xmm0, %%xmm0 \n" |
644 | // if (invalidate & I915_GEM_GPU_DOMAINS) |
- | |
Line -... | Line 731... | ||
- | 731 | "pcmpeqb %%xmm6, %%xmm0 \n" |
|
645 | // cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD; |
732 | "maskmovdqu %%xmm7, %%xmm0 \n" |
Line 646... | Line -... | ||
646 | intel_ring_emit(ring, MI_FLUSH_DW); |
- | |
647 | intel_ring_emit(ring, 0); |
733 | :: "r" (tmp_dst), "D" (tmp_src) |
Line -... | Line 734... | ||
- | 734 | :"xmm0"); |
|
- | 735 | tmp_w -= 4; |
|
648 | intel_ring_emit(ring, 0); |
736 | tmp_src += 16; |
Line 649... | Line 737... | ||
649 | intel_ring_emit(ring, MI_NOOP); |
737 | tmp_dst += 4; |
650 | intel_ring_advance(ring); |
738 | }; |
Line 651... | Line 739... | ||
651 | 739 | ||
652 | 740 | while( tmp_w--) |
|
Line -... | Line 741... | ||
- | 741 | { |
|
- | 742 | *(tmp_src+3) = (*tmp_dst==slot)?0xFF:0x00; |
|
- | 743 | tmp_src+=4; |
|
- | 744 | tmp_dst++; |
|
- | 745 | }; |
|
- | 746 | }; |
|
- | 747 | #else |
|
- | 748 | u8* src_offset; |
|
- | 749 | u8* dst_offset; |
|
- | 750 | ||
- | 751 | src_offset = (u8*)(src_y*bitmap->pitch + src_x*4); |
|
- | 752 | src_offset += (u32)bitmap->uaddr; |
|
- | 753 | ||
653 | fail: |
754 | dst_offset = (u8*)(dst_y*os_display->width + dst_x); |
Line 654... | Line 755... | ||
654 | return -1; |
755 | dst_offset+= get_display_map(); |
Line -... | Line 756... | ||
- | 756 | ||
655 | }; |
757 | u32_t tmp_h = height; |
Line 656... | Line -... | ||
656 | - | ||
657 | 758 | ||
658 | int blit_video(u32 hbitmap, int dst_x, int dst_y, |
759 | while( tmp_h--) |
659 | int src_x, int src_y, u32 w, u32 h) |
760 | { |
Line 660... | Line 761... | ||
660 | { |
761 | u32_t tmp_w = width; |
661 | drm_i915_private_t *dev_priv = main_device->dev_private; |
762 | |
662 | struct intel_ring_buffer *ring; |
763 | u8* tmp_src = src_offset; |
663 | 764 | u8* tmp_dst = dst_offset; |
|
664 | bitmap_t *bitmap; |
765 | |
665 | u32_t br13, cmd, *b; |
766 | src_offset+= bitmap->pitch; |
- | 767 | dst_offset+= os_display->width; |
|
- | 768 | ||
Line 666... | Line 769... | ||
666 | u32_t offset; |
769 | while( tmp_w--) |
667 | 770 | { |
|
Line 668... | Line 771... | ||
668 | int n=0; |
771 | *(tmp_src+3) = (*tmp_dst==slot)?0xFF:0x00; |
669 | 772 | tmp_src+=4; |
|
670 | if(unlikely(hbitmap==0)) |
773 | tmp_dst++; |
Line 671... | Line 774... | ||
671 | return -1; |
774 | }; |
Line -... | Line 775... | ||
- | 775 | }; |
|
672 | 776 | } |
|
- | 777 | #endif |
|
- | 778 | ||
- | 779 | if((cmd_buffer & 0xFC0)==0xFC0) |
|
673 | bitmap = hman_get_data(&bm_man, hbitmap); |
780 | cmd_buffer&= 0xFFFFF000; |
Line 674... | Line 781... | ||
674 | 781 | ||
675 | if(unlikely(bitmap==NULL)) |
782 | b = (u32_t*)ALIGN(cmd_buffer,16); |
676 | return -1; |
783 |