1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Marek Olšák <maraeo@gmail.com> 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 "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_fs.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_screen.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_shader_semantics.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_state_inlines.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_texture.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_vs.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* r300_state_derived: Various bits of state which are dependent upon 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * currently bound CSO data. */ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum r300_rs_swizzle { 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZ_XYZW = 0, 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZ_X001, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZ_XY01, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZ_0001, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum r300_rs_col_write_type { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_COLOR = 0, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_FACE 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_draw_emit_attrib(struct r300_context* r300, 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum attrib_emit emit, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum interp_mode interp, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_shader* vs = r300->vs_state.state; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_shader_info* info = &vs->info; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int output; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = draw_find_shader_output(r300->draw, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->output_semantic_name[index], 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->output_semantic_index[index]); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_emit_vertex_attr(&r300->vertex_info, emit, interp, output); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_draw_emit_all_attribs(struct r300_context* r300) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_shader* vs = r300->vs_state.state; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_shader_semantics* vs_outputs = &vs->outputs; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, gen_count; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Position. */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->pos != ATTR_UNUSED) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->pos); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Point size. */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->psize != ATTR_UNUSED) { 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_1F_PSIZE, INTERP_POS, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->psize); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Colors. */ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_COLOR_COUNT; i++) { 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->color[i] != ATTR_UNUSED) { 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_LINEAR, 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->color[i]); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Back-face colors. */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_COLOR_COUNT; i++) { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->bcolor[i] != ATTR_UNUSED) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_LINEAR, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->bcolor[i]); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Texture coordinates. */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only 8 generic vertex attributes can be used. If there are more, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * they won't be rasterized. */ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_count = 0; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_GENERIC_COUNT && gen_count < 8; i++) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->generic[i] != ATTR_UNUSED && 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !(r300->sprite_coord_enable & (1 << i))) { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->generic[i]); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_count++; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fog coordinates. */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gen_count < 8 && vs_outputs->fog != ATTR_UNUSED) { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->fog); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_count++; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* WPOS. */ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300_fs(r300)->shader->inputs.wpos != ATTR_UNUSED && gen_count < 8) { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_SWTCL, "draw_emit_attrib: WPOS, index: %i\n", 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->wpos); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->wpos); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Update the PSC tables for SW TCL, using Draw. */ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_swtcl_vertex_psc(struct r300_context *r300) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_stream_state *vstream = r300->vertex_stream_state.state; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_info *vinfo = &r300->vertex_info; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint16_t type, swizzle; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, attrib_count; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int* vs_output_tab = r300->stream_loc_notcl; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(vstream, 0, sizeof(struct r300_vertex_stream_state)); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For each Draw attribute, route it to the fragment shader according 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the vs_output_tab. */ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrib_count = vinfo->num_attribs; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_SWTCL, "r300: attrib count: %d\n", attrib_count); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < attrib_count; i++) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_output_tab[i] == -1) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abort(); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = draw_translate_vinfo_format(vinfo->attrib[i].emit); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_SWTCL, 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "r300: swtcl_vertex_psc [%i] <- %s\n", 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_output_tab[i], util_format_short_name(format)); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Obtain the type of data in this attribute. */ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type = r300_translate_vertex_data_type(format); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == R300_INVALID_FORMAT) { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: Bad vertex format %s.\n", 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_short_name(format)); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abort(); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type |= vs_output_tab[i] << R300_DST_VEC_LOC_SHIFT; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Obtain the swizzle for this attribute. Note that the default 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swizzle in the hardware is not XYZW! */ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle = r300_translate_vertex_data_swizzle(format); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add the attribute to the PSC table. */ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i & 1) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->vap_prog_stream_cntl[i >> 1] |= type << 16; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->vap_prog_stream_cntl_ext[i >> 1] |= swizzle << 16; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->vap_prog_stream_cntl[i >> 1] |= type; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->vap_prog_stream_cntl_ext[i >> 1] |= swizzle; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the last vector in the PSC. */ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i -= 1; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->vap_prog_stream_cntl[i >> 1] |= 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R300_LAST_VEC << (i & 1 ? 16 : 0)); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstream->count = (i >> 1) + 1; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_mark_atom_dirty(r300, &r300->vertex_stream_state); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->vertex_stream_state.size = (1 + vstream->count) * 2; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_rs_col(struct r300_rs_block* rs, int id, int ptr, 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_swizzle swiz) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_COL_PTR(ptr); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swiz == SWIZ_0001) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_COL_FMT(R300_RS_COL_FMT_0001); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_COL_FMT(R300_RS_COL_FMT_RGBA); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R300_RS_INST_COL_ID(id); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_rs_col_write(struct r300_rs_block* rs, int id, int fp_offset, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_col_write_type type) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(type == WRITE_COLOR); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R300_RS_INST_COL_CN_WRITE | 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_INST_COL_ADDR(fp_offset); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_rs_tex(struct r300_rs_block* rs, int id, int ptr, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_swizzle swiz) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swiz == SWIZ_X001) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_TEX_PTR(ptr) | 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_S(R300_RS_SEL_C0) | 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_T(R300_RS_SEL_K0) | 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_R(R300_RS_SEL_K0) | 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_Q(R300_RS_SEL_K1); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (swiz == SWIZ_XY01) { 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_TEX_PTR(ptr) | 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_S(R300_RS_SEL_C0) | 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_T(R300_RS_SEL_C1) | 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_R(R300_RS_SEL_K0) | 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_Q(R300_RS_SEL_K1); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R300_RS_TEX_PTR(ptr) | 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_S(R300_RS_SEL_C0) | 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_T(R300_RS_SEL_C1) | 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_R(R300_RS_SEL_C2) | 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_SEL_Q(R300_RS_SEL_C3); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R300_RS_INST_TEX_ID(id); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_rs_tex_write(struct r300_rs_block* rs, int id, int fp_offset) 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R300_RS_INST_TEX_CN_WRITE | 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_RS_INST_TEX_ADDR(fp_offset); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r500_rs_col(struct r300_rs_block* rs, int id, int ptr, 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_swizzle swiz) 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_COL_PTR(ptr); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swiz == SWIZ_0001) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_COL_FMT(R300_RS_COL_FMT_0001); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_COL_FMT(R300_RS_COL_FMT_RGBA); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R500_RS_INST_COL_ID(id); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r500_rs_col_write(struct r300_rs_block* rs, int id, int fp_offset, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_col_write_type type) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == WRITE_FACE) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R500_RS_INST_COL_CN_WRITE_BACKFACE | 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_INST_COL_ADDR(fp_offset); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R500_RS_INST_COL_CN_WRITE | 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_INST_COL_ADDR(fp_offset); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r500_rs_tex(struct r300_rs_block* rs, int id, int ptr, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum r300_rs_swizzle swiz) 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swiz == SWIZ_X001) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_SEL_S(ptr) | 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_T(R500_RS_IP_PTR_K0) | 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_R(R500_RS_IP_PTR_K0) | 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_Q(R500_RS_IP_PTR_K1); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (swiz == SWIZ_XY01) { 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_SEL_S(ptr) | 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_T(ptr + 1) | 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_R(R500_RS_IP_PTR_K0) | 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_Q(R500_RS_IP_PTR_K1); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->ip[id] |= R500_RS_SEL_S(ptr) | 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_T(ptr + 1) | 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_R(ptr + 2) | 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_SEL_Q(ptr + 3); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R500_RS_INST_TEX_ID(id); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r500_rs_tex_write(struct r300_rs_block* rs, int id, int fp_offset) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->inst[id] |= R500_RS_INST_TEX_CN_WRITE | 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_RS_INST_TEX_ADDR(fp_offset); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Set up the RS block. 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the part of the chipset that is responsible for linking vertex 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and fragment shaders and stuffed texture coordinates. 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The rasterizer reads data from VAP, which produces vertex shader outputs, 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and GA, which produces stuffed texture coordinates. VAP outputs have 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * precedence over GA. All outputs must be rasterized otherwise it locks up. 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If there are more outputs rasterized than is set in VAP/GA, it locks up 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * too. The funky part is that this info has been pretty much obtained by trial 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and error. */ 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_update_rs_block(struct r300_context *r300) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_shader *vs = r300->vs_state.state; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_shader_semantics *vs_outputs = &vs->outputs; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_shader_semantics *fs_inputs = &r300_fs(r300)->shader->inputs; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_rs_block rs = {0}; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, col_count = 0, tex_count = 0, fp_offset = 0, count, loc = 0, tex_ptr = 0; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*rX00_rs_col)(struct r300_rs_block*, int, int, enum r300_rs_swizzle); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*rX00_rs_col_write)(struct r300_rs_block*, int, int, enum r300_rs_col_write_type); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*rX00_rs_tex)(struct r300_rs_block*, int, int, enum r300_rs_swizzle); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*rX00_rs_tex_write)(struct r300_rs_block*, int, int); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean any_bcolor_used = vs_outputs->bcolor[0] != ATTR_UNUSED || 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->bcolor[1] != ATTR_UNUSED; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *stream_loc_notcl = r300->stream_loc_notcl; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t stuffing_enable = 0; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col = r500_rs_col; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col_write = r500_rs_col_write; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex = r500_rs_tex; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex_write = r500_rs_tex_write; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col = r300_rs_col; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col_write = r300_rs_col_write; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex = r300_rs_tex; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex_write = r300_rs_tex_write; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 0x5555 copied from classic, which means: 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Select user color 0 for COLOR0 up to COLOR7. 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * What the hell does that mean? */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vtx_state_cntl = 0x5555; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The position is always present in VAP. */ 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= R300_INPUT_CNTL_POS; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[0] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 0; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the point size in VAP. */ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->psize != ATTR_UNUSED) { 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[0] |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 1; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up and rasterize colors. */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_COLOR_COUNT; i++) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->color[i] != ATTR_UNUSED || any_bcolor_used || 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_outputs->color[1] != ATTR_UNUSED) { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the color in VAP. */ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= R300_INPUT_CNTL_COLOR; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[0] |= 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT << i; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 2 + i; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize it. */ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col(&rs, col_count, col_count, SWIZ_XYZW); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Write it to the FS input register if it's needed by the FS. */ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->color[i] != ATTR_UNUSED) { 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col_write(&rs, col_count, fp_offset, WRITE_COLOR); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "r300: Rasterized color %i written to FS.\n", i); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized color %i unused.\n", i); 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org col_count++; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Skip the FS input register, leave it uninitialized. */ 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we try to set it to (0,0,0,1), it will lock up. */ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->color[i] != ATTR_UNUSED) { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: FS input color %i unassigned%s.\n", 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up back-face colors. The rasterizer will do the color selection 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * automatically. */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (any_bcolor_used) { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->two_sided_color) { 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize as back-face colors. */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_COLOR_COUNT; i++) { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= R300_INPUT_CNTL_COLOR; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT << (2+i); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 4 + i; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize two fake texcoords to prevent from the two-sided color 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * selection. */ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX Consider recompiling the vertex shader to save 2 RS units. */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << tex_count); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[1] |= (4 << (3 * tex_count)); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 6 + tex_count; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize it. */ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex(&rs, tex_count, tex_ptr, SWIZ_XYZW); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_count++; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_ptr += 4; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gl_FrontFacing. 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that we can use either the two-sided color selection based on 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the front and back vertex shader colors, or gl_FrontFacing, 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but not both! It locks up otherwise. 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In Direct3D 9, the two-sided color selection can be used 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with shaders 2.0 only, while gl_FrontFacing can be used 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with shaders 3.0 only. The hardware apparently hasn't been designed 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to support both at the same time. */ 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500 && fs_inputs->face != ATTR_UNUSED && 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !(any_bcolor_used && r300->two_sided_color)) { 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col(&rs, col_count, col_count, SWIZ_XYZW); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col_write(&rs, col_count, fp_offset, WRITE_FACE); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org col_count++; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized FACE written to FS.\n"); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (fs_inputs->face != ATTR_UNUSED) { 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: ERROR: FS input FACE unassigned.\n"); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize texture coordinates. */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ATTR_GENERIC_COUNT && tex_count < 8; i++) { 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean sprite_coord = false; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->generic[i] != ATTR_UNUSED) { 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprite_coord = !!(r300->sprite_coord_enable & (1 << i)); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->generic[i] != ATTR_UNUSED || sprite_coord) { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sprite_coord) { 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the texture coordinates in VAP. */ 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << tex_count); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[1] |= (4 << (3 * tex_count)); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 6 + tex_count; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stuffing_enable |= 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_GB_TEX_ST << (R300_GB_TEX0_SOURCE_SHIFT + (tex_count*2)); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize it. */ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex(&rs, tex_count, tex_ptr, 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprite_coord ? SWIZ_XY01 : SWIZ_XYZW); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Write it to the FS input register if it's needed by the FS. */ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->generic[i] != ATTR_UNUSED) { 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex_write(&rs, tex_count, fp_offset); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "r300: Rasterized generic %i written to FS%s in texcoord %d.\n", 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, sprite_coord ? " (sprite coord)" : "", tex_count); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "r300: Rasterized generic %i unused%s.\n", 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, sprite_coord ? " (sprite coord)" : ""); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_count++; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_ptr += sprite_coord ? 2 : 4; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Skip the FS input register, leave it uninitialized. */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we try to set it to (0,0,0,1), it will lock up. */ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->generic[i] != ATTR_UNUSED) { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: FS input generic %i unassigned%s.\n", 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, sprite_coord ? " (sprite coord)" : ""); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < ATTR_GENERIC_COUNT; i++) { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->generic[i] != ATTR_UNUSED) { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: ERROR: FS input generic %i unassigned, " 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "not enough hardware slots (it's not a bug, do not " 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "report it).\n", i); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize fog coordinates. */ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_outputs->fog != ATTR_UNUSED && tex_count < 8) { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the fog coordinates in VAP. */ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << tex_count); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[1] |= (4 << (3 * tex_count)); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 6 + tex_count; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize it. */ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex(&rs, tex_count, tex_ptr, SWIZ_X001); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Write it to the FS input register if it's needed by the FS. */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->fog != ATTR_UNUSED) { 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex_write(&rs, tex_count, fp_offset); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized fog written to FS.\n"); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized fog unused.\n"); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_count++; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_ptr += 4; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Skip the FS input register, leave it uninitialized. */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we try to set it to (0,0,0,1), it will lock up. */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->fog != ATTR_UNUSED) { 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex_count < 8) { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: FS input fog unassigned.\n"); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: ERROR: FS input fog unassigned, " 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "not enough hardware slots. (it's not a bug, " 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "do not report it)\n"); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize WPOS. */ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Don't set it in VAP if the FS doesn't need it. */ 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->wpos != ATTR_UNUSED && tex_count < 8) { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the WPOS coordinates in VAP. */ 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << tex_count); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.vap_out_vtx_fmt[1] |= (4 << (3 * tex_count)); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = 6 + tex_count; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize it. */ 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex(&rs, tex_count, tex_ptr, SWIZ_XYZW); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Write it to the FS input register. */ 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_tex_write(&rs, tex_count, fp_offset); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized WPOS written to FS.\n"); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fp_offset++; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_count++; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_ptr += 4; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs_inputs->wpos != ATTR_UNUSED && tex_count >= 8) { 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: ERROR: FS input WPOS unassigned, " 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "not enough hardware slots. (it's not a bug, do not " 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "report it)\n"); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Invalidate the rest of the no-TCL (GA) stream locations. */ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; loc < 16;) { 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stream_loc_notcl[loc++] = -1; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterize at least one color, or bad things happen. */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (col_count == 0 && tex_count == 0) { 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rX00_rs_col(&rs, 0, 0, SWIZ_0001); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org col_count++; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: Rasterized color 0 to prevent lockups.\n"); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_RS, "r300: --- Rasterizer status ---: colors: %i, " 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "generics: %i.\n", col_count, tex_count); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.count = MIN2(tex_ptr, 32) | (col_count << R300_IC_COUNT_SHIFT) | 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_HIRES_EN; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = MAX3(col_count, tex_count, 1); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.inst_count = count - 1; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set the GB enable flags */ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->sprite_coord_enable) 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stuffing_enable |= R300_GB_POINT_STUFF_ENABLE; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs.gb_enable = stuffing_enable; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now, after all that, see if we actually need to update the state. */ 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block))) { 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block)); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rs_block_state.size = 13 + count*2; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void rgba_to_bgra(float color[4]) 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float x = color[0]; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[0] = color[2]; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[2] = x; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r300_get_border_color(enum pipe_format format, 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float border[4], 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_r500) 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float border_swizzled[4] = {0}; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union util_color uc = {0}; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(format); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do depth formats first. */ 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_depth_or_stencil(format)) { 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8Z24_UNORM: 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_r500) { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_pack_z(PIPE_FORMAT_X8Z24_UNORM, border[0]); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]) << 16; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Apply inverse swizzle of the format. */ 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_unswizzle_4f(border_swizzled, border, desc->swizzle); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compressed formats. */ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_compressed(format)) { 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_RGTC1_SNORM: 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_LATC1_SNORM: 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_swizzled[0] = border_swizzled[0] < 0 ? 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_swizzled[0]*0.5+1 : 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_swizzled[0]*0.5; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Pass through. */ 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_RGTC1_UNORM: 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_LATC1_UNORM: 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add 1/32 to round the border color instead of truncating. */ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The Y component is used for the border color. */ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_swizzled[1] = border_swizzled[0] + 1.0f/32; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_RGTC2_SNORM: 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_LATC2_SNORM: 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_SNORM, &uc); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_RGTC2_UNORM: 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_LATC2_UNORM: 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_SRGB: 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_SRGBA: 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT3_SRGBA: 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT5_SRGBA: 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_SRGB, &uc); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->channel[0].size) { 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba_to_bgra(border_swizzled); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B2G3R3_UNORM, &uc); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba_to_bgra(border_swizzled); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 5: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba_to_bgra(border_swizzled); 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[1].size == 5) { 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B5G5R5A1_UNORM, &uc); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (desc->channel[1].size == 6) { 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_B5G6R5_UNORM, &uc); 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) { 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_SNORM, &uc); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->nr_channels == 2) { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_swizzled[3] = border_swizzled[1]; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_L8A8_SRGB, &uc); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_SRGB, &uc); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 10: 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R10G10B10A2_UNORM, &uc); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->nr_channels <= 2) { 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_FLOAT, &uc); 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) { 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_SNORM, &uc); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_UNORM, &uc); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) { 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_SNORM, &uc); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->nr_channels == 1) { 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R32_FLOAT, &uc); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return uc.ui; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_merge_textures_and_samplers(struct r300_context* r300) 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_textures_state *state = 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct r300_textures_state*)r300->textures_state.state; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_texture_sampler_state *texstate; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_sampler_state *sampler; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_sampler_view *view; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *tex; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned base_level, min_level, level_count, i, j, size; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = MIN2(state->sampler_view_count, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->sampler_state_count); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_us_format = r300->screen->caps.has_us_format; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The KIL opcode fix, see below. */ 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count && !r300->screen->caps.is_r500) 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = 1; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->tx_enable = 0; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->count = 0; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 2; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->sampler_views[i] && state->sampler_states[i]) { 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->tx_enable |= 1 << i; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = state->sampler_views[i]; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(view->base.texture); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler = state->sampler_states[i]; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate = &state->regs[i]; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format = view->format; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 = sampler->filter0; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter1 = sampler->filter1; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the border color. */ 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->border_color = 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_get_border_color(view->base.format, 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->state.border_color.f, 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->screen->caps.is_r500); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* determine min/max levels */ 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base_level = view->base.u.tex.first_level; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min_level = sampler->min_lod; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level_count = MIN3(sampler->max_lod, 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->b.b.last_level - base_level, 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.u.tex.last_level - base_level); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (base_level + min_level) { 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->tex.is_npot) { 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Even though we do not implement mipmapping for NPOT 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * textures, we should at least honor the minimum level 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which is allowed to be displayed. We do this by setting up 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an i-th mipmap level as the zero level. */ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base_level += min_level; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = tex->tex.offset_in_bytes[base_level]; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_texture_setup_format_state(r300->screen, tex, 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.format, 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base_level, 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->width0_override, 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->height0_override, 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &texstate->format); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.tile_config |= offset & 0xffffffe0; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((offset & 0x1f) == 0); 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Assign a texture cache region. */ 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.format1 |= view->texcache_region; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Depth textures are kinda special. */ 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_depth_or_stencil(view->base.format)) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char depth_swizzle[4]; 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r300->screen->caps.is_r500 && 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_get_blocksizebits(view->base.format) == 32) { 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* X24x8 is sampled as Y16X16 on r3xx-r4xx. 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The depth here is at the Y component. */ 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_swizzle[j] = UTIL_FORMAT_SWIZZLE_Y; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_swizzle[j] = UTIL_FORMAT_SWIZZLE_X; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If compare mode is disabled, sampler view swizzles 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are stored in the format. 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, the swizzles must be applied after the compare 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mode in the fragment shader. */ 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sampler->state.compare_mode == PIPE_TEX_COMPARE_NONE) { 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.format1 |= 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_get_swizzle_combined(depth_swizzle, 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->swizzle, FALSE); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.format1 |= 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_get_swizzle_combined(depth_swizzle, 0, FALSE); 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.dxtc_swizzle && 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_is_compressed(view->base.format)) { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter1 |= R400_DXTC_SWIZZLE_ENABLE; 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* to emulate 1D textures through 2D ones correctly */ 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->b.b.target == PIPE_TEXTURE_1D) { 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_WRAP_T_MASK; 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_WRAP_T(R300_TX_CLAMP_TO_EDGE); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The hardware doesn't like CLAMP and CLAMP_TO_BORDER 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for the 3rd coordinate if the texture isn't 3D. */ 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->b.b.target != PIPE_TEXTURE_3D) { 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_WRAP_R_MASK; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->tex.is_npot) { 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NPOT textures don't support mip filter, unfortunately. 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This prevents incorrect rendering. */ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_MIN_FILTER_MIP_MASK; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mask out the mirrored flag. */ 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texstate->filter0 & R300_TX_WRAP_S(R300_TX_MIRRORED)) { 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_WRAP_S(R300_TX_MIRRORED); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texstate->filter0 & R300_TX_WRAP_T(R300_TX_MIRRORED)) { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_WRAP_T(R300_TX_MIRRORED); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Change repeat to clamp-to-edge. 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (the repeat bit has a value of 0, no masking needed). */ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texstate->filter0 & R300_TX_WRAP_S_MASK) == 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_TX_WRAP_S(R300_TX_REPEAT)) { 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_WRAP_S(R300_TX_CLAMP_TO_EDGE); 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texstate->filter0 & R300_TX_WRAP_T_MASK) == 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_TX_WRAP_T(R300_TX_REPEAT)) { 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_WRAP_T(R300_TX_CLAMP_TO_EDGE); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the MAX_MIP level is the largest (finest) one */ 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.format0 |= R300_TX_NUM_LEVELS(level_count); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_MAX_MIP_LEVEL(min_level); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Float textures only support nearest and mip-nearest filtering. */ 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_float(view->base.format)) { 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No MAG linear filtering. */ 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texstate->filter0 & R300_TX_MAG_FILTER_MASK) == 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_TX_MAG_FILTER_LINEAR) { 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_MAG_FILTER_MASK; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_MAG_FILTER_NEAREST; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No MIN linear filtering. */ 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texstate->filter0 & R300_TX_MIN_FILTER_MASK) == 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_TX_MIN_FILTER_LINEAR) { 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_MIN_FILTER_MASK; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_MIN_FILTER_NEAREST; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No mipmap linear filtering. */ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texstate->filter0 & R300_TX_MIN_FILTER_MIP_MASK) == 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_TX_MIN_FILTER_MIP_LINEAR) { 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_MIN_FILTER_MIP_MASK; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= R300_TX_MIN_FILTER_MIP_NEAREST; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No anisotropic filtering. */ 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 &= ~R300_TX_MAX_ANISO_MASK; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter1 &= ~R500_TX_MAX_ANISO_MASK; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter1 &= ~R500_TX_ANISO_HIGH_QUALITY; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= i << 28; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size += 16 + (has_us_format ? 2 : 0); 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->count = i+1; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For the KIL opcode to work on r3xx-r4xx, the texture unit 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * assigned to this opcode (it's always the first one) must be 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * enabled. Otherwise the opcode doesn't work. 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In order to not depend on the fragment shader, we just make 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the first unit enabled all the time. */ 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0 && !r300->screen->caps.is_r500) { 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference( 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_sampler_view**)&state->sampler_views[i], 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &r300->texkill_sampler->base); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->tx_enable |= 1 << i; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate = &state->regs[i]; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Just set some valid state. */ 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format = r300->texkill_sampler->format; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 = 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_translate_tex_filters(PIPE_TEX_FILTER_NEAREST, 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TEX_FILTER_NEAREST, 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TEX_FILTER_NEAREST, 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FALSE); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter1 = 0; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->border_color = 0; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->filter0 |= i << 28; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size += 16 + (has_us_format ? 2 : 0); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->count = i+1; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->textures_state.size = size; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Pick a fragment shader based on either the texture compare state 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or the uses_pitch flag or some other external state. */ 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count && 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->fs_status == FRAGMENT_SHADER_VALID) { 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->fs_status = FRAGMENT_SHADER_MAYBE_DIRTY; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_decompress_depth_textures(struct r300_context *r300) 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_textures_state *state = 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct r300_textures_state*)r300->textures_state.state; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = MIN2(state->sampler_view_count, 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->sampler_state_count); 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r300->locked_zbuffer) { 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->sampler_views[i] && state->sampler_states[i]) { 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = state->sampler_views[i]->base.texture; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex == r300->locked_zbuffer->texture) { 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_decompress_zmask_locked(r300); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_validate_fragment_shader(struct r300_context *r300) 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = r300->fb_state.state; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->fs.state && r300->fs_status != FRAGMENT_SHADER_VALID) { 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Pick the fragment shader based on external states. 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Then mark the state dirty if the fragment shader is either dirty 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or the function r300_pick_fragment_shader changed the shader. */ 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300_pick_fragment_shader(r300) || 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->fs_status == FRAGMENT_SHADER_DIRTY) { 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mark the state atom as dirty. */ 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_mark_fs_code_dirty(r300); 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Does Multiwrite need to be changed? */ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs > 1) { 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean new_multiwrite = 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_fragment_shader_writes_all(r300_fs(r300)); 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->fb_multiwrite != new_multiwrite) { 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->fb_multiwrite = new_multiwrite; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_mark_fb_state_dirty(r300, R300_CHANGED_MULTIWRITE); 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->fs_status = FRAGMENT_SHADER_VALID; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_update_derived_state(struct r300_context* r300) 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->textures_state.dirty) { 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_decompress_depth_textures(r300); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_merge_textures_and_samplers(r300); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_validate_fragment_shader(r300); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->rs_block_state.dirty) { 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_update_rs_block(r300); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->draw) { 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&r300->vertex_info, 0, sizeof(struct vertex_info)); 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_draw_emit_all_attribs(r300); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_compute_vertex_size(&r300->vertex_info); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_swtcl_vertex_psc(r300); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_update_hyperz_state(r300); 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1037