diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_blit.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_blit.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c index d988eece0187..5ea432347589 100644 --- a/drivers/gpu/drm/radeon/r600_blit.c +++ b/drivers/gpu/drm/radeon/r600_blit.c | |||
@@ -774,11 +774,10 @@ r600_blit_swap(struct drm_device *dev, | |||
774 | { | 774 | { |
775 | drm_radeon_private_t *dev_priv = dev->dev_private; | 775 | drm_radeon_private_t *dev_priv = dev->dev_private; |
776 | int cb_format, tex_format; | 776 | int cb_format, tex_format; |
777 | int sx2, sy2, dx2, dy2; | ||
777 | u64 vb_addr; | 778 | u64 vb_addr; |
778 | u32 *vb; | 779 | u32 *vb; |
779 | 780 | ||
780 | vb = r600_nomm_get_vb_ptr(dev); | ||
781 | |||
782 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { | 781 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { |
783 | 782 | ||
784 | r600_nomm_put_vb(dev); | 783 | r600_nomm_put_vb(dev); |
@@ -787,19 +786,13 @@ r600_blit_swap(struct drm_device *dev, | |||
787 | return; | 786 | return; |
788 | 787 | ||
789 | set_shaders(dev); | 788 | set_shaders(dev); |
790 | vb = r600_nomm_get_vb_ptr(dev); | ||
791 | } | 789 | } |
790 | vb = r600_nomm_get_vb_ptr(dev); | ||
792 | 791 | ||
793 | if (cpp == 4) { | 792 | sx2 = sx + w; |
794 | cb_format = COLOR_8_8_8_8; | 793 | sy2 = sy + h; |
795 | tex_format = FMT_8_8_8_8; | 794 | dx2 = dx + w; |
796 | } else if (cpp == 2) { | 795 | dy2 = dy + h; |
797 | cb_format = COLOR_5_6_5; | ||
798 | tex_format = FMT_5_6_5; | ||
799 | } else { | ||
800 | cb_format = COLOR_8; | ||
801 | tex_format = FMT_8; | ||
802 | } | ||
803 | 796 | ||
804 | vb[0] = i2f(dx); | 797 | vb[0] = i2f(dx); |
805 | vb[1] = i2f(dy); | 798 | vb[1] = i2f(dy); |
@@ -807,31 +800,46 @@ r600_blit_swap(struct drm_device *dev, | |||
807 | vb[3] = i2f(sy); | 800 | vb[3] = i2f(sy); |
808 | 801 | ||
809 | vb[4] = i2f(dx); | 802 | vb[4] = i2f(dx); |
810 | vb[5] = i2f(dy + h); | 803 | vb[5] = i2f(dy2); |
811 | vb[6] = i2f(sx); | 804 | vb[6] = i2f(sx); |
812 | vb[7] = i2f(sy + h); | 805 | vb[7] = i2f(sy2); |
806 | |||
807 | vb[8] = i2f(dx2); | ||
808 | vb[9] = i2f(dy2); | ||
809 | vb[10] = i2f(sx2); | ||
810 | vb[11] = i2f(sy2); | ||
813 | 811 | ||
814 | vb[8] = i2f(dx + w); | 812 | switch(cpp) { |
815 | vb[9] = i2f(dy + h); | 813 | case 4: |
816 | vb[10] = i2f(sx + w); | 814 | cb_format = COLOR_8_8_8_8; |
817 | vb[11] = i2f(sy + h); | 815 | tex_format = FMT_8_8_8_8; |
816 | break; | ||
817 | case 2: | ||
818 | cb_format = COLOR_5_6_5; | ||
819 | tex_format = FMT_5_6_5; | ||
820 | break; | ||
821 | default: | ||
822 | cb_format = COLOR_8; | ||
823 | tex_format = FMT_8; | ||
824 | break; | ||
825 | } | ||
818 | 826 | ||
819 | /* src */ | 827 | /* src */ |
820 | set_tex_resource(dev_priv, tex_format, | 828 | set_tex_resource(dev_priv, tex_format, |
821 | src_pitch / cpp, | 829 | src_pitch / cpp, |
822 | sy + h, src_pitch / cpp, | 830 | sy2, src_pitch / cpp, |
823 | src_gpu_addr); | 831 | src_gpu_addr); |
824 | 832 | ||
825 | cp_set_surface_sync(dev_priv, | 833 | cp_set_surface_sync(dev_priv, |
826 | R600_TC_ACTION_ENA, (src_pitch * (sy + h)), src_gpu_addr); | 834 | R600_TC_ACTION_ENA, src_pitch * sy2, src_gpu_addr); |
827 | 835 | ||
828 | /* dst */ | 836 | /* dst */ |
829 | set_render_target(dev_priv, cb_format, | 837 | set_render_target(dev_priv, cb_format, |
830 | dst_pitch / cpp, dy + h, | 838 | dst_pitch / cpp, dy2, |
831 | dst_gpu_addr); | 839 | dst_gpu_addr); |
832 | 840 | ||
833 | /* scissors */ | 841 | /* scissors */ |
834 | set_scissors(dev_priv, dx, dy, dx + w, dy + h); | 842 | set_scissors(dev_priv, dx, dy, dx2, dy2); |
835 | 843 | ||
836 | /* Vertex buffer setup */ | 844 | /* Vertex buffer setup */ |
837 | vb_addr = dev_priv->gart_buffers_offset + | 845 | vb_addr = dev_priv->gart_buffers_offset + |
@@ -844,7 +852,7 @@ r600_blit_swap(struct drm_device *dev, | |||
844 | 852 | ||
845 | cp_set_surface_sync(dev_priv, | 853 | cp_set_surface_sync(dev_priv, |
846 | R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA, | 854 | R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA, |
847 | dst_pitch * (dy + h), dst_gpu_addr); | 855 | dst_pitch * dy2, dst_gpu_addr); |
848 | 856 | ||
849 | dev_priv->blit_vb->used += 12 * 4; | 857 | dev_priv->blit_vb->used += 12 * 4; |
850 | } | 858 | } |