i915_state_derived.c revision 11ee41fe7f72f7136b531f0c51f820e90a610a79
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/************************************************************************** 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * All Rights Reserved. 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission is hereby granted, free of charge, to any person obtaining a 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * copy of this software and associated documentation files (the 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * "Software"), to deal in the Software without restriction, including 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without limitation the rights to use, copy, modify, merge, publish, 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * distribute, sub license, and/or sell copies of the Software, and to 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * permit persons to whom the Software is furnished to do so, subject to 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * the following conditions: 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * The above copyright notice and this permission notice (including the 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * next paragraph) shall be included in all copies or substantial portions 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * of the Software. 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block **************************************************************************/ 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "util/u_memory.h" 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "pipe/p_shader_tokens.h" 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "draw/draw_context.h" 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "draw/draw_vertex.h" 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "i915_context.h" 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "i915_state.h" 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "i915_debug.h" 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "i915_reg.h" 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*********************************************************************** 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Determine the hardware vertex layout. 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Depends on vertex/fragment shader state. 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstatic void calculate_vertex_layout(struct i915_context *i915) 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const struct i915_fragment_shader *fs = i915->fs; 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const enum interp_mode colorInterp = i915->rasterizer->color_interp; 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block struct vertex_info vinfo; 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block boolean texCoords[8], colors[2], fog, needW; 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uint i; 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int src; 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block memset(texCoords, 0, sizeof(texCoords)); 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block colors[0] = colors[1] = fog = needW = FALSE; 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block memset(&vinfo, 0, sizeof(vinfo)); 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* Determine which fragment program inputs are needed. Setup HW vertex 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * layout below, in the HW-specific attribute order. 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (i = 0; i < fs->info.num_inputs; i++) { 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block switch (fs->info.input_semantic_name[i]) { 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case TGSI_SEMANTIC_POSITION: 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case TGSI_SEMANTIC_COLOR: 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block assert(fs->info.input_semantic_index[i] < 2); 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block colors[fs->info.input_semantic_index[i]] = TRUE; 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case TGSI_SEMANTIC_GENERIC: 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* usually a texcoord */ 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const uint unit = fs->info.input_semantic_index[i]; 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block assert(unit < 8); 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block texCoords[unit] = TRUE; 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block needW = TRUE; 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case TGSI_SEMANTIC_FOG: 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fog = TRUE; 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block default: 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block assert(0); 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* pos */ 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_POSITION, 0); 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (needW) { 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_LINEAR, src); 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[0] |= S4_VFMT_XYZW; 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.attrib[0].emit = EMIT_4F; 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_3F, INTERP_LINEAR, src); 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[0] |= S4_VFMT_XYZ; 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.attrib[0].emit = EMIT_3F; 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* hardware point size */ 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* XXX todo */ 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* primary color */ 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (colors[0]) { 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_COLOR, 0); 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_4UB_BGRA, colorInterp, src); 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[0] |= S4_VFMT_COLOR; 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* secondary color */ 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (colors[1]) { 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_COLOR, 1); 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_4UB_BGRA, colorInterp, src); 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[0] |= S4_VFMT_SPEC_FOG; 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* fog coord, not fog blend factor */ 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (fog) { 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_FOG, 0); 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_1F, INTERP_PERSPECTIVE, src); 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[0] |= S4_VFMT_FOG_PARAM; 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* texcoords */ 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (i = 0; i < 8; i++) { 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uint hwtc; 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (texCoords[i]) { 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block hwtc = TEXCOORDFMT_4D; 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_GENERIC, i); 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_PERSPECTIVE, src); 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block hwtc = TEXCOORDFMT_NOT_PRESENT; 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block vinfo.hwfmt[1] |= hwtc << (i * 4); 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block draw_compute_vertex_size(&vinfo); 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (memcmp(&i915->current.vertex_info, &vinfo, sizeof(vinfo))) { 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* Need to set this flag so that the LIS2/4 registers get set. 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * It also means the i915_update_immediate() function must be called 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * after this one, in i915_update_derived(). 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block i915->dirty |= I915_NEW_VERTEX_FORMAT; 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block memcpy(&i915->current.vertex_info, &vinfo, sizeof(vinfo)); 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct i915_tracked_state i915_update_vertex_layout = { 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block "vertex_layout", 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block calculate_vertex_layout, 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*********************************************************************** 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstatic struct i915_tracked_state *atoms[] = { 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_update_vertex_layout, 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_samplers, 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_sampler_views, 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_immediate, 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_dynamic, 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_fs, 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_framebuffer, 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_dst_buf_vars, 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block &i915_hw_constants, 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block NULL, 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid i915_update_derived(struct i915_context *i915) 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int i; 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (I915_DBG_ON(DBG_ATOMS)) 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block i915_dump_dirty(i915, __FUNCTION__); 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (i = 0; atoms[i]; i++) 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (atoms[i]->dirty & i915->dirty) 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block atoms[i]->update(i915); 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block i915->dirty = 0; 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block