1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * quad blending 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Brian Paul 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_dual_blend.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_context.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_state.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_quad.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_tile_cache.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_quad_pipe.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum format 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RGBA, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RGB, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LUMINANCE, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LUMINANCE_ALPHA, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INTENSITY 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Subclass of quad_stage */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct blend_quad_stage 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_stage base; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean clamp[PIPE_MAX_COLOR_BUFS]; /**< clamp colors to [0,1]? */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum format base_format[PIPE_MAX_COLOR_BUFS]; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum util_format_type format_type[PIPE_MAX_COLOR_BUFS]; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** cast wrapper */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct blend_quad_stage * 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_quad_stage(struct quad_stage *stage) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct blend_quad_stage *) stage; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_COPY(DST, SRC) \ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[0] = SRC[0]; \ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[1] = SRC[1]; \ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[2] = SRC[2]; \ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[3] = SRC[3]; \ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while(0) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_SCALAR(DST, SRC) \ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[0] = SRC; \ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[1] = SRC; \ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[2] = SRC; \ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DST[3] = SRC; \ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while(0) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_ADD(R, A, B) \ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = A[0] + B[0]; \ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = A[1] + B[1]; \ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = A[2] + B[2]; \ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = A[3] + B[3]; \ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_SUB(R, A, B) \ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = A[0] - B[0]; \ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = A[1] - B[1]; \ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = A[2] - B[2]; \ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = A[3] - B[3]; \ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Add and limit result to ceiling of 1.0 */ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_ADD_SAT(R, A, B) \ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = A[0] + B[0]; if (R[0] > 1.0f) R[0] = 1.0f; \ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = A[1] + B[1]; if (R[1] > 1.0f) R[1] = 1.0f; \ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = A[2] + B[2]; if (R[2] > 1.0f) R[2] = 1.0f; \ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = A[3] + B[3]; if (R[3] > 1.0f) R[3] = 1.0f; \ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Subtract and limit result to floor of 0.0 */ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_SUB_SAT(R, A, B) \ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = A[0] - B[0]; if (R[0] < 0.0f) R[0] = 0.0f; \ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = A[1] - B[1]; if (R[1] < 0.0f) R[1] = 0.0f; \ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = A[2] - B[2]; if (R[2] < 0.0f) R[2] = 0.0f; \ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = A[3] - B[3]; if (R[3] < 0.0f) R[3] = 0.0f; \ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_MUL(R, A, B) \ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = A[0] * B[0]; \ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = A[1] * B[1]; \ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = A[2] * B[2]; \ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = A[3] * B[3]; \ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_MIN(R, A, B) \ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = (A[0] < B[0]) ? A[0] : B[0]; \ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = (A[1] < B[1]) ? A[1] : B[1]; \ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = (A[2] < B[2]) ? A[2] : B[2]; \ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = (A[3] < B[3]) ? A[3] : B[3]; \ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC4_MAX(R, A, B) \ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[0] = (A[0] > B[0]) ? A[0] : B[0]; \ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[1] = (A[1] > B[1]) ? A[1] : B[1]; \ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[2] = (A[2] > B[2]) ? A[2] : B[2]; \ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R[3] = (A[3] > B[3]) ? A[3] : B[3]; \ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglogicop_quad(struct quad_stage *qs, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4], 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*dest)[4]) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = qs->softpipe; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubyte src[4][4], dst[4][4], res[4][4]; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *src4 = (uint *) src; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *dst4 = (uint *) dst; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *res4 = (uint *) res; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint j; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to ubyte */ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { /* loop over R,G,B,A channels */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[j][0] = float_to_ubyte(dest[j][0]); /* P0 */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[j][1] = float_to_ubyte(dest[j][1]); /* P1 */ 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[j][2] = float_to_ubyte(dest[j][2]); /* P2 */ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[j][3] = float_to_ubyte(dest[j][3]); /* P3 */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[j][0] = float_to_ubyte(quadColor[j][0]); /* P0 */ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[j][1] = float_to_ubyte(quadColor[j][1]); /* P1 */ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[j][2] = float_to_ubyte(quadColor[j][2]); /* P2 */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[j][3] = float_to_ubyte(quadColor[j][3]); /* P3 */ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->logicop_func) { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_CLEAR: 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = 0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_NOR: 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~(src4[j] | dst4[j]); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_AND_INVERTED: 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~src4[j] & dst4[j]; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_COPY_INVERTED: 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~src4[j]; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_AND_REVERSE: 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = src4[j] & ~dst4[j]; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_INVERT: 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~dst4[j]; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_XOR: 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = dst4[j] ^ src4[j]; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_NAND: 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~(src4[j] & dst4[j]); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_AND: 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = src4[j] & dst4[j]; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_EQUIV: 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~(src4[j] ^ dst4[j]); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_NOOP: 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = dst4[j]; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_OR_INVERTED: 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~src4[j] | dst4[j]; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_COPY: 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = src4[j]; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_OR_REVERSE: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = src4[j] | ~dst4[j]; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_OR: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = src4[j] | dst4[j]; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_LOGICOP_SET: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res4[j] = ~0; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid logicop mode"); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[j][0] = ubyte_to_float(res[j][0]); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[j][1] = ubyte_to_float(res[j][1]); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[j][2] = ubyte_to_float(res[j][2]); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[j][3] = ubyte_to_float(res[j][3]); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do blending for a 2x2 quad for one color buffer. 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param quadColor the incoming quad colors 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dest the destination/framebuffer quad colors 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param const_blend_color the constant blend color 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param blend_index which set of blending terms to use 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_quad(struct quad_stage *qs, 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4], 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor2)[4], 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*dest)[4], 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float const_blend_color[4], 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blend_index) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float zero[4] = { 0, 0, 0, 0 }; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float one[4] = { 1, 1, 1, 1 }; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = qs->softpipe; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float source[4][TGSI_QUAD_SIZE] = { { 0 } }; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float blend_dest[4][TGSI_QUAD_SIZE]; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute src/first term RGB 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].rgb_src_factor) { 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ONE: 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[0], quadColor[0]); /* R */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[1], quadColor[1]); /* G */ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[2], quadColor[2]); /* B */ 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], quadColor[0]); /* R */ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], quadColor[1]); /* G */ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], quadColor[2]); /* B */ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor[3]; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], alpha); /* R */ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], alpha); /* G */ 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], alpha); /* B */ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], dest[0]); /* R */ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], dest[1]); /* G */ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], dest[2]); /* B */ 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = dest[3]; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], alpha); /* R */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], alpha); /* G */ 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], alpha); /* B */ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor[3]; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float diff[4], temp[4]; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(diff, one, dest[3]); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(temp, alpha, diff); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], temp); /* R */ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], temp); /* G */ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], temp); /* B */ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float comp[4]; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[0]); /* R */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], comp); /* R */ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[1]); /* G */ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], comp); /* G */ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[2]); /* B */ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], comp); /* B */ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float alpha[4]; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(alpha, const_blend_color[3]); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], alpha); /* R */ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], alpha); /* G */ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], alpha); /* B */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_COLOR: 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], quadColor2[0]); /* R */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], quadColor2[1]); /* G */ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], quadColor2[2]); /* B */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_ALPHA: 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor2[3]; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], alpha); /* R */ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], alpha); /* G */ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], alpha); /* B */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ZERO: 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[0], zero); /* R */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[1], zero); /* G */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[2], zero); /* B */ 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, quadColor[3]); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, dest[3]); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, dest[0]); /* R */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, dest[1]); /* G */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, dest[2]); /* B */ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R */ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[0]); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_comp); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* G */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[1]); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_comp); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B */ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[2]); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_comp); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_alpha, 1.0f - const_blend_color[3]); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[0]); /* R */ 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[1]); /* G */ 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[2]); /* B */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, quadColor2[3]); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid rgb src factor"); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute src/first term A 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].alpha_src_factor) { 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ONE: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[3], quadColor[3]); /* A */ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor[3]; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], alpha); /* A */ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], dest[3]); /* A */ 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* multiply alpha by 1.0 */ 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[3], quadColor[3]); /* A */ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float comp[4]; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[3]); /* A */ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], comp); /* A */ 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ZERO: 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(source[3], zero); /* A */ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, quadColor[3]); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, dest[3]); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A */ 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[3]); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], inv_comp); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_COLOR: 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_ALPHA: 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor2[3]; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], alpha); /* A */ 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_alpha[4]; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_alpha, one, quadColor2[3]); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid alpha src factor"); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Save the original dest for use in masking */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[0], dest[0]); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[1], dest[1]); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[2], dest[2]); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[3], dest[3]); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute blend_dest/second term RGB 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].rgb_dst_factor) { 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ONE: 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend_dest = blend_dest * 1 NO-OP, leave blend_dest as-is */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], quadColor[0]); /* R */ 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], quadColor[1]); /* G */ 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], quadColor[2]); /* B */ 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], quadColor[3]); /* R * A */ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], quadColor[3]); /* G * A */ 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], quadColor[3]); /* B * A */ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], blend_dest[3]); /* R * A */ 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], blend_dest[3]); /* G * A */ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], blend_dest[3]); /* B * A */ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], blend_dest[0]); /* R */ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], blend_dest[1]); /* G */ 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], blend_dest[2]); /* B */ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor[3]; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float diff[4], temp[4]; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(diff, one, blend_dest[3]); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(temp, alpha, diff); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], quadColor[0], temp); /* R */ 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], quadColor[1], temp); /* G */ 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], quadColor[2], temp); /* B */ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float comp[4]; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[0]); /* R */ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], comp); /* R */ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[1]); /* G */ 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], comp); /* G */ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[2]); /* B */ 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], comp); /* B */ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float comp[4]; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[3]); /* A */ 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], comp); /* R */ 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], comp); /* G */ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], comp); /* B */ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ZERO: 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[0], zero); /* R */ 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[1], zero); /* G */ 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[2], zero); /* B */ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_COLOR: 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], quadColor2[0]); /* R */ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], quadColor2[1]); /* G */ 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], quadColor2[2]); /* B */ 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_ALPHA: 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], quadColor2[3]); /* R * A */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], quadColor2[3]); /* G * A */ 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], quadColor2[3]); /* B * A */ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], inv_comp, blend_dest[0]); /* R */ 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], inv_comp, blend_dest[1]); /* G */ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], inv_comp, blend_dest[2]); /* B */ 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float one_minus_alpha[TGSI_QUAD_SIZE]; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(one_minus_alpha, one, quadColor[3]); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], one_minus_alpha); /* R */ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], one_minus_alpha); /* G */ 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], one_minus_alpha); /* B */ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, blend_dest[3]); /* A */ 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], inv_comp, blend_dest[0]); /* R */ 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], inv_comp, blend_dest[1]); /* G */ 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], inv_comp, blend_dest[2]); /* B */ 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, blend_dest[0]); /* R */ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], inv_comp); /* R */ 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, blend_dest[1]); /* G */ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], inv_comp); /* G */ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, blend_dest[2]); /* B */ 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], inv_comp); /* B */ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R */ 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[0]); 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], inv_comp); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* G */ 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[1]); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], inv_comp); 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B */ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[2]); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], inv_comp); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[3]); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], inv_comp); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], inv_comp); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], inv_comp); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[0]); /* R */ 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], inv_comp, blend_dest[0]); /* R */ 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[1]); /* G */ 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], inv_comp, blend_dest[1]); /* G */ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, quadColor2[2]); /* B */ 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], inv_comp, blend_dest[2]); /* B */ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float one_minus_alpha[TGSI_QUAD_SIZE]; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(one_minus_alpha, one, quadColor2[3]); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[0], blend_dest[0], one_minus_alpha); /* R */ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[1], blend_dest[1], one_minus_alpha); /* G */ 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[2], blend_dest[2], one_minus_alpha); /* B */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid rgb dst factor"); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute blend_dest/second term A 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].alpha_dst_factor) { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ONE: 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend_dest = blend_dest * 1 NO-OP, leave blend_dest as-is */ 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], quadColor[3]); /* A * A */ 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], blend_dest[3]); /* A */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend_dest = blend_dest * 1 NO-OP, leave blend_dest as-is */ 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float comp[4]; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(comp, const_blend_color[3]); /* A */ 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], comp); /* A */ 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ZERO: 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_COPY(blend_dest[3], zero); /* A */ 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float one_minus_alpha[TGSI_QUAD_SIZE]; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(one_minus_alpha, one, quadColor[3]); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], one_minus_alpha); /* A */ 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(inv_comp, one, blend_dest[3]); /* A */ 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], inv_comp, blend_dest[3]); /* A */ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float inv_comp[4]; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SCALAR(inv_comp, 1.0f - const_blend_color[3]); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], inv_comp); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_COLOR: 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_ALPHA: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], quadColor2[3]); /* A * A */ 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float one_minus_alpha[TGSI_QUAD_SIZE]; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(one_minus_alpha, one, quadColor2[3]); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(blend_dest[3], blend_dest[3], one_minus_alpha); /* A */ 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid alpha dst factor"); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Combine RGB terms 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].rgb_func) { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_ADD: 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[0], source[0], blend_dest[0]); /* R */ 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[1], source[1], blend_dest[1]); /* G */ 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[2], source[2], blend_dest[2]); /* B */ 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_SUBTRACT: 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[0], source[0], blend_dest[0]); /* R */ 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[1], source[1], blend_dest[1]); /* G */ 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[2], source[2], blend_dest[2]); /* B */ 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_REVERSE_SUBTRACT: 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[0], blend_dest[0], source[0]); /* R */ 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[1], blend_dest[1], source[1]); /* G */ 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[2], blend_dest[2], source[2]); /* B */ 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MIN: 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(quadColor[0], source[0], blend_dest[0]); /* R */ 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(quadColor[1], source[1], blend_dest[1]); /* G */ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(quadColor[2], source[2], blend_dest[2]); /* B */ 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MAX: 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MAX(quadColor[0], source[0], blend_dest[0]); /* R */ 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MAX(quadColor[1], source[1], blend_dest[1]); /* G */ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MAX(quadColor[2], source[2], blend_dest[2]); /* B */ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid rgb blend func"); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Combine A terms 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (softpipe->blend->rt[blend_index].alpha_func) { 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_ADD: 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[3], source[3], blend_dest[3]); /* A */ 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_SUBTRACT: 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[3], source[3], blend_dest[3]); /* A */ 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_REVERSE_SUBTRACT: 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(quadColor[3], blend_dest[3], source[3]); /* A */ 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MIN: 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MIN(quadColor[3], source[3], blend_dest[3]); /* A */ 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MAX: 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MAX(quadColor[3], source[3], blend_dest[3]); /* A */ 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "invalid alpha blend func"); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcolormask_quad(unsigned colormask, 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4], 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*dest)[4]) 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R */ 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(colormask & PIPE_MASK_R)) 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(quadColor[0], dest[0]); 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* G */ 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(colormask & PIPE_MASK_G)) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(quadColor[1], dest[1]); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B */ 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(colormask & PIPE_MASK_B)) 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(quadColor[2], dest[2]); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A */ 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(colormask & PIPE_MASK_A)) 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(quadColor[3], dest[3]); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clamp all colors in a quad to [0, 1] 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclamp_colors(float (*quadColor)[4]) 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[i][j] = CLAMP(quadColor[i][j], 0.0F, 1.0F); 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we're drawing to a luminance, luminance/alpha or intensity surface 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we have to adjust (rebase) the fragment/quad colors before writing them 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the tile cache. The tile cache always stores RGBA colors but if 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we're caching a L/A surface (for example) we need to be sure that R=G=B 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so that subsequent reads from the surface cache appear to return L/A 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * values. 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The piglit fbo-blending-formats test will exercise this. 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrebase_colors(enum format base_format, float (*quadColor)[4]) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (base_format) { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RGB: 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A = 1 */ 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[3][i] = 1.0F; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LUMINANCE: 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B = G = R */ 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[2][i] = quadColor[1][i] = quadColor[0][i]; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A = 1 */ 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[3][i] = 1.0F; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LUMINANCE_ALPHA: 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B = G = R */ 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[2][i] = quadColor[1][i] = quadColor[0][i]; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case INTENSITY: 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A = B = G = R */ 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor[3][i] = quadColor[2][i] = quadColor[1][i] = quadColor[0][i]; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* nothing */ 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_fallback(struct quad_stage *qs, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct blend_quad_stage *bqs = blend_quad_stage(qs); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = qs->softpipe; 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_state *blend = softpipe->blend; 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned cbuf; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean write_all; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_all = softpipe->fs_variant->info.color0_writes_all_cbufs; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* which blend/mask state index to use: */ 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint blend_buf = blend->independent_blend_enable ? cbuf : 0; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dest[4][TGSI_QUAD_SIZE]; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_cached_tile *tile 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = sp_get_cached_tile(softpipe->cbuf_cache[cbuf], 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.x0, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.y0); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean clamp = bqs->clamp[cbuf]; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *blend_color; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean dual_source_blend = util_blend_state_is_dual(blend, cbuf); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint q, i, j; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clamp) 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_color = softpipe->blend_color_clamped.color; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_color = softpipe->blend_color.color; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (q = 0; q < nr; q++) { 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quad = quads[q]; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4]; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor2)[4]; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float temp_quad_color[TGSI_QUAD_SIZE][4]; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int itx = (quad->input.x0 & (TILE_SIZE-1)); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ity = (quad->input.y0 & (TILE_SIZE-1)); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (write_all) { 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_quad_color[i][j] = quad->output.color[0][i][j]; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor = temp_quad_color; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor = quad->output.color[cbuf]; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dual_source_blend) 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quadColor2 = quad->output.color[cbuf + 1]; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the incoming 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clamp || softpipe->rasterizer->clamp_fragment_color) { 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get/swizzle dest colors 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i][j] = tile->data.color[y][x][i]; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend->logicop_enable) { 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bqs->format_type[cbuf] != UTIL_FORMAT_TYPE_FLOAT) { 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicop_quad( qs, quadColor, dest ); 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (blend->rt[blend_buf].blend_enable) { 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_quad(qs, quadColor, quadColor2, dest, blend_color, blend_buf); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the outgoing 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clamp) { 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rebase_colors(bqs->base_format[cbuf], quadColor); 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend->rt[blend_buf].colormask != 0xf) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colormask_quad( blend->rt[cbuf].colormask, quadColor, dest); 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Output color values 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (quad->inout.mask & (1 << j)) { 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { /* loop over color chans */ 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile->data.color[y][x][i] = quadColor[i][j]; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_single_add_src_alpha_inv_src_alpha(struct quad_stage *qs, 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct blend_quad_stage *bqs = blend_quad_stage(qs); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float one[4] = { 1, 1, 1, 1 }; 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float one_minus_alpha[TGSI_QUAD_SIZE]; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dest[4][TGSI_QUAD_SIZE]; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float source[4][TGSI_QUAD_SIZE]; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j, q; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_cached_tile *tile 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = sp_get_cached_tile(qs->softpipe->cbuf_cache[0], 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.x0, 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.y0); 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (q = 0; q < nr; q++) { 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quad = quads[q]; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4] = quad->output.color[0]; 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *alpha = quadColor[3]; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int itx = (quad->input.x0 & (TILE_SIZE-1)); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ity = (quad->input.y0 & (TILE_SIZE-1)); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get/swizzle dest colors */ 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i][j] = tile->data.color[y][x][i]; 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the incoming 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bqs->clamp[0] || qs->softpipe->rasterizer->clamp_fragment_color) { 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[0], quadColor[0], alpha); /* R */ 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[1], quadColor[1], alpha); /* G */ 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[2], quadColor[2], alpha); /* B */ 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(source[3], quadColor[3], alpha); /* A */ 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_SUB(one_minus_alpha, one, alpha); 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(dest[0], dest[0], one_minus_alpha); /* R */ 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(dest[1], dest[1], one_minus_alpha); /* G */ 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(dest[2], dest[2], one_minus_alpha); /* B */ 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* A */ 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[0], source[0], dest[0]); /* R */ 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[1], source[1], dest[1]); /* G */ 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[2], source[2], dest[2]); /* B */ 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[3], source[3], dest[3]); /* A */ 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the outgoing 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bqs->clamp[0]) { 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rebase_colors(bqs->base_format[0], quadColor); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (quad->inout.mask & (1 << j)) { 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { /* loop over color chans */ 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile->data.color[y][x][i] = quadColor[i][j]; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_single_add_one_one(struct quad_stage *qs, 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct blend_quad_stage *bqs = blend_quad_stage(qs); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dest[4][TGSI_QUAD_SIZE]; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j, q; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_cached_tile *tile 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = sp_get_cached_tile(qs->softpipe->cbuf_cache[0], 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.x0, 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.y0); 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (q = 0; q < nr; q++) { 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quad = quads[q]; 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4] = quad->output.color[0]; 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int itx = (quad->input.x0 & (TILE_SIZE-1)); 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ity = (quad->input.y0 & (TILE_SIZE-1)); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get/swizzle dest colors */ 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i][j] = tile->data.color[y][x][i]; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the incoming 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bqs->clamp[0] || qs->softpipe->rasterizer->clamp_fragment_color) { 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[0], quadColor[0], dest[0]); /* R */ 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[1], quadColor[1], dest[1]); /* G */ 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[2], quadColor[2], dest[2]); /* B */ 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC4_ADD(quadColor[3], quadColor[3], dest[3]); /* A */ 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If fixed-point dest color buffer, need to clamp the outgoing 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment colors now. 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bqs->clamp[0]) { 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rebase_colors(bqs->base_format[0], quadColor); 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (quad->inout.mask & (1 << j)) { 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { /* loop over color chans */ 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile->data.color[y][x][i] = quadColor[i][j]; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Just copy the quad color to the framebuffer tile (respecting the writemask), 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for one color buffer. 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clamping will be done, if needed (depending on the color buffer's 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * datatype) when we write/pack the colors later. 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsingle_output_color(struct quad_stage *qs, 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct blend_quad_stage *bqs = blend_quad_stage(qs); 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j, q; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_cached_tile *tile 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = sp_get_cached_tile(qs->softpipe->cbuf_cache[0], 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.x0, 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quads[0]->input.y0); 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (q = 0; q < nr; q++) { 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quad = quads[q]; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*quadColor)[4] = quad->output.color[0]; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int itx = (quad->input.x0 & (TILE_SIZE-1)); 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ity = (quad->input.y0 & (TILE_SIZE-1)); 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (qs->softpipe->rasterizer->clamp_fragment_color) 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clamp_colors(quadColor); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rebase_colors(bqs->base_format[0], quadColor); 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_QUAD_SIZE; j++) { 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (quad->inout.mask & (1 << j)) { 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x = itx + (j & 1); 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y = ity + (j >> 1); 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { /* loop over color chans */ 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile->data.color[y][x][i] = quadColor[i][j]; 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_noop(struct quad_stage *qs, 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_blend_quad(struct quad_stage *qs, 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct quad_header *quads[], 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr) 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blend_quad_stage *bqs = blend_quad_stage(qs); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = qs->softpipe; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_state *blend = softpipe->blend; 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = blend_fallback; 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->framebuffer.nr_cbufs == 0) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = blend_noop; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!softpipe->blend->logicop_enable && 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->blend->rt[0].colormask == 0xf && 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->framebuffer.nr_cbufs == 1) 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!blend->rt[0].blend_enable) { 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = single_output_color; 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (blend->rt[0].rgb_src_factor == blend->rt[0].alpha_src_factor && 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->rt[0].rgb_dst_factor == blend->rt[0].alpha_dst_factor && 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->rt[0].rgb_func == blend->rt[0].alpha_func) 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend->rt[0].alpha_func == PIPE_BLEND_ADD) { 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend->rt[0].rgb_src_factor == PIPE_BLENDFACTOR_ONE && 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->rt[0].rgb_dst_factor == PIPE_BLENDFACTOR_ONE) { 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = blend_single_add_one_one; 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (blend->rt[0].rgb_src_factor == PIPE_BLENDFACTOR_SRC_ALPHA && 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->rt[0].rgb_dst_factor == PIPE_BLENDFACTOR_INV_SRC_ALPHA) 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = blend_single_add_src_alpha_inv_src_alpha; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For each color buffer, determine if the buffer has destination alpha and 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * whether color clamping is needed. 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const enum pipe_format format = softpipe->framebuffer.cbufs[i]->format; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_description(format); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* assuming all or no color channels are normalized: */ 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->clamp[i] = desc->channel[0].normalized; 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->format_type[i] = desc->channel[0].type; 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_intensity(format)) 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->base_format[i] = INTENSITY; 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (util_format_is_luminance(format)) 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->base_format[i] = LUMINANCE; 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (util_format_is_luminance_alpha(format)) 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->base_format[i] = LUMINANCE_ALPHA; 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (util_format_is_rgb_no_alpha(format)) 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->base_format[i] = RGB; 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bqs->base_format[i] = RGBA; 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run(qs, quads, nr); 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blend_begin(struct quad_stage *qs) 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org qs->run = choose_blend_quad; 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blend_destroy(struct quad_stage *qs) 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( qs ); 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct quad_stage *sp_quad_blend_stage( struct softpipe_context *softpipe ) 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blend_quad_stage *stage = CALLOC_STRUCT(blend_quad_stage); 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!stage) 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->base.softpipe = softpipe; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->base.begin = blend_begin; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->base.run = choose_blend_quad; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->base.destroy = blend_destroy; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &stage->base; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1307