diff options
Diffstat (limited to 'engines/sci/gfx')
-rw-r--r-- | engines/sci/gfx/alpha_mvi_crossblit.cpp | 357 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_support.cpp | 15 |
2 files changed, 0 insertions, 372 deletions
diff --git a/engines/sci/gfx/alpha_mvi_crossblit.cpp b/engines/sci/gfx/alpha_mvi_crossblit.cpp deleted file mode 100644 index 37746c5517..0000000000 --- a/engines/sci/gfx/alpha_mvi_crossblit.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/** MUST be compiled with -mcpu=cv6! */ - -#include <gfx_tools.h> - - -#ifdef HAVE_ALPHA_EV6_SUPPORT - -#ifdef __DECC -# include "c_asm.h" -# define USE_C_CODE -#else /* GNU C */ -# undef USE_C_CODE -#endif - -void -FUNCT_NAME(byte *dest, byte *src, int bytes_per_dest_line, int bytes_per_src_line, - int xl, int yl, byte *alpha, int bytes_per_alpha_line, int bytes_per_alpha_pixel, - unsigned int alpha_test_mask, int alpha_shift -#ifdef PRIORITY - , byte *priority_pos , int bytes_per_priority_line, int bytes_per_priority_pixel, int priority -#endif - ) { -#ifdef USE_C_CODE -#ifdef PRIORITY - int left_mask = (255 << (((unsigned long) dest) & 7)) & 255; - int right_mask = (255 >> (((unsigned long) dest + bytes_per_dest_line) & 7)); -#endif - unsigned long data; - - assert(!(bytes_per_alpha_line & 7)); - assert(!(((unsigned long) src) & 3)); - assert(!(((unsigned long) dest) & 3)); - assert(bytes_per_alpha_pixel < 2); - - yl++; - while (--yl) { - int x; - byte *dest_next = dest + bytes_per_dest_line; - byte *src_next = src + bytes_per_src_line; -#ifdef PRIORITY - byte *pri_next = priority_pos + bytes_per_priority_line; -#endif - asm("ldl $31, 0($31)\n\t" - "ldl $31, 0($31)\n\t"); /* Prefetch memory for next line */ - - if (((unsigned long)src) & 4) - data = *((unsigned int *) src); - - for (x = xl; x > 0; x--) { - unsigned long alpha; - - if (!(((unsigned long)src) & 4)) - data = *((unsigned long *) src); - alpha = (data & alpha_test_mask) >> alpha_shift; - - if ( -#ifdef PRIORITY - (*priority_pos <= priority) && -#endif - alpha != 255) { - unsigned long result; - unsigned long orig; - unsigned long unpkdata; - - unpkdata = asm("unpkbw %0, %v0\n\t", data); - - result = unpkdata * (255 - alpha); - - orig = *((unsigned int *) dest); - - orig = asm("unpkbw %0, %v0\n\t", orig); - - result += orig * alpha; - src += 4; - - result >>= 8; - - result = asm("pkwb %0, %v0\n\t", result); - - data >>= 32; - *((unsigned int *) dest) = result; -#ifdef PRIORITY - *priority_pos = priority; -#endif - dest += 4; - } else { - data >>= 32; - src += 4; - dest += 4; - } - -#ifdef PRIORITY - priority_pos++; -#endif - } - - dest = dest_next; - src = src_next; -#ifdef PRIORITY - priority_pos = pri_next; -#endif - } -#else - unsigned long real_alpha_shift = alpha_shift; -#ifdef PRIORITY - assert(!(bytes_per_alpha_line & 7)); - assert(bytes_per_alpha_pixel < 2); - real_alpha_shift |= (unsigned long)(priority << 16) | ((unsigned long) bytes_per_priority_pixel << 32); - /* Work around gcc design bug allowing only 10 asm parameters */ -#endif - __asm__ __volatile__( -#ifdef PRIORITY - /* - ** dest: $16 - ** src: $17 - ** bytes_per_dest_line: $18 - ** bytes_per_src_line: $19 - ** xl : $20 - ** yl : $21 - ** alpha_test_mask: $24 - ** alpha_shift: $25 - ** 255: $8 - ** - ** bytes_per_priority_line: $9 - ** priority_pos: $10 - ** priority extended to 8 bytes: $7 - ** bytes_per_priority_pixel: $6 - ** - ** temp_priority_collection: $11 - ** priority_pos backup: $12 - ** left border mask: $13 - ** right border mask: $28 - ** priority test bit: $15 - ** ldq4priority result: $26 - */ - - "lda $30, -88($30) \n\t" - "stq $9, 0($30) \n\t" - "stq $10, 8($30) \n\t" - "stq $11, 16($30) \n\t" - "stq $12, 24($30) \n\t" - "stq $13, 32($30) \n\t" - "stq $15, 40($30) \n\t" - "stq $26, 48($30) \n\t" - "stq %8, 56($30) \n\t" - "stq %9, 64($30) \n\t" - "stq $7, 72($30) \n\t" - "stq $6, 80($30) \n\t" - - "mov %8, $9 \n\t" - "mov %9, $10 \n\t" -#endif - "mov %6, $24 \n\t" - "mov %7, $25 \n\t" - "mov 255, $8 \n\t" - "subl $21, 1, $21 \n\t" -#ifdef PRIORITY - - /* Defrobnicate real_alpha_shift data */ - "srl $25, 32, $6 \n\t" - "srl $25, 16, $7 \n\t" - "and $7, $8, $7 \n\t" - - /* Load first priority data quad */ - "andnot $10, 7, $0 \n\t" - "ldq $26, 0($0) \n\t" /* Load priority */ - "and $10, 7, $13 \n\t" - "sll $13, 3, $0 \n\t" - - /* Calculate right border mask */ - "addl $13, $20, $28\n\t" - "and $28, 7, $28 \n\t" - "beq $28, 7f \n\t" - "mov 8, $0 \n\t" - "subl $0, $28, $28 \n" - "7:\n\t" - "srl $8, $28, $28 \n\t" - /* Left border mask */ - "sll $8, $13, $13 \n\t" - "and $13, $8, $13 \n\t" - - "mov $10, $12 \n\t" - - "sll $7, 8, $0 \n\t" - "or $7, $0, $7 \n\t" - "sll $7, 16, $0 \n\t" - "or $7, $0, $7 \n\t" - "sll $7, 32, $0 \n\t" - "or $7, $0, $7 \n\t" - "cmpbge $7, $26, $3 \n\t" - - "and $10, 7, $0 \n\t" /* Init priority bitptr */ - "mov 1, $15 \n\t" /* .. */ - "sll $15, $0, $15 \n\t" /* .. */ - - /* -> Priority buffer */ - "and $3, $13, $11 \n\t" - "cmplt $20, 8, $0 \n\t" - "beq $0, 6f \n\t" - "and $11, $28, $11 \n\t" - "6:\n\t" -#endif - "and $25, $8, $25 \n\t" - - /***/ - /*** Variable settings apply NOW ***/ - /***/ - - "mov $20, $1 \n\t" - "mov $16, $2 \n\t" - "mov $17, $3 \n" - "8:\n\t" - "addq $2, $18, $2 \n\t" - "ldl $31, 0($2) \n\t" /* Prefetch dest */ - "addq $3, $19, $3 \n\t" - "ldl $31, 0($3) \n" /* Prefetch src */ - "1:\n\t" - "addq $17, 4, $17 \n\t" - "beq $20, 3f \n\t" - "subl $20, 1, $20 \n\t" -#ifdef PRIORITY - "5:\n\t" - "addq $10, 1, $10 \n\t" - "and $11, $15, $0 \n\t" /* Other priority beat our priority? */ - "beq $0, 2f \n\t" -#endif - "ldl $0, -4($17) \n\t" - "unpkbw $0, $5 \n\t" - "and $0, $24, $0 \n\t" - - "xor $0, $24, $4 \n\t" - "beq $4, 2f \n\t" - - "ldl $4, 0($16) \n\t" - "unpkbw $4, $4 \n\t" - "srl $0, $25, $0 \n\t" - "mulq $4, $0, $4 \n\t" - "subl $8, $0, $0 \n\t" - "mulq $5, $0, $5 \n\t" - "addq $4, $5, $4 \n\t" - "srl $4, 8, $4 \n\t" - "pkwb $4, $0 \n\t" - "stl $0, 0($16) \n\t" - "br 9f \n\t" - "2:\n" - "andnot $11, $15, $11 \n\t" /* Don't draw priority if we're fully transparent */ - "9:\n\t" - "addq $16, 4, $16 \n\t" -#ifdef PRIORITY - "sll $15, 1, $15 \n\t" - - "and $10, 7, $0 \n\t" /* Do we need to re-load priority mask? */ - /**/ "bne $0, 1b \n\t" - - /* Write back to priority buffer */ - "zap $26, $11, $26 \n\t" - "zapnot $7, $11, $0 \n\t" - "or $0, $26, $0 \n\t" - "stq $0, -8($10) \n\t" - - "ldq $26, 0($10) \n\t" /* Load priority */ - "cmpbge $7, $26, $11\n\t" - - "mov 1, $15 \n\t" /* Init bitcmpmask */ - - "cmplt $20, 8, $0 \n\t" - /**/ "beq $0, 1b \n\t" - "and $11, $28, $11 \n\t" -#endif - "br 1b \n" - "3:\n\t" -#ifdef PRIORITY - "and $10, 7, $16 \n\t" - "beq $16, 7f \n\t" - "and $11, $28, $11 \n\t" - "zap $26, $11, $26 \n\t" - "zapnot $7, $11, $0 \n\t" - "or $0, $26, $0 \n\t" - "andnot $10, 7, $16 \n\t" - "stq $0, 0($16) \n" /* Write back */ - "7:\n\t" - - "addq $9, $12, $12 \n\t" - "mov $12, $10 \n\t" - "andnot $10, 7, $0 \n\t" - "ldq $26, 0($0) \n\t" - - "and $10, 7, $0 \n\t" - "mov 1, $15 \n\t" - "sll $15, $0, $15 \n\t" /* Store priority-induced write-enable mask */ - - "cmpbge $7, $26, $16 \n\t" - /* -> Priority buffer */ - "and $16, $13, $11 \n\t" -#endif - "beq $21, 4f \n\t" - "subl $21, 1, $21 \n\t" - "mov $1, $20 \n\t" - "mov $2, $16 \n\t" /* Set line numbers for next line */ - "mov $3, $17 \n\t" - "br 8b \n" - "4:\n\t" -#ifdef PRIORITY - "ldq $9, 0($30) \n\t" - "ldq $10, 8($30) \n\t" - "ldq $11, 16($30) \n\t" - "ldq $12, 24($30) \n\t" - "ldq $13, 32($30) \n\t" - "ldq $15, 40($30) \n\t" - "ldq $26, 48($30) \n\t" - "ldq %8, 56($30) \n\t" - "ldq %9, 64($30) \n\t" - "ldq $7, 72($30) \n\t" - "ldq $6, 80($30) \n\t" - "lda $30, 88($30) \n\t" -#endif - : - : - "r"(dest), "r"(src), "r"(bytes_per_dest_line), - /*3*/ "r"(bytes_per_src_line), "r"(xl), "r"(yl), - /*6*/ "r"((unsigned long) alpha_test_mask), "r"(real_alpha_shift) -#ifdef PRIORITY - , "r"(bytes_per_priority_line), "r"(priority_pos) -#endif - : "%0", "%1", "%2", "%3", "%4", "%5", "%6", - "%7", "$16", "$17", "$18", "$19", "$20", "$21", "$24", "$25", - "$8", "memory" - ); -#endif -} - -#endif /* __alpha__ */ diff --git a/engines/sci/gfx/gfx_support.cpp b/engines/sci/gfx/gfx_support.cpp index a355154a78..c51c018024 100644 --- a/engines/sci/gfx/gfx_support.cpp +++ b/engines/sci/gfx/gfx_support.cpp @@ -386,18 +386,6 @@ gfx_crossblit_pixmap(gfx_mode_t *mode, gfx_pixmap_t *pxm, int priority, #endif } -#ifdef HAVE_ALPHA_EV6_SUPPORT - if (mode->alpha_mask && axp_have_mvi && bpp == 4) { - if (priority == GFX_NO_PRIORITY) - alpha_mvi_crossblit_32(dest, src, dest_line_width, pxm->xl * bpp, - xl, yl, NULL, 0, 0, mode->alpha_mask, 24 - mode->alpha_shift); - else - alpha_mvi_crossblit_32_P(dest, src, dest_line_width, pxm->xl * bpp, - xl, yl, NULL, 0, 0, mode->alpha_mask, 24 - mode->alpha_shift, - priority_pos, priority_line_width, priority_skip, priority); - } else { -#endif - if (alpha_mask & 0xff) alpha_min = ((alpha_mask * gfx_crossblit_alpha_threshold) >> 8) & alpha_mask; else @@ -431,9 +419,6 @@ gfx_crossblit_pixmap(gfx_mode_t *mode, gfx_pixmap_t *pxm, int priority, return GFX_ERROR; } } -#ifdef HAVE_ALPHA_EV6_SUPPORT - } -#endif return GFX_OK; } |