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