- /* TODO: There are still a few optimization opportunities here. For certain
- * combinations it is possible to reorder the operations and therefore saving
- * some instructions. */
+ if (blend->logicop_enable) {
+ if(!type.floating) {
+ result = lp_build_logicop(gallivm->builder, blend->logicop_func, src, dst);
+ }
+ else {
+ result = src;
+ }
+ } else if (!state->blend_enable) {
+ result = src;
+ } else {
+ boolean rgb_alpha_same = (state->rgb_src_factor == state->rgb_dst_factor && state->alpha_src_factor == state->alpha_dst_factor) || nr_channels == 1;
+
+ src_factor = lp_build_blend_factor(&bld, state->rgb_src_factor,
+ state->alpha_src_factor,
+ alpha_swizzle,
+ nr_channels);
+
+ dst_factor = lp_build_blend_factor(&bld, state->rgb_dst_factor,
+ state->alpha_dst_factor,
+ alpha_swizzle,
+ nr_channels);
+
+ result = lp_build_blend(&bld.base,
+ state->rgb_func,
+ state->rgb_src_factor,
+ state->rgb_dst_factor,
+ src,
+ dst,
+ src_factor,
+ dst_factor,
+ rgb_alpha_same,
+ false);
+
+ if(state->rgb_func != state->alpha_func && nr_channels > 1 && alpha_swizzle != UTIL_FORMAT_SWIZZLE_NONE) {
+ LLVMValueRef alpha;
+
+ alpha = lp_build_blend(&bld.base,
+ state->alpha_func,
+ state->alpha_src_factor,
+ state->alpha_dst_factor,
+ src,
+ dst,
+ src_factor,
+ dst_factor,
+ rgb_alpha_same,
+ false);
+
+ result = lp_build_blend_swizzle(&bld,
+ result,
+ alpha,
+ LP_BUILD_BLEND_SWIZZLE_RGBA,
+ alpha_swizzle,
+ nr_channels);
+ }
+ }