1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010 Francisco Jerez. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a 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, sublicense, 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 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_driver.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_context.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_gldefs.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv10_3d.xml.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_util.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv10_driver.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv20_driver.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_A 24 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_B 16 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_C 8 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_D 0 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_E 56 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_F 48 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SHIFT_G 40 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_SOURCE(source) \ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((uint64_t)NV10_3D_RC_IN_RGB_D_INPUT_##source) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_USAGE(usage) \ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((uint64_t)NV10_3D_RC_IN_RGB_D_COMPONENT_USAGE_##usage) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_IN_MAPPING(mapping) \ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((uint64_t)NV10_3D_RC_IN_RGB_D_MAPPING_##mapping) 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_BIAS NV10_3D_RC_OUT_RGB_BIAS_BIAS_BY_NEGATIVE_ONE_HALF 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_SCALE_1 NV10_3D_RC_OUT_RGB_SCALE_NONE 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_SCALE_2 NV10_3D_RC_OUT_RGB_SCALE_SCALE_BY_TWO 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_SCALE_4 NV10_3D_RC_OUT_RGB_SCALE_SCALE_BY_FOUR 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Make the combiner do: spare0_i = A_i * B_i */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_AB NV10_3D_RC_OUT_RGB_AB_OUTPUT_SPARE0 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* spare0_i = dot3(A, B) */ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_DOT_AB (NV10_3D_RC_OUT_RGB_AB_OUTPUT_SPARE0 | \ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV10_3D_RC_OUT_RGB_AB_DOT_PRODUCT) 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* spare0_i = A_i * B_i + C_i * D_i */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_OUT_SUM NV10_3D_RC_OUT_RGB_SUM_OUTPUT_SPARE0 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct combiner_state { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int unit; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean premodulate; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL state */ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum mode; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum *source; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum *operand; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint logscale; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Derived HW state */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t in; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t out; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Initialize a combiner_state struct from the texture unit 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * context. */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INIT_COMBINER(chan, ctx, rc, i) do { \ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_tex_env_combine_state *c = \ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Texture.Unit[i]._CurrentCombine; \ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->ctx = ctx; \ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->unit = i; \ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->premodulate = c->_NumArgs##chan == 4; \ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->mode = c->Mode##chan; \ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->source = c->Source##chan; \ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->operand = c->Operand##chan; \ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->logscale = c->ScaleShift##chan; \ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->in = (rc)->out = 0; \ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Get the RC input source for the specified EXT_texture_env_combine 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * source. */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_input_source(struct combiner_state *rc, int source) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (source) { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(ZERO); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(TEXTURE0) + rc->unit; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE0: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(TEXTURE0); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE1: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(TEXTURE1); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE2: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(TEXTURE2); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE3: 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(TEXTURE3); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return context_chipset(rc->ctx) >= 0x20 ? 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_SOURCE(CONSTANT_COLOR0) : 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_SOURCE(CONSTANT_COLOR0) + rc->unit; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PRIMARY_COLOR: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(PRIMARY_COLOR); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PREVIOUS: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rc->unit ? RC_IN_SOURCE(SPARE0) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : RC_IN_SOURCE(PRIMARY_COLOR); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Get the RC input mapping for the specified texture_env_combine 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * operand, possibly inverted or biased. */ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INVERT 0x1 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HALF_BIAS 0x2 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_input_mapping(struct combiner_state *rc, int operand, int flags) 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int map = 0; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_color_operand(operand)) 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map |= RC_IN_USAGE(RGB); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map |= RC_IN_USAGE(ALPHA); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_negative_operand(operand) == !(flags & INVERT)) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map |= flags & HALF_BIAS ? 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_MAPPING(HALF_BIAS_NEGATE) : 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_MAPPING(UNSIGNED_INVERT); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map |= flags & HALF_BIAS ? 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_MAPPING(HALF_BIAS_NORMAL) : 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_MAPPING(UNSIGNED_IDENTITY); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_input_arg(struct combiner_state *rc, int arg, int flags) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int source = rc->source[arg]; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int operand = rc->operand[arg]; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fake several unsupported texture formats. */ 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_texture_source(source)) { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = (source == GL_TEXTURE ? 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->unit : source - GL_TEXTURE0); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *t = rc->ctx->Texture.Unit[i]._Current; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format format = t->Image[0][t->BaseLevel]->TexFormat; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == MESA_FORMAT_A8) { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emulated using I8. */ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_color_operand(operand)) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(ZERO) | 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_input_mapping(rc, operand, flags); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (format == MESA_FORMAT_L8) { 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sometimes emulated using I8. */ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!is_color_operand(operand)) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(ZERO) | 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_input_mapping(rc, operand, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags ^ INVERT); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (format == MESA_FORMAT_XRGB8888) { 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sometimes emulated using ARGB8888. */ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!is_color_operand(operand)) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return RC_IN_SOURCE(ZERO) | 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_input_mapping(rc, operand, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags ^ INVERT); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return get_input_source(rc, source) | 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_input_mapping(rc, operand, flags); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Bind the RC input variable <var> to the EXT_texture_env_combine 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * argument <arg>, possibly inverted or biased. */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_ARG(rc, var, arg, flags) \ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->in |= get_input_arg(rc, arg, flags) << RC_IN_SHIFT_##var 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Bind the RC input variable <var> to the RC source <src>. */ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_SRC(rc, var, src, chan) \ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->in |= (RC_IN_SOURCE(src) | \ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_USAGE(chan)) << RC_IN_SHIFT_##var 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Bind the RC input variable <var> to a constant +/-1 */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_ONE(rc, var, flags) \ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc)->in |= (RC_IN_SOURCE(ZERO) | \ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (flags & INVERT ? RC_IN_MAPPING(EXPAND_NORMAL) : \ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_IN_MAPPING(UNSIGNED_INVERT))) << RC_IN_SHIFT_##var 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetup_combiner(struct combiner_state *rc) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rc->mode) { 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(rc, B, 0); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_AB; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, B, 1, 0); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_AB; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ADD: 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ADD_SIGNED: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rc->premodulate) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, B, 1, 0); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, C, 2, 0); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, D, 3, 0); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(rc, B, 0); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, C, 1, 0); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(rc, D, 0); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_SUM | 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rc->mode == GL_ADD_SIGNED ? RC_OUT_BIAS : 0); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTERPOLATE: 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, B, 2, 0); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, C, 1, 0); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, D, 2, INVERT); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_SUM; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SUBTRACT: 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, 0); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(rc, B, 0); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, C, 1, 0); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(rc, D, INVERT); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_SUM; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGB: 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGBA: 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, A, 0, HALF_BIAS); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ARG(rc, B, 1, HALF_BIAS); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out = RC_OUT_DOT_AB | RC_OUT_SCALE_4; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!rc->logscale); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rc->logscale) { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out |= RC_OUT_SCALE_1; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out |= RC_OUT_SCALE_2; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc->out |= RC_OUT_SCALE_4; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_get_general_combiner(struct gl_context *ctx, int i, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *a_in, uint32_t *a_out, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *c_in, uint32_t *c_out, uint32_t *k) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct combiner_state rc_a, rc_c; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture.Unit[i]._ReallyEnabled) { 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT_COMBINER(RGB, ctx, &rc_c, i); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rc_c.mode == GL_DOT3_RGBA) 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc_a = rc_c; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT_COMBINER(A, ctx, &rc_a, i); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_combiner(&rc_c); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_combiner(&rc_a); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rc_a.in = rc_a.out = rc_c.in = rc_c.out = 0; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *k = pack_rgba_f(MESA_FORMAT_ARGB8888, 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Texture.Unit[i].EnvColor); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *a_in = rc_a.in; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *a_out = rc_a.out; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *c_in = rc_c.in; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *c_out = rc_c.out; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_get_final_combiner(struct gl_context *ctx, uint64_t *in, int *n) 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct combiner_state rc = {}; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The final fragment value equation is something like: 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x_i = A_i * B_i + (1 - A_i) * C_i + D_i 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x_alpha = G_alpha 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * where D_i = E_i * F_i, i one of {red, green, blue}. 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.ColorSumEnabled || ctx->Light.Enabled) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, D, E_TIMES_F, RGB); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, F, SECONDARY_COLOR, RGB); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Enabled) { 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, A, FOG, ALPHA); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, C, FOG, RGB); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, E, FOG, ALPHA); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(&rc, A, 0); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(&rc, C, 0); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_ONE(&rc, E, 0); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture._EnabledUnits) { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, B, SPARE0, RGB); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, G, SPARE0, ALPHA); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, B, PRIMARY_COLOR, RGB); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_SRC(&rc, G, PRIMARY_COLOR, ALPHA); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *in = rc.in; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *n = log2i(ctx->Texture._EnabledUnits) + 1; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_tex_env(struct gl_context *ctx, int emit) 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int i = emit - NOUVEAU_STATE_TEX_ENV0; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t a_in, a_out, c_in, c_out, k; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv10_get_general_combiner(ctx, i, &a_in, &a_out, &c_in, &c_out, &k); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable the combiners we're going to need. */ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 1) { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c_out || a_out) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c_out |= 0x5 << 27; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c_out |= 0x3 << 27; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_IN_ALPHA(i)), 1); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, a_in); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_IN_RGB(i)), 1); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, c_in); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_COLOR(i)), 1); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, k); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_OUT_ALPHA(i)), 1); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, a_out); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_OUT_RGB(i)), 1); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, c_out); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context_dirty(ctx, FRAG); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_frag(struct gl_context *ctx, int emit) 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t in; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv10_get_final_combiner(ctx, &in, &n); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV10_3D(RC_FINAL0), 2); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, in); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, in >> 32); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 412