diff options
author | David 'Digit' Turner <digit@android.com> | 2011-07-08 04:42:04 +0200 |
---|---|---|
committer | David 'Digit' Turner <digit@android.com> | 2011-07-08 04:42:04 +0200 |
commit | 22ee8437f45a01c6e1d8e33dd85bb9df18ca1e8b (patch) | |
tree | 7fbd191ec73155550a0b795a658ccef0fb844730 /android | |
parent | e351d6bdebc0d4c6d0b9f4f3b6837b35e03804ad (diff) | |
download | external_qemu-22ee8437f45a01c6e1d8e33dd85bb9df18ca1e8b.zip external_qemu-22ee8437f45a01c6e1d8e33dd85bb9df18ca1e8b.tar.gz external_qemu-22ee8437f45a01c6e1d8e33dd85bb9df18ca1e8b.tar.bz2 |
Fix window scaling issue.
This patch fixes a bug in the MMX scaling code. The MMX state was not
properly empties when we started the scaling functions. The end result
was that, if the hardware FPU was in a certain state, rendering would
be be erratic.
Fixes http://code.google.com/p/android/issues/detail?id=18299
This bug was hard to reproduce, but the fact that it never happens
when building a debug version (with -O0) of the emulator indicated
a problem in the generated instruction stream.
Glad this isn't a compiler error though :)
Change-Id: Icea04a7152b8fa5d81cb70cc215c0cd95aed2142
Diffstat (limited to 'android')
-rw-r--r-- | android/skin/argb.h | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/android/skin/argb.h b/android/skin/argb.h index 436a9c8..d71a914 100644 --- a/android/skin/argb.h +++ b/android/skin/argb.h @@ -39,12 +39,6 @@ mmx_expand16( int value ) return _mm_packs_pi32( t1, t1 ); } -static inline int -mmx_makescale( double s ) -{ - return (int)(s*(1 << 16)); -} - static inline mmx_t mmx_mulshift( mmx_t argb, int multiplier, int rshift, mmx_t zero ) { @@ -237,6 +231,8 @@ ARGB_SCALE_GENERIC( ScaleOp* op ) int ix = op->ix; int iy = op->iy; + _mm_empty(); + src_line += (sx >> 16)*4 + (sy >> 16)*src_pitch; sx &= 0xffff; sy &= 0xffff; @@ -331,6 +327,8 @@ scale_05_to_10( ScaleOp* op ) int ix = op->ix; int iy = op->iy; + _mm_empty(); + src_line += (sx >> 16)*4 + (sy >> 16)*src_pitch; sx &= 0xffff; sy &= 0xffff; @@ -468,6 +466,8 @@ scale_up_bilinear( ScaleOp* op ) int xlimit, ylimit; int h, sx0; + _mm_empty(); + /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ /* the four nearest source pixels, which are at (0.5,0.5) offsets */ @@ -553,6 +553,8 @@ ARGB_SCALE_UP_QUICK_4x4( ScaleOp* op ) int xlimit, ylimit; int h, sx0; + _mm_empty(); + /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ /* the four nearest source pixels, which are at (0.5,0.5) offsets */ @@ -805,6 +807,8 @@ ARGB_SCALE_NEAREST( ScaleOp* op ) int xlimit, ylimit; int h, sx0; + _mm_empty(); + /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ /* the four nearest source pixels, which are at (0.5,0.5) offsets */ |