mesa/src/util/blend.h

101 lines
2.5 KiB
C

/*
* Copyright 2023 Valve Corporation
* Copyright 2007 VMware, Inc.
* SPDX-License-Identifier: MIT
*/
#ifndef UTIL_BLEND_H
#define UTIL_BLEND_H
#include <stdbool.h>
#define PIPE_BLENDFACTOR_INVERT_BIT (0x10)
enum pipe_blendfactor {
PIPE_BLENDFACTOR_ONE = 1,
PIPE_BLENDFACTOR_SRC_COLOR,
PIPE_BLENDFACTOR_SRC_ALPHA,
PIPE_BLENDFACTOR_DST_ALPHA,
PIPE_BLENDFACTOR_DST_COLOR,
PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE,
PIPE_BLENDFACTOR_CONST_COLOR,
PIPE_BLENDFACTOR_CONST_ALPHA,
PIPE_BLENDFACTOR_SRC1_COLOR,
PIPE_BLENDFACTOR_SRC1_ALPHA,
PIPE_BLENDFACTOR_ZERO = PIPE_BLENDFACTOR_INVERT_BIT | PIPE_BLENDFACTOR_ONE,
PIPE_BLENDFACTOR_INV_SRC_COLOR,
PIPE_BLENDFACTOR_INV_SRC_ALPHA,
PIPE_BLENDFACTOR_INV_DST_ALPHA,
PIPE_BLENDFACTOR_INV_DST_COLOR,
/* Intentionally weird wrapping due to Gallium trace parsing this file */
PIPE_BLENDFACTOR_INV_CONST_COLOR = PIPE_BLENDFACTOR_INVERT_BIT
| PIPE_BLENDFACTOR_CONST_COLOR,
PIPE_BLENDFACTOR_INV_CONST_ALPHA,
PIPE_BLENDFACTOR_INV_SRC1_COLOR,
PIPE_BLENDFACTOR_INV_SRC1_ALPHA,
};
static inline bool
util_blendfactor_is_inverted(enum pipe_blendfactor factor)
{
/* By construction of the enum */
return (factor & PIPE_BLENDFACTOR_INVERT_BIT);
}
static inline enum pipe_blendfactor
util_blendfactor_without_invert(enum pipe_blendfactor factor)
{
/* By construction of the enum */
return (enum pipe_blendfactor)(factor & ~PIPE_BLENDFACTOR_INVERT_BIT);
}
enum pipe_blend_func {
PIPE_BLEND_ADD,
PIPE_BLEND_SUBTRACT,
PIPE_BLEND_REVERSE_SUBTRACT,
PIPE_BLEND_MIN,
PIPE_BLEND_MAX,
};
enum pipe_logicop {
PIPE_LOGICOP_CLEAR,
PIPE_LOGICOP_NOR,
PIPE_LOGICOP_AND_INVERTED,
PIPE_LOGICOP_COPY_INVERTED,
PIPE_LOGICOP_AND_REVERSE,
PIPE_LOGICOP_INVERT,
PIPE_LOGICOP_XOR,
PIPE_LOGICOP_NAND,
PIPE_LOGICOP_AND,
PIPE_LOGICOP_EQUIV,
PIPE_LOGICOP_NOOP,
PIPE_LOGICOP_OR_INVERTED,
PIPE_LOGICOP_COPY,
PIPE_LOGICOP_OR_REVERSE,
PIPE_LOGICOP_OR,
PIPE_LOGICOP_SET,
};
/**
* When faking RGBX render target formats with RGBA ones, the blender is still
* supposed to treat the destination's alpha channel as 1 instead of the
* garbage that's there. Return a blend factor that will take that into
* account.
*/
static inline enum pipe_blendfactor
util_blend_dst_alpha_to_one(enum pipe_blendfactor factor)
{
switch (factor) {
case PIPE_BLENDFACTOR_DST_ALPHA:
return PIPE_BLENDFACTOR_ONE;
case PIPE_BLENDFACTOR_INV_DST_ALPHA:
return PIPE_BLENDFACTOR_ZERO;
default:
return factor;
}
}
#endif