brw_vs.c revision c20cb8d1f6cac0b98950828e69376bb9406761ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) Intel Corp.  2006.  All Rights Reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) develop this 3D driver.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Permission is hereby granted, free of charge, to any person obtaining
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distribute, sublicense, and/or sell copies of the Software, and to
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the following conditions:
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) The above copyright notice and this permission notice (including the
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) next paragraph) shall be included in all copies or substantial
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) portions of the Software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **********************************************************************/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  * Authors:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *   Keith Whitwell <keith@tungstengraphics.com>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/compiler.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "brw_context.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "brw_vs.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "brw_util.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "brw_state.h"
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "program/prog_print.h"
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "program/prog_parameter.h"
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "glsl/ralloc.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic inline void assign_vue_slot(struct brw_vue_map *vue_map,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int vert_result)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Make sure this vert_result hasn't been assigned a slot already */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert (vue_map->vert_result_to_slot[vert_result] == -1);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   vue_map->vert_result_to_slot[vert_result] = vue_map->num_slots;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   vue_map->slot_to_vert_result[vue_map->num_slots++] = vert_result;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compute the VUE map for vertex shader program.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that consumers of this map using cache keys must include
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prog_data->userclip and prog_data->outputs_written in their key
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (generated by CACHE_NEW_VS_PROG).
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)brw_compute_vue_map(struct brw_vs_compile *c)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_context *brw = c->func.brw;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const struct intel_context *intel = &brw->intel;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vue_map *vue_map = &c->prog_data.vue_map;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLbitfield64 outputs_written = c->prog_data.outputs_written;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int i;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   vue_map->num_slots = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < BRW_VERT_RESULT_MAX; ++i) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vue_map->vert_result_to_slot[i] = -1;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vue_map->slot_to_vert_result[i] = BRW_VERT_RESULT_MAX;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* VUE header: format depends on chip generation and whether clipping is
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * enabled.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (intel->gen) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 4:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* There are 8 dwords in VUE header pre-Ironlake:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 0-3 is indices, point width, clip flags.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 4-7 is ndc position
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 8-11 is the first vertex data.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, BRW_VERT_RESULT_NDC);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 5:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* There are 20 DWs (D0-D19) in VUE header on Ironlake:
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       * dword 0-3 of the header is indices, point width, clip flags.
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       * dword 4-7 is the ndc position
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       * dword 8-11 of the vertex header is the 4D space position
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 12-19 of the vertex header is the user clip distance.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 20-23 is a pad so that the vertex element data is aligned
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 24-27 is the first vertex data we fill.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * Note: future pipeline stages expect 4D space position to be
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * contiguous with the other vert_results, so we make dword 24-27 a
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * duplicate copy of the 4D space position.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       */
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      assign_vue_slot(vue_map, BRW_VERT_RESULT_NDC);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, BRW_VERT_RESULT_HPOS_DUPLICATE);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST1);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, BRW_VERT_RESULT_PAD);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 6:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 7:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* There are 8 or 16 DWs (D0-D15) in VUE header on Sandybridge:
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       * dword 0-3 of the header is indices, point width, clip flags.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 4-7 is the 4D space position
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 8-15 of the vertex header is the user clip distance if
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * enabled.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * dword 8-11 or 16-19 is the first vertex element data we fill.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (c->key.userclip_active) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST0);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST1);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* front and back colors need to be consecutive so that we can use
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * ATTRIBUTE_SWIZZLE_INPUTATTR_FACING to swizzle them when doing
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * two-sided color.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_COL0))
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_COL0);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_BFC0))
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_BFC0);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_COL1))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_COL1);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_BFC1))
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assign_vue_slot(vue_map, VERT_RESULT_BFC1);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert (!"VUE map not known for this chip generation");
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* The hardware doesn't care about the rest of the vertex outputs, so just
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * assign them contiguously.  Don't reassign outputs that already have a
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * slot.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Also, prior to Gen6, don't assign a slot for VERT_RESULT_CLIP_VERTEX,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * since it is unsupported.  In Gen6 and above, VERT_RESULT_CLIP_VERTEX may
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * be needed for transform feedback; since we don't want to have to
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * recompute the VUE map (and everything that depends on it) when transform
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * feedback is enabled or disabled, just go ahead and assign a slot for it.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (int i = 0; i < VERT_RESULT_MAX; ++i) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (intel->gen < 6 && i == VERT_RESULT_CLIP_VERTEX)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         continue;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((outputs_written & BITFIELD64_BIT(i)) &&
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          vue_map->vert_result_to_slot[i] == -1) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         assign_vue_slot(vue_map, i);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   }
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Decide which set of clip planes should be used when clipping via
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * gl_Position or gl_ClipVertex.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gl_clip_plane *brw_select_clip_planes(struct gl_context *ctx)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->Shader.CurrentVertexProgram) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* There is currently a GLSL vertex shader, so clip according to GLSL
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * rules, which means compare gl_ClipVertex (or gl_Position, if
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * gl_ClipVertex wasn't assigned) against the eye-coordinate clip planes
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * that were stored in EyeUserPlane at the time the clip planes were
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * specified.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ctx->Transform.EyeUserPlane;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Either we are using fixed function or an ARB vertex program.  In
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * either case the clip planes are going to be compared against
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * gl_Position (which is in clip coordinates) so we have to clip using
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       * _ClipUserPlane, which was transformed into clip coordinates by Mesa
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * core.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return ctx->Transform._ClipUserPlane;
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static bool
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_vs_prog(struct brw_context *brw,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   struct gl_shader_program *prog,
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)	   struct brw_vertex_program *vp,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   struct brw_vs_prog_key *key)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct gl_context *ctx = &brw->intel.ctx;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = &brw->intel;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLuint program_size;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const GLuint *program;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vs_compile c;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void *mem_ctx;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int aux_size;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int i;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&c, 0, sizeof(c));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memcpy(&c.key, key, sizeof(*key));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   mem_ctx = ralloc_context(NULL);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw_init_compile(brw, &c.func, mem_ctx);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   c.vp = vp;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   c.prog_data.outputs_written = vp->program.Base.OutputsWritten;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   c.prog_data.inputs_read = vp->program.Base.InputsRead;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c.key.copy_edgeflag) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.outputs_written |= BITFIELD64_BIT(VERT_RESULT_EDGE);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.inputs_read |= VERT_BIT_EDGEFLAG;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Put dummy slots into the VUE for the SF to put the replaced
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * point sprite coords in.  We shouldn't need these dummy slots,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * which take up precious URB space, but it would mean that the SF
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * doesn't get nice aligned pairs of input coords into output
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * coords, which would be a pain to handle.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < 8; i++) {
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (c.key.point_coord_replace & (1 << i))
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 c.prog_data.outputs_written |= BITFIELD64_BIT(VERT_RESULT_TEX0 + i);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   brw_compute_vue_map(&c);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (0) {
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      _mesa_fprint_program_opt(stdout, &c.vp->program.Base, PROG_PRINT_DEBUG,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			       true);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Emit GEN4 code.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (prog) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!brw_vs_emit(prog, &c)) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ralloc_free(mem_ctx);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return false;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      brw_old_vs_emit(&c);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c.prog_data.nr_pull_params)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.num_surfaces = 1;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c.vp->program.Base.SamplersUsed)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.num_surfaces = SURF_INDEX_VS_TEXTURE(BRW_MAX_TEX_UNIT);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (prog &&
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       prog->_LinkedShaders[MESA_SHADER_VERTEX]->NumUniformBlocks) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.num_surfaces =
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 SURF_INDEX_VS_UBO(prog->_LinkedShaders[MESA_SHADER_VERTEX]->NumUniformBlocks);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Scratch space is used for register spilling */
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c.last_scratch) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      perf_debug("Vertex shader triggered register spilling.  "
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "Try reducing the number of live vec4 values to "
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "improve performance.\n");
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.prog_data.total_scratch = brw_get_scratch_size(c.last_scratch);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      brw_get_scratch_bo(intel, &brw->vs.scratch_bo,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 c.prog_data.total_scratch * brw->max_vs_threads);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* get the program
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   program = brw_get_program(&c.func, &program_size);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We upload from &c.prog_data including the constant_map assuming
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * they're packed together.  It would be nice to have a
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * compile-time assert macro here.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(c.constant_map == (int8_t *)&c.prog_data +
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  sizeof(c.prog_data));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(ctx->Const.VertexProgram.MaxNativeParameters ==
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  ARRAY_SIZE(c.constant_map));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (void) ctx;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   aux_size = sizeof(c.prog_data);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* constant_map */
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   aux_size += c.vp->program.Base.Parameters->NumParameters;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw_upload_cache(&brw->cache, BRW_VS_PROG,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &c.key, sizeof(c.key),
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    program, program_size,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &c.prog_data, aux_size,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &brw->vs.prog_offset, &brw->vs.prog_data);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ralloc_free(mem_ctx);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return true;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)key_debug(const char *name, int a, int b)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (a != b) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      perf_debug("  %s %d->%d\n", name, a, b);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)brw_vs_debug_recompile(struct brw_context *brw,
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       struct gl_shader_program *prog,
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const struct brw_vs_prog_key *key)
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   struct brw_cache_item *c = NULL;
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   const struct brw_vs_prog_key *old_key = NULL;
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   bool found = false;
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   perf_debug("Recompiling vertex shader for program %d\n", prog->Name);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (unsigned int i = 0; i < brw->cache.size; i++) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (c = brw->cache.items[i]; c; c = c->next) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (c->cache_id == BRW_VS_PROG) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            old_key = c->key;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            if (old_key->program_string_id == key->program_string_id)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               break;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (c)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (!c) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      perf_debug("  Didn't find previous compile in the shader cache for "
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 "debug\n");
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   for (unsigned int i = 0; i < VERT_ATTRIB_MAX; i++) {
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      found |= key_debug("GL_FIXED rescaling",
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         old_key->gl_fixed_input_size[i],
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         key->gl_fixed_input_size[i]);
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("user clip flags",
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      old_key->userclip_active, key->userclip_active);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("user clipping planes as push constants",
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      old_key->nr_userclip_plane_consts,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      key->nr_userclip_plane_consts);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("clip distance enable",
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      old_key->uses_clip_distance, key->uses_clip_distance);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("clip plane enable bitfield",
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      old_key->userclip_planes_enabled_gen_4_5,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      key->userclip_planes_enabled_gen_4_5);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("copy edgeflag",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      old_key->copy_edgeflag, key->copy_edgeflag);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   found |= key_debug("PointCoord replace",
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      old_key->point_coord_replace, key->point_coord_replace);
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   found |= key_debug("vertex color clamping",
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      old_key->clamp_vertex_color, key->clamp_vertex_color);
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   found |= brw_debug_recompile_sampler_key(&old_key->tex, &key->tex);
3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   if (!found) {
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      perf_debug("  Something else\n");
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   }
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void brw_upload_vs_prog(struct brw_context *brw)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = &brw->intel;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct gl_context *ctx = &intel->ctx;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vs_prog_key key;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* BRW_NEW_VERTEX_PROGRAM */
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vertex_program *vp =
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (struct brw_vertex_program *)brw->vertex_program;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct gl_program *prog = (struct gl_program *) brw->vertex_program;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int i;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&key, 0, sizeof(key));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Just upload the program verbatim for now.  Always send it all
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the inputs it asks for, whether they are varying or not.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   key.program_string_id = vp->id;
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   key.userclip_active = (ctx->Transform.ClipPlanesEnabled != 0);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   key.uses_clip_distance = vp->program.UsesClipDistance;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (key.userclip_active && !key.uses_clip_distance) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (intel->gen < 6) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         key.nr_userclip_plane_consts
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            = _mesa_bitcount_64(ctx->Transform.ClipPlanesEnabled);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         key.userclip_planes_enabled_gen_4_5
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            = ctx->Transform.ClipPlanesEnabled;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         key.nr_userclip_plane_consts
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            = _mesa_logbase2(ctx->Transform.ClipPlanesEnabled) + 1;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* _NEW_POLYGON */
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (intel->gen < 6) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      key.copy_edgeflag = (ctx->Polygon.FrontMode != GL_FILL ||
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ctx->Polygon.BackMode != GL_FILL);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* _NEW_LIGHT | _NEW_BUFFERS */
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   key.clamp_vertex_color = ctx->Light._ClampVertexColor;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* _NEW_POINT */
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->Point.PointSprite) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < 8; i++) {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 if (ctx->Point.CoordReplace[i])
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	    key.point_coord_replace |= (1 << i);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* _NEW_TEXTURE */
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw_populate_sampler_prog_key_data(ctx, prog, &key.tex);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* BRW_NEW_VERTICES */
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (vp->program.Base.InputsRead & BITFIELD64_BIT(i) &&
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  brw->vb.inputs[i].glarray->Type == GL_FIXED) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 key.gl_fixed_input_size[i] = brw->vb.inputs[i].glarray->Size;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!brw_search_cache(&brw->cache, BRW_VS_PROG,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 &key, sizeof(key),
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 &brw->vs.prog_offset, &brw->vs.prog_data)) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool success = do_vs_prog(brw, ctx->Shader.CurrentVertexProgram,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				vp, &key);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(success);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw->vs.constant_map = ((int8_t *)brw->vs.prog_data +
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   sizeof(*brw->vs.prog_data));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* See brw_vs.c:
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct brw_tracked_state brw_vs_prog = {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   .dirty = {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .mesa  = (_NEW_TRANSFORM | _NEW_POLYGON | _NEW_POINT | _NEW_LIGHT |
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		_NEW_TEXTURE |
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		_NEW_BUFFERS),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .brw   = (BRW_NEW_VERTEX_PROGRAM |
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BRW_NEW_VERTICES),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .cache = 0
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   },
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   .emit = brw_upload_vs_prog
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_context *brw = brw_context(ctx);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vs_prog_key key;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t old_prog_offset = brw->vs.prog_offset;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vs_prog_data *old_prog_data = brw->vs.prog_data;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bool success;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!prog->_LinkedShaders[MESA_SHADER_VERTEX])
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct gl_vertex_program *vp = (struct gl_vertex_program *)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_vertex_program *bvp = brw_vertex_program(vp);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&key, 0, sizeof(key));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   key.program_string_id = bvp->id;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   key.clamp_vertex_color = true;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   success = do_vs_prog(brw, prog, bvp, &key);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw->vs.prog_offset = old_prog_offset;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   brw->vs.prog_data = old_prog_data;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return success;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)