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; |