Subversion Repositories Kolibri OS

Rev

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