19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*
29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp.  2006.  All Rights Reserved.
39f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver.
59f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining
79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the
89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including
99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish,
109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to
119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to
129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions:
139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the
159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial
169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software.
179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/
279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /*
289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  * Authors:
299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  *   Keith Whitwell <keith@tungstengraphics.com>
309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  */
319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
33af3c9803d818fd33139f1247a387d64b967b8992Eric Anholt#include "main/compiler.h"
349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h"
359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_vs.h"
369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_util.h"
379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_state.h"
38ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h"
39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h"
409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
412f0edc60f4bd2ae5999a6afa656e3bb3f181bf0fChad Versace#include "glsl/ralloc.h"
429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
4345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berrystatic inline void assign_vue_slot(struct brw_vue_map *vue_map,
4445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry                                   int vert_result)
4545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry{
4645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   /* Make sure this vert_result hasn't been assigned a slot already */
4745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   assert (vue_map->vert_result_to_slot[vert_result] == -1);
4845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
4945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   vue_map->vert_result_to_slot[vert_result] = vue_map->num_slots;
5045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   vue_map->slot_to_vert_result[vue_map->num_slots++] = vert_result;
5145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry}
5245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
5345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry/**
5445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry * Compute the VUE map for vertex shader program.
559f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt *
569f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt * Note that consumers of this map using cache keys must include
579f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt * prog_data->userclip and prog_data->outputs_written in their key
589f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt * (generated by CACHE_NEW_VS_PROG).
5945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry */
60f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholtstatic void
61f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholtbrw_compute_vue_map(struct brw_vs_compile *c)
6245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry{
63f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt   struct brw_context *brw = c->func.brw;
64f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt   const struct intel_context *intel = &brw->intel;
65f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt   struct brw_vue_map *vue_map = &c->prog_data.vue_map;
66f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt   GLbitfield64 outputs_written = c->prog_data.outputs_written;
6745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   int i;
6845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
6945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   vue_map->num_slots = 0;
7045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   for (i = 0; i < BRW_VERT_RESULT_MAX; ++i) {
7145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      vue_map->vert_result_to_slot[i] = -1;
7245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      vue_map->slot_to_vert_result[i] = BRW_VERT_RESULT_MAX;
7345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   }
7445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
7545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   /* VUE header: format depends on chip generation and whether clipping is
7645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry    * enabled.
7745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry    */
7845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   switch (intel->gen) {
7945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   case 4:
8045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      /* There are 8 dwords in VUE header pre-Ironlake:
8145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 0-3 is indices, point width, clip flags.
8245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 4-7 is ndc position
8345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 8-11 is the first vertex data.
8445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       */
8545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
8645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, BRW_VERT_RESULT_NDC);
8745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
8845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      break;
8945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   case 5:
9045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      /* There are 20 DWs (D0-D19) in VUE header on Ironlake:
9145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 0-3 of the header is indices, point width, clip flags.
9245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 4-7 is the ndc position
9345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 8-11 of the vertex header is the 4D space position
9445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 12-19 of the vertex header is the user clip distance.
9545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 20-23 is a pad so that the vertex element data is aligned
9645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 24-27 is the first vertex data we fill.
9745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       *
9845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * Note: future pipeline stages expect 4D space position to be
9945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * contiguous with the other vert_results, so we make dword 24-27 a
10045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * duplicate copy of the 4D space position.
10145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       */
10245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
10345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, BRW_VERT_RESULT_NDC);
10445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, BRW_VERT_RESULT_HPOS_DUPLICATE);
10562bad54727690bff5ed42a74272e7822fd36cdb6Paul Berry      assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST0);
10662bad54727690bff5ed42a74272e7822fd36cdb6Paul Berry      assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST1);
10745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, BRW_VERT_RESULT_PAD);
10845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
10945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      break;
11045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   case 6:
11145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   case 7:
11245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      /* There are 8 or 16 DWs (D0-D15) in VUE header on Sandybridge:
11345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 0-3 of the header is indices, point width, clip flags.
11445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 4-7 is the 4D space position
11545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 8-15 of the vertex header is the user clip distance if
11645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * enabled.
11745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       * dword 8-11 or 16-19 is the first vertex element data we fill.
11845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry       */
11945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_PSIZ);
12045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assign_vue_slot(vue_map, VERT_RESULT_HPOS);
121f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt      if (c->key.userclip_active) {
12262bad54727690bff5ed42a74272e7822fd36cdb6Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST0);
12362bad54727690bff5ed42a74272e7822fd36cdb6Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_CLIP_DIST1);
12445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      }
125f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry      /* front and back colors need to be consecutive so that we can use
126f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry       * ATTRIBUTE_SWIZZLE_INPUTATTR_FACING to swizzle them when doing
127f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry       * two-sided color.
128f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry       */
129f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_COL0))
130f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_COL0);
131f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_BFC0))
132f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_BFC0);
133f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_COL1))
134f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_COL1);
135f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry      if (outputs_written & BITFIELD64_BIT(VERT_RESULT_BFC1))
136f2b09257ba04a8f50c58e208ca8ab66cfa362298Paul Berry         assign_vue_slot(vue_map, VERT_RESULT_BFC1);
13745f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      break;
13845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   default:
13945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      assert (!"VUE map not known for this chip generation");
14045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      break;
14145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   }
14245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
14345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   /* The hardware doesn't care about the rest of the vertex outputs, so just
14445f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry    * assign them contiguously.  Don't reassign outputs that already have a
14545f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry    * slot.
146d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry    *
147989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry    * Also, prior to Gen6, don't assign a slot for VERT_RESULT_CLIP_VERTEX,
148989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry    * since it is unsupported.  In Gen6 and above, VERT_RESULT_CLIP_VERTEX may
149989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry    * be needed for transform feedback; since we don't want to have to
150989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry    * recompute the VUE map (and everything that depends on it) when transform
151989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry    * feedback is enabled or disabled, just go ahead and assign a slot for it.
15245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry    */
15345f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   for (int i = 0; i < VERT_RESULT_MAX; ++i) {
154989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry      if (intel->gen < 6 && i == VERT_RESULT_CLIP_VERTEX)
155989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry         continue;
15645f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      if ((outputs_written & BITFIELD64_BIT(i)) &&
157989b5722dc350b01c4148b1cd978b71ec4bcfe81Paul Berry          vue_map->vert_result_to_slot[i] == -1) {
15845f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry         assign_vue_slot(vue_map, i);
15945f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry      }
16045f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry   }
16145f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry}
16245f1d7a66666d849031ffc2b8647149e17cc13bcPaul Berry
163d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry
164d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry/**
165d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry * Decide which set of clip planes should be used when clipping via
166d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry * gl_Position or gl_ClipVertex.
167d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry */
168d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berrygl_clip_plane *brw_select_clip_planes(struct gl_context *ctx)
169d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry{
170d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry   if (ctx->Shader.CurrentVertexProgram) {
171d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry      /* There is currently a GLSL vertex shader, so clip according to GLSL
172d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * rules, which means compare gl_ClipVertex (or gl_Position, if
173d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * gl_ClipVertex wasn't assigned) against the eye-coordinate clip planes
174d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * that were stored in EyeUserPlane at the time the clip planes were
175d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * specified.
176d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       */
177d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry      return ctx->Transform.EyeUserPlane;
178d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry   } else {
179d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry      /* Either we are using fixed function or an ARB vertex program.  In
180d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * either case the clip planes are going to be compared against
181d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * gl_Position (which is in clip coordinates) so we have to clip using
182d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * _ClipUserPlane, which was transformed into clip coordinates by Mesa
183d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       * core.
184d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry       */
185d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry      return ctx->Transform._ClipUserPlane;
186d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry   }
187d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry}
188d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry
189d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry
1907fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholtstatic bool
1917fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholtdo_vs_prog(struct brw_context *brw,
1927fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt	   struct gl_shader_program *prog,
1937fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt	   struct brw_vertex_program *vp,
1947fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt	   struct brw_vs_prog_key *key)
1959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
196f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = &brw->intel.ctx;
1972b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt   struct intel_context *intel = &brw->intel;
1989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint program_size;
1999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   const GLuint *program;
2009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_vs_compile c;
201774fb90db3e83d5e7326b7a72e05ce805c306b24Kenneth Graunke   void *mem_ctx;
202fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   int aux_size;
20364f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   int i;
2049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   memset(&c, 0, sizeof(c));
2069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   memcpy(&c.key, key, sizeof(*key));
2079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
208774fb90db3e83d5e7326b7a72e05ce805c306b24Kenneth Graunke   mem_ctx = ralloc_context(NULL);
209774fb90db3e83d5e7326b7a72e05ce805c306b24Kenneth Graunke
210774fb90db3e83d5e7326b7a72e05ce805c306b24Kenneth Graunke   brw_init_compile(brw, &c.func, mem_ctx);
2119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   c.vp = vp;
2129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   c.prog_data.outputs_written = vp->program.Base.OutputsWritten;
214f2eb6434ab1cf72e938956c82d2f530368a6be4aKeith Whitwell   c.prog_data.inputs_read = vp->program.Base.InputsRead;
2159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (c.key.copy_edgeflag) {
2175606dfb572bf4b89b4882265924705bacc8c182bIan Romanick      c.prog_data.outputs_written |= BITFIELD64_BIT(VERT_RESULT_EDGE);
218dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      c.prog_data.inputs_read |= VERT_BIT_EDGEFLAG;
2199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
2209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
22164f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   /* Put dummy slots into the VUE for the SF to put the replaced
22264f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt    * point sprite coords in.  We shouldn't need these dummy slots,
22364f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt    * which take up precious URB space, but it would mean that the SF
22464f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt    * doesn't get nice aligned pairs of input coords into output
22564f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt    * coords, which would be a pain to handle.
22664f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt    */
22764f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   for (i = 0; i < 8; i++) {
22864f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt      if (c.key.point_coord_replace & (1 << i))
22964f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt	 c.prog_data.outputs_written |= BITFIELD64_BIT(VERT_RESULT_TEX0 + i);
23064f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   }
23164f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt
232caa4ae5d7d864278ffbf5dbd9c25bb2932e91fc5Kenneth Graunke   brw_compute_vue_map(&c);
233caa4ae5d7d864278ffbf5dbd9c25bb2932e91fc5Kenneth Graunke
23472fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt   if (0) {
23572fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt      _mesa_fprint_program_opt(stdout, &c.vp->program.Base, PROG_PRINT_DEBUG,
2362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke			       true);
23772fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt   }
2389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Emit GEN4 code.
2409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
241bdedd03b701781c8b71e162f7eb834e6a11105deKenneth Graunke   if (prog) {
2427fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt      if (!brw_vs_emit(prog, &c)) {
2437fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt	 ralloc_free(mem_ctx);
2447fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt	 return false;
2457fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt      }
246af3c9803d818fd33139f1247a387d64b967b8992Eric Anholt   } else {
247af3c9803d818fd33139f1247a387d64b967b8992Eric Anholt      brw_old_vs_emit(&c);
248af3c9803d818fd33139f1247a387d64b967b8992Eric Anholt   }
2499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
25007e00b3040d6da381595c65db5afe597f20d99fcEric Anholt   if (c.prog_data.nr_pull_params)
25107e00b3040d6da381595c65db5afe597f20d99fcEric Anholt      c.prog_data.num_surfaces = 1;
25207e00b3040d6da381595c65db5afe597f20d99fcEric Anholt   if (c.vp->program.Base.SamplersUsed)
25325d2bf3845e9a6faaef8d808c1255ec57dc71dbaEric Anholt      c.prog_data.num_surfaces = SURF_INDEX_VS_TEXTURE(BRW_MAX_TEX_UNIT);
25404871058eb01c5b51a0180055e7dbdc967f56604Eric Anholt   if (prog &&
25504871058eb01c5b51a0180055e7dbdc967f56604Eric Anholt       prog->_LinkedShaders[MESA_SHADER_VERTEX]->NumUniformBlocks) {
25604871058eb01c5b51a0180055e7dbdc967f56604Eric Anholt      c.prog_data.num_surfaces =
25704871058eb01c5b51a0180055e7dbdc967f56604Eric Anholt	 SURF_INDEX_VS_UBO(prog->_LinkedShaders[MESA_SHADER_VERTEX]->NumUniformBlocks);
25804871058eb01c5b51a0180055e7dbdc967f56604Eric Anholt   }
25907e00b3040d6da381595c65db5afe597f20d99fcEric Anholt
2602b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt   /* Scratch space is used for register spilling */
2612b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt   if (c.last_scratch) {
2624cfb9e30000eea9cb1f316ace9347083b619cdb0Eric Anholt      perf_debug("Vertex shader triggered register spilling.  "
2634cfb9e30000eea9cb1f316ace9347083b619cdb0Eric Anholt                 "Try reducing the number of live vec4 values to "
2644cfb9e30000eea9cb1f316ace9347083b619cdb0Eric Anholt                 "improve performance.\n");
2654cfb9e30000eea9cb1f316ace9347083b619cdb0Eric Anholt
266cb415d4df644a8caffe861626dec5f7aa4cefa49Kenneth Graunke      c.prog_data.total_scratch = brw_get_scratch_size(c.last_scratch*REG_SIZE);
2672b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt
2682b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt      brw_get_scratch_bo(intel, &brw->vs.scratch_bo,
269db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke			 c.prog_data.total_scratch * brw->max_vs_threads);
2702b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt   }
2712b224d66a01f3ce867fb05558b25749705bbfe7aEric Anholt
2729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* get the program
2739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
2749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   program = brw_get_program(&c.func, &program_size);
2759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
276fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   /* We upload from &c.prog_data including the constant_map assuming
277fb4901593c9495714d3f54920a28c271852e2112Eric Anholt    * they're packed together.  It would be nice to have a
278fb4901593c9495714d3f54920a28c271852e2112Eric Anholt    * compile-time assert macro here.
279fb4901593c9495714d3f54920a28c271852e2112Eric Anholt    */
280fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   assert(c.constant_map == (int8_t *)&c.prog_data +
281fb4901593c9495714d3f54920a28c271852e2112Eric Anholt	  sizeof(c.prog_data));
282fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   assert(ctx->Const.VertexProgram.MaxNativeParameters ==
283fb4901593c9495714d3f54920a28c271852e2112Eric Anholt	  ARRAY_SIZE(c.constant_map));
2845abd498c47e63ac4445360535b4591dbf6ea627aVinson Lee   (void) ctx;
285fb4901593c9495714d3f54920a28c271852e2112Eric Anholt
286fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   aux_size = sizeof(c.prog_data);
28705e534e6c4395269b1ca3a9694a1f437363dd186Eric Anholt   /* constant_map */
28805e534e6c4395269b1ca3a9694a1f437363dd186Eric Anholt   aux_size += c.vp->program.Base.Parameters->NumParameters;
289fb4901593c9495714d3f54920a28c271852e2112Eric Anholt
290c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt   brw_upload_cache(&brw->cache, BRW_VS_PROG,
291c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt		    &c.key, sizeof(c.key),
292c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt		    program, program_size,
293c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt		    &c.prog_data, aux_size,
294c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt		    &brw->vs.prog_offset, &brw->vs.prog_data);
295774fb90db3e83d5e7326b7a72e05ce805c306b24Kenneth Graunke   ralloc_free(mem_ctx);
2967fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
2977fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   return true;
2989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
2999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
300c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunkestatic bool
301c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunkekey_debug(const char *name, int a, int b)
302c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke{
303c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   if (a != b) {
304c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      perf_debug("  %s %d->%d\n", name, a, b);
305c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      return true;
306c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   }
307c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   return false;
308c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke}
309c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
310c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunkevoid
311c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunkebrw_vs_debug_recompile(struct brw_context *brw,
312c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                       struct gl_shader_program *prog,
313c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                       const struct brw_vs_prog_key *key)
314c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke{
315c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   struct brw_cache_item *c = NULL;
316c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   const struct brw_vs_prog_key *old_key = NULL;
317c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   bool found = false;
318c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
319c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   perf_debug("Recompiling vertex shader for program %d\n", prog->Name);
320c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
321c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   for (unsigned int i = 0; i < brw->cache.size; i++) {
322c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      for (c = brw->cache.items[i]; c; c = c->next) {
323c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke         if (c->cache_id == BRW_VS_PROG) {
324c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke            old_key = c->key;
325c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
326c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke            if (old_key->program_string_id == key->program_string_id)
327c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke               break;
328c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke         }
329c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      }
330c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      if (c)
331c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke         break;
332c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   }
333c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
334c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   if (!c) {
335c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      perf_debug("  Didn't find previous compile in the shader cache for "
336c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                 "debug\n");
337c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      return;
338c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   }
339c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
340c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   for (unsigned int i = 0; i < VERT_ATTRIB_MAX; i++) {
341c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      found |= key_debug("GL_FIXED rescaling",
342c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                         old_key->gl_fixed_input_size[i],
343c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                         key->gl_fixed_input_size[i]);
344c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   }
345c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
346c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("user clip flags",
347c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->userclip_active, key->userclip_active);
348c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
349c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("user clipping planes as push constants",
350c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->nr_userclip_plane_consts,
351c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      key->nr_userclip_plane_consts);
352c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
353c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("clip distance enable",
354c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->uses_clip_distance, key->uses_clip_distance);
355c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("clip plane enable bitfield",
356c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->userclip_planes_enabled_gen_4_5,
357c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      key->userclip_planes_enabled_gen_4_5);
358c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("copy edgeflag",
359c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->copy_edgeflag, key->copy_edgeflag);
360c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("PointCoord replace",
361c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->point_coord_replace, key->point_coord_replace);
362c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= key_debug("vertex color clamping",
363c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke                      old_key->clamp_vertex_color, key->clamp_vertex_color);
364c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
365c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   found |= brw_debug_recompile_sampler_key(&old_key->tex, &key->tex);
366c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke
367c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   if (!found) {
368c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke      perf_debug("  Something else\n");
369c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke   }
370c20cb8d1f6cac0b98950828e69376bb9406761ffKenneth Graunke}
3719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
372f75843a517bd188639e6866db2a7b04de3524e16Dave Airliestatic void brw_upload_vs_prog(struct brw_context *brw)
3739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
374018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry   struct intel_context *intel = &brw->intel;
375018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry   struct gl_context *ctx = &intel->ctx;
3769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_vs_prog_key key;
377d45814c925dd6c479cfd383b9b59458fc4359cf7Kenneth Graunke   /* BRW_NEW_VERTEX_PROGRAM */
3789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_vertex_program *vp =
3799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      (struct brw_vertex_program *)brw->vertex_program;
380d45814c925dd6c479cfd383b9b59458fc4359cf7Kenneth Graunke   struct gl_program *prog = (struct gl_program *) brw->vertex_program;
38164f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   int i;
3829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   memset(&key, 0, sizeof(key));
3849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Just upload the program verbatim for now.  Always send it all
3869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    * the inputs it asks for, whether they are varying or not.
3879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
3889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   key.program_string_id = vp->id;
38918e2e19b07b312c978dfbb6d336f69fa84b3ffe2Paul Berry   key.userclip_active = (ctx->Transform.ClipPlanesEnabled != 0);
390d9cb683f81b5daefda2f8599b4ba0365cc6f009aPaul Berry   key.uses_clip_distance = vp->program.UsesClipDistance;
391018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry   if (key.userclip_active && !key.uses_clip_distance) {
392018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry      if (intel->gen < 6) {
393018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry         key.nr_userclip_plane_consts
394018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry            = _mesa_bitcount_64(ctx->Transform.ClipPlanesEnabled);
395018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry         key.userclip_planes_enabled_gen_4_5
396018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry            = ctx->Transform.ClipPlanesEnabled;
397018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry      } else {
398018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry         key.nr_userclip_plane_consts
399018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry            = _mesa_logbase2(ctx->Transform.ClipPlanesEnabled) + 1;
400018ea68d8780ab5baeef0b8122b8410e5e55ae6dPaul Berry      }
401f4f686e825ad2d64e50fb9e2491ef60507d59c38Paul Berry   }
4023eb8d7122507600ca7c65f8f3fd0e9e9dee7a432Eric Anholt
4033eb8d7122507600ca7c65f8f3fd0e9e9dee7a432Eric Anholt   /* _NEW_POLYGON */
40404a11b5f5e22155e5816e2da560b485eb0eaaec9Eric Anholt   if (intel->gen < 6) {
40504a11b5f5e22155e5816e2da560b485eb0eaaec9Eric Anholt      key.copy_edgeflag = (ctx->Polygon.FrontMode != GL_FILL ||
40604a11b5f5e22155e5816e2da560b485eb0eaaec9Eric Anholt                           ctx->Polygon.BackMode != GL_FILL);
40704a11b5f5e22155e5816e2da560b485eb0eaaec9Eric Anholt   }
4089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
409d22e2ebe35ef9d33ec5f7a67f903f36bcd9fbc91Eric Anholt   /* _NEW_LIGHT | _NEW_BUFFERS */
410d22e2ebe35ef9d33ec5f7a67f903f36bcd9fbc91Eric Anholt   key.clamp_vertex_color = ctx->Light._ClampVertexColor;
411d22e2ebe35ef9d33ec5f7a67f903f36bcd9fbc91Eric Anholt
41264f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   /* _NEW_POINT */
41364f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   if (ctx->Point.PointSprite) {
41464f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt      for (i = 0; i < 8; i++) {
41564f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt	 if (ctx->Point.CoordReplace[i])
41664f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt	    key.point_coord_replace |= (1 << i);
41764f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt      }
41864f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt   }
41964f5e9059b975e34885e63bc404b30b1b2c28de8Eric Anholt
420d45814c925dd6c479cfd383b9b59458fc4359cf7Kenneth Graunke   /* _NEW_TEXTURE */
421fe911c1d433c6fddc8f1e1226286b26d635d6ad4Kenneth Graunke   brw_populate_sampler_prog_key_data(ctx, prog, &key.tex);
422d45814c925dd6c479cfd383b9b59458fc4359cf7Kenneth Graunke
4234176025d463e7733dac19788b45b6472b65d62d4Eric Anholt   /* BRW_NEW_VERTICES */
4244176025d463e7733dac19788b45b6472b65d62d4Eric Anholt   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
425dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if (vp->program.Base.InputsRead & BITFIELD64_BIT(i) &&
4264176025d463e7733dac19788b45b6472b65d62d4Eric Anholt	  brw->vb.inputs[i].glarray->Type == GL_FIXED) {
4274176025d463e7733dac19788b45b6472b65d62d4Eric Anholt	 key.gl_fixed_input_size[i] = brw->vb.inputs[i].glarray->Size;
4284176025d463e7733dac19788b45b6472b65d62d4Eric Anholt      }
4294176025d463e7733dac19788b45b6472b65d62d4Eric Anholt   }
4304176025d463e7733dac19788b45b6472b65d62d4Eric Anholt
431c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt   if (!brw_search_cache(&brw->cache, BRW_VS_PROG,
432c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt			 &key, sizeof(key),
433c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt			 &brw->vs.prog_offset, &brw->vs.prog_data)) {
4347fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt      bool success = do_vs_prog(brw, ctx->Shader.CurrentVertexProgram,
4357fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt				vp, &key);
4367fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
4377fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt      assert(success);
438c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt   }
439fb4901593c9495714d3f54920a28c271852e2112Eric Anholt   brw->vs.constant_map = ((int8_t *)brw->vs.prog_data +
440fb4901593c9495714d3f54920a28c271852e2112Eric Anholt			   sizeof(*brw->vs.prog_data));
4419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
4429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
4439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/* See brw_vs.c:
4449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */
4459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtconst struct brw_tracked_state brw_vs_prog = {
4469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .dirty = {
447d22e2ebe35ef9d33ec5f7a67f903f36bcd9fbc91Eric Anholt      .mesa  = (_NEW_TRANSFORM | _NEW_POLYGON | _NEW_POINT | _NEW_LIGHT |
448207cbc68dc43049c56c3af7a460ce07bd4284aa9Kenneth Graunke		_NEW_TEXTURE |
449d22e2ebe35ef9d33ec5f7a67f903f36bcd9fbc91Eric Anholt		_NEW_BUFFERS),
4504176025d463e7733dac19788b45b6472b65d62d4Eric Anholt      .brw   = (BRW_NEW_VERTEX_PROGRAM |
4514176025d463e7733dac19788b45b6472b65d62d4Eric Anholt		BRW_NEW_VERTICES),
4529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .cache = 0
4539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   },
454dc9a753f6687133d2d057597e5af86abcdc56781Eric Anholt   .emit = brw_upload_vs_prog
4559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
4567fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
4577fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholtbool
4587fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholtbrw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
4597fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt{
4607fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   struct brw_context *brw = brw_context(ctx);
4617fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   struct brw_vs_prog_key key;
4627fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   uint32_t old_prog_offset = brw->vs.prog_offset;
4637fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   struct brw_vs_prog_data *old_prog_data = brw->vs.prog_data;
4647fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   bool success;
4657fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
466010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick   if (!prog->_LinkedShaders[MESA_SHADER_VERTEX])
4677fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt      return true;
4687fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
469010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick   struct gl_vertex_program *vp = (struct gl_vertex_program *)
470010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick      prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
471010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick   struct brw_vertex_program *bvp = brw_vertex_program(vp);
472010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick
4737fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   memset(&key, 0, sizeof(key));
4747fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
4757fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   key.program_string_id = bvp->id;
4767fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   key.clamp_vertex_color = true;
4777fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
47888b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke   for (int i = 0; i < MAX_SAMPLERS; i++) {
47988b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke      if (vp->Base.ShadowSamplers & (1 << i)) {
48088b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke         /* Assume DEPTH_TEXTURE_MODE is the default: X, X, X, 1 */
48188b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke         key.tex.swizzles[i] =
48288b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke            MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_ONE);
48388b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke      } else {
48488b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke         /* Color sampler: assume no swizzling. */
48588b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke         key.tex.swizzles[i] = SWIZZLE_XYZW;
48688b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke      }
48788b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke   }
48888b3850c272636e0385f2111b4bc56724febb45bKenneth Graunke
4897fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   success = do_vs_prog(brw, prog, bvp, &key);
4907fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
4917fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   brw->vs.prog_offset = old_prog_offset;
4927fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   brw->vs.prog_data = old_prog_data;
4937fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt
4947fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt   return success;
4957fbe7fe13359d3f349664410ec73d7bd48824ed6Eric Anholt}
496