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