aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r600_blit.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_blit.c')
-rw-r--r--drivers/gpu/drm/radeon/r600_blit.c56
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}