Fix several cases where optimized paths were hit when they shouldn't be.
This fixes a number of rendercheck cases.
(cherry picked from commit 6fdfd9dad9
)
This commit is contained in:
parent
9bc6752f68
commit
fe37d26f30
15
fb/fbpict.c
15
fb/fbpict.c
|
@ -891,9 +891,8 @@ fbComposite (CARD8 op,
|
|||
case PictOpOver:
|
||||
if (pMask)
|
||||
{
|
||||
if (srcRepeat &&
|
||||
pSrc->pDrawable->width == 1 &&
|
||||
pSrc->pDrawable->height == 1)
|
||||
if (fbCanGetSolid(pSrc) &&
|
||||
!maskRepeat)
|
||||
{
|
||||
srcRepeat = FALSE;
|
||||
if (PICT_FORMAT_COLOR(pSrc->format)) {
|
||||
|
@ -1005,7 +1004,7 @@ fbComposite (CARD8 op,
|
|||
{
|
||||
if (pSrc->pDrawable == pMask->pDrawable &&
|
||||
xSrc == xMask && ySrc == yMask &&
|
||||
!pMask->componentAlpha)
|
||||
!pMask->componentAlpha && !maskRepeat)
|
||||
{
|
||||
/* source == mask: non-premultiplied data */
|
||||
switch (pSrc->format) {
|
||||
|
@ -1069,9 +1068,7 @@ fbComposite (CARD8 op,
|
|||
else
|
||||
{
|
||||
/* non-repeating source, repeating mask => translucent window */
|
||||
if (maskRepeat &&
|
||||
pMask->pDrawable->width == 1 &&
|
||||
pMask->pDrawable->height == 1)
|
||||
if (fbCanGetSolid(pMask))
|
||||
{
|
||||
if (pSrc->format == PICT_x8r8g8b8 &&
|
||||
pDst->format == PICT_x8r8g8b8 &&
|
||||
|
@ -1088,9 +1085,7 @@ fbComposite (CARD8 op,
|
|||
}
|
||||
else /* no mask */
|
||||
{
|
||||
if (srcRepeat &&
|
||||
pSrc->pDrawable->width == 1 &&
|
||||
pSrc->pDrawable->height == 1)
|
||||
if (fbCanGetSolid(pSrc))
|
||||
{
|
||||
/* no mask and repeating source */
|
||||
switch (pSrc->format) {
|
||||
|
|
47
fb/fbpict.h
47
fb/fbpict.h
|
@ -30,6 +30,13 @@
|
|||
|
||||
#include "renderedge.h"
|
||||
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define INLINE __inline__
|
||||
#else
|
||||
#define INLINE
|
||||
#endif
|
||||
|
||||
#define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
|
||||
#define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b))
|
||||
|
||||
|
@ -67,6 +74,40 @@
|
|||
#define Green(x) (((x) >> 8) & 0xff)
|
||||
#define Blue(x) ((x) & 0xff)
|
||||
|
||||
/**
|
||||
* Returns TRUE if the fbComposeGetSolid can be used to get a single solid
|
||||
* color representing every source sampling location of the picture.
|
||||
*/
|
||||
static INLINE Bool
|
||||
fbCanGetSolid(PicturePtr pict)
|
||||
{
|
||||
if (pict->pDrawable == NULL ||
|
||||
pict->pDrawable->width != 1 ||
|
||||
pict->pDrawable->height != 1)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (pict->repeat != RepeatNormal)
|
||||
return FALSE;
|
||||
|
||||
switch (pict->format) {
|
||||
case PICT_a8r8g8b8:
|
||||
case PICT_x8r8g8b8:
|
||||
case PICT_a8b8g8r8:
|
||||
case PICT_x8b8g8r8:
|
||||
case PICT_r8g8b8:
|
||||
case PICT_b8g8r8:
|
||||
case PICT_r5g6b5:
|
||||
case PICT_b5g6r5:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#define fbCanGetSolid(pict) \
|
||||
(pict->pDrawable != NULL && pict->pDrawable->width == 1 && pict->pDrawable->height == 1)
|
||||
|
||||
#define fbComposeGetSolid(pict, bits, fmt) { \
|
||||
FbBits *__bits__; \
|
||||
FbStride __stride__; \
|
||||
|
@ -321,12 +362,6 @@
|
|||
#define FASTCALL
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define INLINE __inline__
|
||||
#else
|
||||
#define INLINE
|
||||
#endif
|
||||
|
||||
typedef struct _FbComposeData {
|
||||
CARD8 op;
|
||||
PicturePtr src;
|
||||
|
|
Loading…
Reference in New Issue
Block a user