1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef ASM_FILL_H 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASM_FILL_H 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_ureg.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (* ureg_func)( struct ureg_program *ureg, 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsolid_fill( struct ureg_program *ureg, 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, constant[2]); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Perform frag-coord-to-paint-coord transform. The transformation is in 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONST[4..6]. 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PAINT_TRANSFORM \ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_XY), in[0]); \ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, \ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[0], TGSI_WRITEMASK_Z), \ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); \ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP3(ureg, temp[1], constant[4], ureg_src(temp[0])); \ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP3(ureg, temp[2], constant[5], ureg_src(temp[0])); \ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP3(ureg, temp[3], constant[6], ureg_src(temp[0])); \ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[3], ureg_src(temp[3])); \ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3])); \ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3])); \ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, \ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[4], TGSI_WRITEMASK_X), \ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1])); \ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, \ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[4], TGSI_WRITEMASK_Y), \ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[2])); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglinear_grad( struct ureg_program *ureg, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PAINT_TRANSFORM 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* grad = DP2((x, y), CONST[2].xy) * CONST[2].z */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[0], 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[2], TGSI_SWIZZLE_Y), 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_Y)); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[1], 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[2], TGSI_SWIZZLE_X), 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_X), 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0])); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[2], ureg_src(temp[1]), 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[2], TGSI_SWIZZLE_Z)); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradial_grad( struct ureg_program *ureg, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PAINT_TRANSFORM 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate (sqrt(B^2 + AC) - B) / A, where 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A is CONST[2].z, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * B is DP2((x, y), CONST[2].xy), and 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * C is DP2((x, y), (x, y)). 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* B and C */ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP2(ureg, temp[0], ureg_src(temp[4]), constant[2]); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP2(ureg, temp[1], ureg_src(temp[4]), ureg_src(temp[4])); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the square root */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0])); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[3], ureg_src(temp[1]), 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[2], TGSI_SWIZZLE_Z), ureg_src(temp[2])); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RSQ(ureg, temp[3], ureg_src(temp[3])); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[3], ureg_src(temp[3])); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[0])); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[0], ureg_scalar(constant[2], TGSI_SWIZZLE_Z)); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, temp[0], ureg_src(temp[0]), ureg_src(temp[3])); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[0]), sampler[0]); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpattern( struct ureg_program *ureg, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PAINT_TRANSFORM 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* (s, t) = (x / tex_width, y / tex_height) */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[0], 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_swizzle(constant[3], 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_Z, 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_W, 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_Z, 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_W)); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, temp[1], ureg_src(temp[4])); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[1], TGSI_WRITEMASK_X), 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1]), 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0])); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[1], TGSI_WRITEMASK_Y), 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1]), 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0])); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, ureg_src(temp[1]), sampler[0]); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpaint_degenerate( struct ureg_program *ureg, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* CONST[3].y is 1.0f */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, temp[1], ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[1]), sampler[0]); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_normal( struct ureg_program *ureg, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* store and pass image color in TEMP[1] */ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[1])); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_multiply( struct ureg_program *ureg, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* store and pass image color in TEMP[1] */ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1])); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_stencil( struct ureg_program *ureg, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* store and pass image color in TEMP[1] */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcolor_transform( struct ureg_program *ureg, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* note that TEMP[1] may already be used for image color */ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[2], ureg_src(temp[0]), constant[0], constant[1]); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0.0f, 1.0f] */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_CLAMP(ureg, temp[2], 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[2]), 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_X), 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[2])); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgalpha_normal( struct ureg_program *ureg, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* save per-channel alpha in TEMP[1] */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, temp[1], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgalpha_per_channel( struct ureg_program *ureg, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* save per-channel alpha in TEMP[1] */ 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[1], TGSI_WRITEMASK_W), 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0]), 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1])); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ), 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1]), 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* update alpha */ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[0], TGSI_WRITEMASK_W), 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1])); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Premultiply src and dst. 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_premultiply( struct ureg_program *ureg, 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src, 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src_channel_alpha, 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src dst) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* premultiply src */ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ), 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src, 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_channel_alpha); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* premultiply dst */ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(ureg_dst(dst), TGSI_WRITEMASK_XYZ), 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(dst, TGSI_SWIZZLE_W)); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpremultiply src. 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_unpremultiply( struct ureg_program *ureg, 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src one, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst temp[1]) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replace 0.0f by 1.0f before calculating reciprocal */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_CMP(ureg, 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp[0], 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_negate(ureg_scalar(src, TGSI_SWIZZLE_W)), 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(src, TGSI_SWIZZLE_W), 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org one); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[0], ureg_src(temp[0])); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ), 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0])); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit instructions for the specified blend mode. Colors will be 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unpremultiplied. Two temporary registers are required. 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The output is written back to src. 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_generic(struct ureg_program *ureg, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGBlendMode mode, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src, 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src_channel_alpha, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src dst, 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src one, 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst temp[2]) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst out; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_premultiply(ureg, src, src_channel_alpha, dst); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend in-place */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out = ureg_dst(src); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC: 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, out, src); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC_OVER: 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGBA_out = RGBA_src + (1 - A_src) * RGBA_dst */ 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[0], one, src_channel_alpha); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DST_OVER: 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGBA_out = RGBA_dst + (1 - A_dst) * RGBA_src */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[0], one, ureg_scalar(dst, TGSI_SWIZZLE_W)); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, out, ureg_src(temp[0]), src, dst); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC_IN: 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, out, src, ureg_scalar(dst, TGSI_SWIZZLE_W)); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DST_IN: 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, out, dst, src_channel_alpha); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_MULTIPLY: 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RGB_out = (1 - A_dst) * RGB_src + (1 - A_src) * RGB_dst + 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RGB_src * RGB_dst 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[0], 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(dst, TGSI_SWIZZLE_W), ureg_negate(src), src); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[1], 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_channel_alpha, ureg_negate(dst), dst); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[0], src, dst, ureg_src(temp[0])); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, out, ureg_src(temp[0]), ureg_src(temp[1])); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* alpha is src over */ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, ureg_writemask(out, TGSI_WRITEMASK_W), 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src, ureg_src(temp[1])); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SCREEN: 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGBA_out = RGBA_src + (1 - RGBA_src) * RGBA_dst */ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[0], one, src); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DARKEN: 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_LIGHTEN: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src over */ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[0], one, src_channel_alpha); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[0], ureg_src(temp[0]), dst, src); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst over */ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SUB(ureg, temp[1], one, ureg_scalar(dst, TGSI_SWIZZLE_W)); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(ureg, temp[1], ureg_src(temp[1]), src, dst); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* take min/max for colors */ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode == VG_BLEND_DARKEN) { 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MIN(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ), 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0]), ureg_src(temp[1])); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAX(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ), 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0]), ureg_src(temp[1])); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_ADDITIVE: 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGBA_out = RGBA_src + RGBA_dst */ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, temp[0], src, dst); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MIN(ureg, out, ureg_src(temp[0]), one); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_unpremultiply(ureg, src, one, temp); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLEND_GENERIC(mode) \ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[2], TGSI_TEXTURE_2D, in[0], sampler[2]); \ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_generic(ureg, (mode), ureg_src(temp[0]), ureg_src(temp[1]), \ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[2]), \ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y), temp + 3); \ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); \ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src( struct ureg_program *ureg, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_SRC); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src_over( struct ureg_program *ureg, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_SRC_OVER); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_dst_over( struct ureg_program *ureg, 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_DST_OVER); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src_in( struct ureg_program *ureg, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_SRC_IN); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_dst_in( struct ureg_program *ureg, 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_DST_IN); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_multiply( struct ureg_program *ureg, 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_MULTIPLY); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_screen( struct ureg_program *ureg, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_SCREEN); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_darken( struct ureg_program *ureg, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_DARKEN); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_lighten( struct ureg_program *ureg, 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_LIGHTEN); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_additive( struct ureg_program *ureg, 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_GENERIC(VG_BLEND_ADDITIVE); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmask( struct ureg_program *ureg, 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W), 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpremultiply( struct ureg_program *ureg, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(ureg, 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ), 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[0]), 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunpremultiply( struct ureg_program *ureg, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(ureg, temp[0], TGSI_TEXTURE_2D, in[0], sampler[1]); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcolor_bw( struct ureg_program *ureg, 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *out, 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *in, 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *sampler, 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst *temp, 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src *constant) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, temp[1], 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y), 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(ureg, temp[2], ureg_src(temp[1])); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, temp[1], 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(constant[3], TGSI_SWIZZLE_Y), 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[2])); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X), 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X), 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y)); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X), 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Z), 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X)); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SGE(ureg, 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ), 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_X), 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(temp[1])); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_SGE(ureg, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_writemask(temp[0], TGSI_WRITEMASK_W), 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_Y)); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, *out, ureg_src(temp[0])); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct shader_asm_info { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint id; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_func func; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean needs_position; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint start_const; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_consts; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint start_sampler; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_samplers; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint start_temp; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_temps; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* paint types */ 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_paint_asm[] = { 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_SOLID_FILL_SHADER, solid_fill, 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 2, 1, 0, 0, 0, 0}, 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_LINEAR_GRADIENT_SHADER, linear_grad, 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 2, 5, 0, 1, 0, 5}, 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_RADIAL_GRADIENT_SHADER, radial_grad, 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 2, 5, 0, 1, 0, 5}, 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_PATTERN_SHADER, pattern, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 3, 4, 0, 1, 0, 5}, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_PAINT_DEGENERATE_SHADER, paint_degenerate, 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 3, 1, 0, 1, 0, 2} 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* image draw modes */ 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_image_asm[] = { 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_IMAGE_NORMAL_SHADER, image_normal, 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 0, 0, 3, 1, 0, 2}, 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_IMAGE_MULTIPLY_SHADER, image_multiply, 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 0, 0, 3, 1, 0, 2}, 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_IMAGE_STENCIL_SHADER, image_stencil, 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 0, 0, 3, 1, 0, 2} 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_color_transform_asm[] = { 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_COLOR_TRANSFORM_SHADER, color_transform, 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 0, 4, 0, 0, 0, 3} 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_alpha_asm[] = { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_ALPHA_NORMAL_SHADER, alpha_normal, 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 0, 0, 0, 0, 0, 2}, 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_ALPHA_PER_CHANNEL_SHADER, alpha_per_channel, 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 0, 0, 0, 0, 0, 2} 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* extra blend modes */ 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_blend_asm[] = { 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLEND_ASM_INFO(id, func) { (id), (func), VG_TRUE, 3, 1, 2, 1, 0, 5 } 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_SRC_SHADER, blend_src), 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_SRC_OVER_SHADER, blend_src_over), 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_DST_OVER_SHADER, blend_dst_over), 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_SRC_IN_SHADER, blend_src_in), 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_DST_IN_SHADER, blend_dst_in), 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_MULTIPLY_SHADER, blend_multiply), 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_SCREEN_SHADER, blend_screen), 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_DARKEN_SHADER, blend_darken), 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_LIGHTEN_SHADER, blend_lighten), 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_ASM_INFO(VEGA_BLEND_ADDITIVE_SHADER, blend_additive) 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef BLEND_ASM_INFO 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_mask_asm[] = { 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_MASK_SHADER, mask, 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_TRUE, 0, 0, 1, 1, 0, 2} 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* premultiply */ 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_premultiply_asm[] = { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_PREMULTIPLY_SHADER, premultiply, 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 0, 0, 0, 0, 0, 1}, 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_UNPREMULTIPLY_SHADER, unpremultiply, 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 0, 0, 0, 0, 0, 1}, 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* color transform to black and white */ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_bw_asm[] = { 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {VEGA_BW_SHADER, color_bw, 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_FALSE, 3, 1, 0, 0, 0, 3}, 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 694