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)