Subversion Repositories Kolibri OS

Rev

Rev 2005 | Rev 2160 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2005 Rev 2007
Line 841... Line 841...
841
			size_bytes -= cur_size * h;
841
			size_bytes -= cur_size * h;
842
		}
842
		}
843
	}
843
	}
844
}
844
}
Line -... Line 845...
-
 
845
 
-
 
846
 
-
 
847
void r600_kms_video_blit(struct radeon_device *rdev,
-
 
848
            u64 src_gpu_addr, int dstx, int dsty, int w, int h, int pitch)
-
 
849
{
-
 
850
    u64 vb_gpu_addr;
-
 
851
    u32 *vb;
-
 
852
 
-
 
853
    DRM_DEBUG("emitting video copy\n");
-
 
854
    vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used);
-
 
855
 
-
 
856
    if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) {
-
 
857
              // WARN_ON(1);
-
 
858
    }
-
 
859
 
-
 
860
    vb[0] = i2f(dstx);
-
 
861
    vb[1] = i2f(dsty);
-
 
862
    vb[2] = 0;
-
 
863
    vb[3] = 0;
-
 
864
 
-
 
865
    vb[4] = i2f(dstx);
-
 
866
    vb[5] = i2f(dsty+h);
-
 
867
    vb[6] = 0;
-
 
868
    vb[7] = i2f(h);
-
 
869
 
-
 
870
    vb[8] = i2f(dstx + w);
-
 
871
    vb[9] = i2f(dsty + h);
-
 
872
    vb[10] = i2f(w);
-
 
873
    vb[11] = i2f(h);
-
 
874
 
-
 
875
    /* src 9 */
-
 
876
    set_tex_resource(rdev, FMT_8_8_8_8,
-
 
877
                     w, h, pitch/4, src_gpu_addr);
-
 
878
    /* 5 */
-
 
879
    cp_set_surface_sync(rdev,
-
 
880
                        PACKET3_TC_ACTION_ENA, pitch * h, src_gpu_addr);
-
 
881
 
-
 
882
    /* dst 23 */
-
 
883
    set_render_target(rdev, COLOR_8_8_8_8,
-
 
884
                     1024, 768, rdev->mc.vram_start);
-
 
885
 
-
 
886
            /* scissors 12  */
-
 
887
    set_scissors(rdev, 0, 0, 1024, 768);
-
 
888
 
-
 
889
    /* Vertex buffer setup 14 */
-
 
890
    vb_gpu_addr = rdev->r600_blit.vb_ib->gpu_addr + rdev->r600_blit.vb_used;
-
 
891
    set_vtx_resource(rdev, vb_gpu_addr);
-
 
892
 
-
 
893
    /* draw 10 */
-
 
894
    draw_auto(rdev);
-
 
895
 
-
 
896
    /* 5 */
-
 
897
    cp_set_surface_sync(rdev,
-
 
898
                PACKET3_CB_ACTION_ENA | PACKET3_CB0_DEST_BASE_ENA,
-
 
899
                1024*4*768, rdev->mc.vram_start);
-
 
900
 
-
 
901
    /* 78 ring dwords per loop */
-
 
902
    vb += 12;
-
 
903
    rdev->r600_blit.vb_used += 12 * 4;
-
 
904
 
-
 
905
}
-
 
906
 
-
 
907
extern struct radeon_device *main_device;
-
 
908
 
-
 
909
int r600_video_blit(uint64_t src_offset, int  x, int y,
-
 
910
                    int w, int h, int pitch)
-
 
911
{
-
 
912
    int r;
-
 
913
    struct radeon_device *rdev = main_device;
-
 
914
 
-
 
915
    mutex_lock(&rdev->r600_blit.mutex);
-
 
916
    rdev->r600_blit.vb_ib = NULL;
-
 
917
    r = r600_blit_prepare_copy(rdev, h*pitch);
-
 
918
    if (r) {
-
 
919
//       if (rdev->r600_blit.vb_ib)
-
 
920
//           radeon_ib_free(rdev, &rdev->r600_blit.vb_ib);
-
 
921
        mutex_unlock(&rdev->r600_blit.mutex);
-
 
922
        return r;
-
 
923
    }
-
 
924
 
-
 
925
 
-
 
926
    r600_kms_video_blit(rdev, src_offset,x,y,w,h,pitch);
-
 
927
    r600_blit_done_copy(rdev, NULL);
-
 
928
    mutex_unlock(&rdev->r600_blit.mutex);
-
 
929
};
-
 
930
 
-
 
931
int r600_create_video(int w, int h, u32_t *outp)
-
 
932
{
-
 
933
    int r;
-
 
934
    struct radeon_device *rdev = main_device;
-
 
935
    struct radeon_bo *sobj = NULL;
-
 
936
    uint64_t saddr;
-
 
937
    void   *uaddr;
-
 
938
 
-
 
939
    size_t size;
-
 
940
    size_t pitch;
-
 
941
 
-
 
942
    pitch = radeon_align_pitch(rdev, w, 32, false) * 4;
-
 
943
 
-
 
944
    size = pitch * h;
-
 
945
    r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-
 
946
                         RADEON_GEM_DOMAIN_GTT, &sobj);
-
 
947
    if (r) {
-
 
948
        goto fail;
-
 
949
    }
-
 
950
    r = radeon_bo_reserve(sobj, false);
-
 
951
    if (unlikely(r != 0))
-
 
952
        goto fail;
-
 
953
    r = radeon_bo_pin(sobj, RADEON_GEM_DOMAIN_GTT, &saddr);
-
 
954
//   radeon_bo_unreserve(sobj);
-
 
955
    if (r) {
-
 
956
        goto fail;
-
 
957
    }
-
 
958
 
-
 
959
    r = radeon_bo_user_map(sobj, &uaddr);
-
 
960
    if (r) {
-
 
961
        goto fail;
-
 
962
    }
-
 
963
 
-
 
964
    ((uint64_t*)outp)[0] = saddr;
-
 
965
    outp[2] = uaddr;
-
 
966
    outp[3] = pitch;
-
 
967
 
-
 
968
    dbgprintf("Create video surface %x, mapped at %x pitch %d\n",
-
 
969
              (uint32_t)saddr, uaddr, pitch);
-
 
970
    return 0;
-
 
971
 
-
 
972
fail:
-
 
973
    return -1;