16980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/* 26980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Copyright © 2010 - 2015 Intel Corporation 36980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 46980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 56980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * copy of this software and associated documentation files (the "Software"), 66980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * to deal in the Software without restriction, including without limitation 76980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 86980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 96980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Software is furnished to do so, subject to the following conditions: 106980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 116980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * The above copyright notice and this permission notice (including the next 126980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Software. 146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 156980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 166980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 176980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * IN THE SOFTWARE. 226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#pragma once 256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 26874a1ed813c62af245524df6f6d55c1d64e0781dKenneth Graunke#include <stdio.h> 27527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrand#include "common/gen_device_info.h" 286980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#include "main/mtypes.h" 2987d062a94080373995170f51063a9649c96c6deaKenneth Graunke#include "main/macros.h" 306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#ifdef __cplusplus 326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandextern "C" { 336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#endif 346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct ra_regs; 366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct nir_shader; 37649bdb1f03838bdef337aeaec505fa9eca991d52Timothy Arceristruct brw_program; 386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandunion gl_constant_value; 396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_compiler { 41527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrand const struct gen_device_info *devinfo; 426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct { 446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct ra_regs *regs; 456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Array of the ra classes for the unaligned contiguous register 486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * block sizes used. 496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int *classes; 516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Mapping for register-allocated objects in *regs to the first 546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * GRF for that object. 556980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t *ra_reg_to_grf; 576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand } vec4_reg_set; 586980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 596980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct { 606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct ra_regs *regs; 616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 626980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 636980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Array of the ra classes for the unaligned contiguous register 646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * block sizes used, indexed by register size. 656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int classes[16]; 676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Mapping from classes to ra_reg ranges. Each of the per-size 706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * classes corresponds to a range of ra_reg nodes. This array stores 716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * those ranges in the form of first ra_reg in each class and the 726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * total number of ra_reg elements in the last array element. This 736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * way the range of the i'th class is given by: 746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * [ class_to_ra_reg_range[i], class_to_ra_reg_range[i+1] ) 756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int class_to_ra_reg_range[17]; 776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Mapping for register-allocated objects in *regs to the first 806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * GRF for that object. 816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t *ra_reg_to_grf; 836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 846980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * ra class for the aligned pairs we use for PLN, which doesn't 866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * appear in *classes. 876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int aligned_pairs_class; 892d288cb9ea5b1b46eb4fe0061d694560bf54943fFrancisco Jerez } fs_reg_sets[3]; 906980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand void (*shader_debug_log)(void *, const char *str, ...) PRINTFLIKE(2, 3); 926980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand void (*shader_perf_log)(void *, const char *str, ...) PRINTFLIKE(2, 3); 936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 9444d6c0c805d2911cc5dfe853e5bc5a505f87775fKenneth Graunke bool scalar_stage[MESA_SHADER_STAGES]; 956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct gl_shader_compiler_options glsl_compiler_options[MESA_SHADER_STAGES]; 9665fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke 9765fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke /** 9865fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke * Apply workarounds for SIN and COS output range problems. 9965fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke * This can negatively impact performance. 10065fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke */ 10165fbc43d54403905e3eaea02372b5a364dc1d773Kenneth Graunke bool precise_trig; 1026980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 1036980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1056980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 1066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Program key structures. 1076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 1086980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * When drawing, we look for the currently bound shaders in the program 1096980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * cache. This is essentially a hash table lookup, and these are the keys. 1106980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 1116980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Sometimes OpenGL features specified as state need to be simulated via 1126980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * shader code, due to a mismatch between the API and the hardware. This 1136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * is often referred to as "non-orthagonal state" or "NOS". We store NOS 1146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * in the program key so it's considered when searching for a program. If 1156980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * we haven't seen a particular combination before, we have to recompile a 1166980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * new specialized version. 1176980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 1186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Shader compilation should not look up state in gl_context directly, but 1196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * instead use the copy in the program key. This guarantees recompiles will 1206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * happen correctly. 1216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 1226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * @{ 1236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandenum PACKED gen6_gather_sampler_wa { 1266980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand WA_SIGN = 1, /* whether we need to sign extend */ 1276980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand WA_8BIT = 2, /* if we have an 8bit format needing wa */ 1286980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand WA_16BIT = 4, /* if we have a 16bit format needing wa */ 1296980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 1306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 1326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Sampler information needed by VS, WM, and GS program cache keys. 1336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_sampler_prog_key_data { 1356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzles. 1376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint16_t swizzles[MAX_SAMPLERS]; 1396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t gl_clamp_mask[3]; 1416980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * For RG32F, gather4's channel select is broken. 1446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t gather_channel_quirk_mask; 1466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Whether this sampler uses the compressed multisample surface layout. 1496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t compressed_multisample_layout_mask; 1516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1531a97cac767425b22e56fe698127795bc287bb773Neil Roberts * Whether this sampler is using 16x multisampling. If so fetching from 1541a97cac767425b22e56fe698127795bc287bb773Neil Roberts * this sampler will be handled with a different instruction, ld2dms_w 1551a97cac767425b22e56fe698127795bc287bb773Neil Roberts * instead of ld2dms. 1561a97cac767425b22e56fe698127795bc287bb773Neil Roberts */ 1571a97cac767425b22e56fe698127795bc287bb773Neil Roberts uint32_t msaa_16; 1581a97cac767425b22e56fe698127795bc287bb773Neil Roberts 1591a97cac767425b22e56fe698127795bc287bb773Neil Roberts /** 1606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * For Sandybridge, which shader w/a we need for gather quirks. 1616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1626980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand enum gen6_gather_sampler_wa gen6_gather_wa[MAX_SAMPLERS]; 163654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg 164654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg /** 165654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg * Texture units that have a YUV image bound. 166654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg */ 167654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg uint32_t y_u_v_image_mask; 168654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg uint32_t y_uv_image_mask; 169654e950cba55dabd2d9accb60db8e5f4c1495716Kristian Høgsberg uint32_t yx_xuxv_image_mask; 1706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 1716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** The program key for Vertex Shaders. */ 1746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_vs_prog_key { 1756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned program_string_id; 1766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /* 1786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Per-attribute workaround flags 1796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX]; 1816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool copy_edgeflag:1; 1836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1846980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool clamp_vertex_color:1; 1856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * How many user clipping planes are being uploaded to the vertex shader as 1886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * push constants. 1896980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 1906980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * These are used for lowering legacy gl_ClipVertex/gl_Position clipping to 1916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * clip distances. 1926980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 1936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned nr_userclip_plane_consts:4; 1946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 1956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 1966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * For pre-Gen6 hardware, a bitfield indicating which texture coordinates 1976980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * are going to be replaced with point coordinates (as a consequence of a 1986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * call to glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)). Because 1996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * our SF thread requires exact matching between VS outputs and FS inputs, 2006980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * these texture coordinates will need to be unconditionally included in 2016980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * the VUE, even if they aren't written by the vertex shader. 2026980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 2036980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t point_coord_replace; 2046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2056980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_sampler_prog_key_data tex; 2066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 2076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 20824be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke/** The program key for Tessellation Control Shaders. */ 20924be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunkestruct brw_tcs_prog_key 21024be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke{ 21124be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke unsigned program_string_id; 21224be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke 21324be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke GLenum tes_primitive_mode; 21424be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke 21557f7c85dcf8ca8b47b71076fb70d9242aec00588Kenneth Graunke unsigned input_vertices; 21657f7c85dcf8ca8b47b71076fb70d9242aec00588Kenneth Graunke 217794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke /** A bitfield of per-patch outputs written. */ 218794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke uint32_t patch_outputs_written; 219794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke 2202432643e89ece4ed642db7ec8d811e724d1e8a35Kenneth Graunke /** A bitfield of per-vertex outputs written. */ 2212432643e89ece4ed642db7ec8d811e724d1e8a35Kenneth Graunke uint64_t outputs_written; 2222432643e89ece4ed642db7ec8d811e724d1e8a35Kenneth Graunke 2239e778837ff9abba0bed963d003297e3333cc7f1fKenneth Graunke bool quads_workaround; 2249e778837ff9abba0bed963d003297e3333cc7f1fKenneth Graunke 22524be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke struct brw_sampler_prog_key_data tex; 22624be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke}; 22724be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke 228a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke/** The program key for Tessellation Evaluation Shaders. */ 229a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunkestruct brw_tes_prog_key 230a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke{ 231a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke unsigned program_string_id; 232a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke 233794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke /** A bitfield of per-patch inputs read. */ 234794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke uint32_t patch_inputs_read; 235794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke 236794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke /** A bitfield of per-vertex inputs read. */ 237794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke uint64_t inputs_read; 238794eb9d7270456ab3d2cadbaf302192eca7f4dbcKenneth Graunke 239a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke struct brw_sampler_prog_key_data tex; 240a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke}; 241a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke 2426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** The program key for Geometry Shaders. */ 2436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_gs_prog_key 2446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand{ 2456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned program_string_id; 2466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_sampler_prog_key_data tex; 2486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 2496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** The program key for Fragment/Pixel Shaders. */ 2516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_wm_prog_key { 2526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t iz_lookup; 2536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool stats_wm:1; 2546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool flat_shade:1; 2556980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned nr_color_regions:5; 2566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool replicate_alpha:1; 2576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool clamp_fragment_color:1; 258712a980adde0b14eee8b4accd02af9b9740091a2Jason Ekstrand bool persample_interp:1; 25981407531e0b8d2e6a7f9c39cb44ed6a72dc61e77Kenneth Graunke bool multisample_fbo:1; 2606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned line_aa:2; 2616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool high_quality_derivatives:1; 262b3340cd32acf5935891f19833de0cfc500a93e0bKenneth Graunke bool force_dual_color_blend:1; 26340b23ad57e8da0fd7af21e81ad52d615f9b492edFrancisco Jerez bool coherent_fb_fetch:1; 2646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint16_t drawable_height; 2666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint64_t input_slots_valid; 2676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned program_string_id; 2686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLenum alpha_test_func; /* < For Gen4/5 MRT alpha test */ 2696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand float alpha_test_ref; 2706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_sampler_prog_key_data tex; 2726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 2736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_cs_prog_key { 2756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t program_string_id; 2766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_sampler_prog_key_data tex; 2776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 2786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/* 2806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Image metadata structure as laid out in the shader parameter 2816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * buffer. Entries have to be 16B-aligned for the vec4 back-end to be 2826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * able to use them. That's okay because the padding and any unused 2836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * entries [most of them except when we're doing untyped surface 2846980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * access] will be removed by the uniform packing pass. 2856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 2866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_SURFACE_IDX_OFFSET 0 2876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_OFFSET_OFFSET 4 2886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_SIZE_OFFSET 8 2896980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_STRIDE_OFFSET 12 2906980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_TILING_OFFSET 16 2916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_SWIZZLING_OFFSET 20 2926980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#define BRW_IMAGE_PARAM_SIZE 24 2936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_image_param { 2956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** Surface binding table index. */ 2966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t surface_idx; 2976980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 2986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** Offset applied to the X and Y surface coordinates. */ 2996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t offset[2]; 3006980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3016980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** Surface X, Y and Z dimensions. */ 3026980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t size[3]; 3036980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** X-stride in bytes, Y-stride in pixels, horizontal slice stride in 3056980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * pixels, vertical slice stride in pixels. 3066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t stride[4]; 3086980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3096980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** Log2 of the tiling modulus in the X, Y and Z dimension. */ 3106980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t tiling[3]; 3116980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3126980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 3136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Right shift to apply for bit 6 address swizzling. Two different 3146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * swizzles can be specified and will be applied one after the other. The 3156980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * resulting address will be: 3166980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 3176980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * addr' = addr ^ ((1 << 6) & ((addr >> swizzling[0]) ^ 3186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * (addr >> swizzling[1]))) 3196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 3206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Use \c 0xff if any of the swizzles is not required. 3216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t swizzling[2]; 3236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 3246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_stage_prog_data { 3266980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct { 3276980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** size of our binding table. */ 3286980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t size_bytes; 3296980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @{ 3316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * surface indices for the various groups of surfaces 3326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t pull_constants_start; 3346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t texture_start; 3356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t gather_texture_start; 3366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t ubo_start; 3376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t ssbo_start; 3386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t abo_start; 3396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t image_start; 3406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t shader_time_start; 34144997fc0c1cc7f24216e3b1c5d954919df946ee5Kristian Høgsberg uint32_t plane_start[3]; 3426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @} */ 3436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand } binding_table; 3446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint nr_params; /**< number of float params/constants */ 3466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint nr_pull_params; 3476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned nr_image_params; 3486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned curb_read_length; 3506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned total_scratch; 35195ad0bd33ba491c2e34ce02f4ec2d75ffffe16eaFrancisco Jerez unsigned total_shared; 3526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 3546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Register where the thread expects to find input data from the URB 3556980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * (typically uniforms, followed by vertex or fragment attributes). 3566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned dispatch_grf_start_reg; 3586980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3596980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool use_alt_mode; /**< Use ALT floating point mode? Otherwise, IEEE. */ 3606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /* Pointers to tracked values (only valid once 3626980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * _mesa_load_state_parameters has been called at runtime). 3636980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const union gl_constant_value **param; 3656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const union gl_constant_value **pull_param; 3666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** Image metadata passed to the shader as uniforms. */ 3686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_image_param *image_param; 3696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 3706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/* Data about a particular attempt to compile a program. Note that 3726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * there can be many of these, each in a different GL state 3736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * corresponding to a different brw_wm_prog_key struct, with different 3746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * compiled programs. 3756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_wm_prog_data { 3776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_stage_prog_data base; 3786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint num_varying_inputs; 3806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 381bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand uint8_t reg_blocks_0; 382bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand uint8_t reg_blocks_2; 383bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand 384bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand uint8_t dispatch_grf_start_reg_2; 385bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand uint32_t prog_offset_2; 3866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct { 3886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @{ 3896980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * surface indices the WM-specific surfaces 3906980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 3916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t render_target_start; 39208705badfe136e1782e10472104323d861185357Francisco Jerez uint32_t render_target_read_start; 3936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @} */ 3946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand } binding_table; 3956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint8_t computed_depth_mode; 3971db44252d01bf7539452ccc2b5210c74b8dcd573Ben Widawsky bool computed_stencil; 3986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 3996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool early_fragment_tests; 4000ff74a8990d9fe37365beb35ed8abacfbf3ed567Plamena Manolova bool post_depth_coverage; 401e9f17e9fb06a4389588f47be8c766b07e8d8b89fLionel Landwerlin bool inner_coverage; 402bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand bool dispatch_8; 403bee160b31be9e09eeab83f62d26ac331f08955faJason Ekstrand bool dispatch_16; 4046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool dual_src_blend; 405712a980adde0b14eee8b4accd02af9b9740091a2Jason Ekstrand bool persample_dispatch; 4066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_pos_offset; 4076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_omask; 4086980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_kill; 40956eb9c44adfa38f776689dd1a1bc42fe55c15dd8Jason Ekstrand bool uses_src_depth; 41056eb9c44adfa38f776689dd1a1bc42fe55c15dd8Jason Ekstrand bool uses_src_w; 41156eb9c44adfa38f776689dd1a1bc42fe55c15dd8Jason Ekstrand bool uses_sample_mask; 4123fb289f957a8a27349a6f7df03983f92d9b6cf64Jason Ekstrand bool has_side_effects; 4136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool pulls_bary; 4146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4150d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke bool contains_flat_varying; 4160d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke bool contains_noperspective_varying; 4170d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke 4186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 4196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Mask of which interpolation modes are required by the fragment shader. 4206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Used in hardware setup on gen6+. 4216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 4226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t barycentric_interp_modes; 4236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 425e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand * Mask of which FS inputs are marked flat by the shader source. This is 426e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand * needed for setting up 3DSTATE_SF/SBE. 427e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand */ 428e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand uint32_t flat_inputs; 429e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand 4300d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke /* Mapping of VUE slots to interpolation modes. 4310d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke * Used by the Gen4-5 clip/sf/wm stages. 4320d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke */ 4330d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke unsigned char interp_mode[65]; /* BRW_VARYING_SLOT_COUNT */ 4340d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke 435e61cc87c757f8bc0b6a3af318a512b22c072595cJason Ekstrand /** 4366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Map from gl_varying_slot to the position within the FS setup data 4376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * payload where the varying's attribute vertex deltas should be delivered. 4386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * For varying slots that are not used by the FS, the value is -1. 4396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 4406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int urb_setup[VARYING_SLOT_MAX]; 4416980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 4426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 443d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justenstruct brw_push_const_block { 444d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen unsigned dwords; /* Dword count, not reg aligned */ 445d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen unsigned regs; 446d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen unsigned size; /* Bytes, register aligned */ 447d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen}; 448d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen 4496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_cs_prog_data { 4506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_stage_prog_data base; 4516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint dispatch_grf_start_reg_16; 4536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned local_size[3]; 4546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned simd_size; 4551b79e7ebbd77a7e714fafadd91459059aacf2407Jordan Justen unsigned threads; 4566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_barrier; 4576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_num_work_groups; 458fa279dfbf0fc89b07007141ad8850ac42206e397Jordan Justen int thread_local_id_index; 4596980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct { 461d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen struct brw_push_const_block cross_thread; 462d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen struct brw_push_const_block per_thread; 463d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen struct brw_push_const_block total; 464d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen } push; 465d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen 466d437798ace47e47dbcb1244734dc1af3ecb5ab84Jordan Justen struct { 4676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @{ 4686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * surface indices the CS-specific surfaces 4696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 4706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand uint32_t work_groups_start; 4716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** @} */ 4726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand } binding_table; 4736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 4746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 4766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Enum representing the i965-specific vertex results that don't correspond 4776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * exactly to any element of gl_varying_slot. The values of this enum are 4786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * assigned such that they don't conflict with gl_varying_slot. 4796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 4806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandtypedef enum 4816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand{ 4826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand BRW_VARYING_SLOT_NDC = VARYING_SLOT_MAX, 4836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand BRW_VARYING_SLOT_PAD, 4846980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 4856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Technically this is not a varying but just a placeholder that 4866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * compile_sf_prog() inserts into its VUE map to cause the gl_PointCoord 4876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * builtin variable to be compiled correctly. see compile_sf_prog() for 4886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * more info. 4896980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 4906980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand BRW_VARYING_SLOT_PNTC, 4916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand BRW_VARYING_SLOT_COUNT 4926980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand} brw_varying_slot; 4936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 4946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 4956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Data structure recording the relationship between the gl_varying_slot enum 4966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * and "slots" within the vertex URB entry (VUE). A "slot" is defined as a 4976980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * single octaword within the VUE (128 bits). 4986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 4996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Note that each BRW register contains 256 bits (2 octawords), so when 5006980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * accessing the VUE in URB_NOSWIZZLE mode, each register corresponds to two 5016980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * consecutive VUE slots. When accessing the VUE in URB_INTERLEAVED mode (as 5026980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * in a vertex shader), each register corresponds to a single VUE slot, since 5036980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * it contains data for two separate vertices. 5046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5056980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_vue_map { 5066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 5076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Bitfield representing all varying slots that are (a) stored in this VUE 5086980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * map, and (b) actually written by the shader. Does not include any of 5096980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * the additional varying slots defined in brw_varying_slot. 5106980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5116980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLbitfield64 slots_valid; 5126980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 5146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Is this VUE map for a separate shader pipeline? 5156980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 5166980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Separable programs (GL_ARB_separate_shader_objects) can be mixed and matched 5176980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * without the linker having a chance to dead code eliminate unused varyings. 5186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 5196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * This means that we have to use a fixed slot layout, based on the output's 5206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * location field, rather than assigning slots in a compact contiguous block. 5216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool separate; 5236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 5256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Map from gl_varying_slot value to VUE slot. For gl_varying_slots that are 5266980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * not stored in a slot (because they are not written, or because 5276980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * additional processing is applied before storing them in the VUE), the 5286980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * value is -1. 5296980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5301f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke signed char varying_to_slot[VARYING_SLOT_TESS_MAX]; 5316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 5336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Map from VUE slot to gl_varying_slot value. For slots that do not 5346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * directly correspond to a gl_varying_slot, the value comes from 5356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * brw_varying_slot. 5366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 5376ae47a3eb4e30fa92dd60e4a16e016e8585c3c48Kenneth Graunke * For slots that are not in use, the value is BRW_VARYING_SLOT_PAD. 5386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5391f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke signed char slot_to_varying[VARYING_SLOT_TESS_MAX]; 5406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5416980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 5426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Total number of VUE slots in use 5436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int num_slots; 5451f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke 5461f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke /** 5471f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke * Number of per-patch VUE slots. Only valid for tessellation control 5481f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke * shader outputs and tessellation evaluation shader inputs. 5491f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke */ 5501f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke int num_per_patch_slots; 5511f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke 5521f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke /** 5531f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke * Number of per-vertex VUE slots. Only valid for tessellation control 5541f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke * shader outputs and tessellation evaluation shader inputs. 5551f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke */ 5561f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke int num_per_vertex_slots; 5576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 5586980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 559a4ba476c30ebcb99694c6167ac9b8af9414cb656Kenneth Graunkevoid brw_print_vue_map(FILE *fp, const struct brw_vue_map *vue_map); 560a4ba476c30ebcb99694c6167ac9b8af9414cb656Kenneth Graunke 5616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 5626980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Convert a VUE slot number into a byte offset within the VUE. 5636980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 5646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstatic inline GLuint brw_vue_slot_to_offset(GLuint slot) 5656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand{ 5666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand return 16*slot; 5676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand} 5686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 5706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Convert a vertex output (brw_varying_slot) into a byte offset within the 5716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * VUE. 5726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 573fcb39f5b6a0c7cc92b4260b44a3f327ec84ef47aKenneth Graunkestatic inline 574fcb39f5b6a0c7cc92b4260b44a3f327ec84ef47aKenneth GraunkeGLuint brw_varying_to_offset(const struct brw_vue_map *vue_map, GLuint varying) 5756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand{ 5766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand return brw_vue_slot_to_offset(vue_map->varying_to_slot[varying]); 5776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand} 5786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 579527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandvoid brw_compute_vue_map(const struct gen_device_info *devinfo, 5806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_vue_map *vue_map, 5816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLbitfield64 slots_valid, 5826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool separate_shader); 5836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 5841f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunkevoid brw_compute_tess_vue_map(struct brw_vue_map *const vue_map, 5851f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke const GLbitfield64 slots_valid, 5861f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke const GLbitfield is_patch); 5871f46163acb4853b3e159e4a0cb91d61c8a348553Kenneth Graunke 58891d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri/* brw_interpolation_map.c */ 58991d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arcerivoid brw_setup_vue_interpolation(struct brw_vue_map *vue_map, 59091d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri struct nir_shader *nir, 5910d5071db5e50629a63490639a3c86dfc65bf27abKenneth Graunke struct brw_wm_prog_data *prog_data, 59291d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri const struct gen_device_info *devinfo); 59391d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri 5946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandenum shader_dispatch_mode { 5956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand DISPATCH_MODE_4X1_SINGLE = 0, 5966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand DISPATCH_MODE_4X2_DUAL_INSTANCE = 1, 5976980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand DISPATCH_MODE_4X2_DUAL_OBJECT = 2, 5986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand DISPATCH_MODE_SIMD8 = 3, 5996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 6006980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 601b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke/** 602b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * @defgroup Tessellator parameter enumerations. 603b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * 604b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * These correspond to the hardware values in 3DSTATE_TE, and are provided 605b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * as part of the tessellation evaluation shader. 606b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * 607b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke * @{ 608b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke */ 609b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunkeenum brw_tess_partitioning { 610b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_PARTITIONING_INTEGER = 0, 611b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_PARTITIONING_ODD_FRACTIONAL = 1, 612b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_PARTITIONING_EVEN_FRACTIONAL = 2, 613b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke}; 614b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke 615b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunkeenum brw_tess_output_topology { 616b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_OUTPUT_TOPOLOGY_POINT = 0, 617b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_OUTPUT_TOPOLOGY_LINE = 1, 618b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_OUTPUT_TOPOLOGY_TRI_CW = 2, 619b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_OUTPUT_TOPOLOGY_TRI_CCW = 3, 620b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke}; 621b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke 622b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunkeenum brw_tess_domain { 623b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_DOMAIN_QUAD = 0, 624b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_DOMAIN_TRI = 1, 625b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke BRW_TESS_DOMAIN_ISOLINE = 2, 626b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke}; 627b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke/** @} */ 628b196f1fff31f1528afa84590926c2935d9b0c255Kenneth Graunke 6296980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_vue_prog_data { 6306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_stage_prog_data base; 6316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_vue_map vue_map; 6326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 63372d84ae7ceaed4e723376a18d09689be183e0155Kenneth Graunke /** Should the hardware deliver input VUE handles for URB pull loads? */ 63472d84ae7ceaed4e723376a18d09689be183e0155Kenneth Graunke bool include_vue_handles; 63572d84ae7ceaed4e723376a18d09689be183e0155Kenneth Graunke 6366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint urb_read_length; 6376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint total_grf; 6386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 639a1a292d17710a2bfb33f798c9f5fda73a5985261Kenneth Graunke uint32_t clip_distance_mask; 640c564348a2ec601b28ae607ca0f77054ea53f6912Kristian Høgsberg uint32_t cull_distance_mask; 641c564348a2ec601b28ae607ca0f77054ea53f6912Kristian Høgsberg 6426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /* Used for calculating urb partitions. In the VS, this is the size of the 6436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * URB entry used for both input and output to the thread. In the GS, this 6446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * is the size of the URB entry used for output. 6456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 6466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint urb_entry_size; 6476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand enum shader_dispatch_mode dispatch_mode; 6496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 6506980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_vs_prog_data { 6526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_vue_prog_data base; 6536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLbitfield64 inputs_read; 65561a8a55f557784c8ec17fb1758775c6f18252201Antia Puentes GLbitfield64 double_inputs_read; 6566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned nr_attributes; 6587ea09511ca4f58640063cc1ee08386cce5300535Juan A. Suarez Romero unsigned nr_attribute_slots; 6596980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_vertexid; 6616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool uses_instanceid; 66217ebb55a14b5a9aa639845fbda9330ef9421834aKristian Høgsberg Kristensen bool uses_basevertex; 66317ebb55a14b5a9aa639845fbda9330ef9421834aKristian Høgsberg Kristensen bool uses_baseinstance; 664cddfc2cefa93b884c40329dcb193fe4fb22143abKristian Høgsberg Kristensen bool uses_drawid; 6656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 6666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 66780ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbesstruct brw_tcs_prog_data 66880ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes{ 66980ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes struct brw_vue_prog_data base; 67080ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes 67180ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes /** Number vertices in output patch */ 67280ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes int instances; 67380ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes}; 67480ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes 67580ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes 67680ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbesstruct brw_tes_prog_data 67780ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes{ 67880ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes struct brw_vue_prog_data base; 67980ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes 68080ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes enum brw_tess_partitioning partitioning; 68180ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes enum brw_tess_output_topology output_topology; 68280ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes enum brw_tess_domain domain; 68380ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes}; 68480ea18d1a184606bd3cf6e90296e129f0c7f100eChris Forbes 6856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandstruct brw_gs_prog_data 6866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand{ 6876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_vue_prog_data base; 6886980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6899f8c01b03c168f6cf7aa12046be73e0fc46940c6Jason Ekstrand unsigned vertices_in; 6909f8c01b03c168f6cf7aa12046be73e0fc46940c6Jason Ekstrand 6916980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 6926980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Size of an output vertex, measured in HWORDS (32 bytes). 6936980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 6946980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned output_vertex_size_hwords; 6956980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6966980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned output_topology; 6976980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 6986980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 6996980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Size of the control data (cut bits or StreamID bits), in hwords (32 7006980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * bytes). 0 if there is no control data. 7016980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7026980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned control_data_header_size_hwords; 7036980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7046980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7056980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Format of the control data (either GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_SID 7066980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * if the control data is StreamID bits, or 7076980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_CUT if the control data is cut bits). 7086980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Ignored if control_data_header_size is 0. 7096980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7106980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned control_data_format; 7116980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7126980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool include_primitive_id; 7136980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7146980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7156980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * The number of vertices emitted, if constant - otherwise -1. 7166980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7176980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int static_vertex_count; 7186980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7196980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int invocations; 7206980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Gen6: Provoking vertex convention for odd-numbered triangles 7236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * in tristrips. 7246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint pv_first:1; 7266980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7276980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7286980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Gen6: Number of varyings that are output to transform feedback. 7296980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand GLuint num_transform_feedback_bindings:7; /* 0-BRW_MAX_SOL_BINDINGS */ 7316980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Gen6: Map from the index of a transform feedback binding table entry to the 7346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * gl_varying_slot that should be streamed out through that binding table 7356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * entry. 7366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned char transform_feedback_bindings[64 /* BRW_MAX_SOL_BINDINGS */]; 7386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand /** 7406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Gen6: Map from the index of a transform feedback binding table entry to the 7416980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * swizzles that should be used when streaming out data through that 7426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * binding table entry. 7436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned char transform_feedback_swizzles[64 /* BRW_MAX_SOL_BINDINGS */]; 7456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand}; 7466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 747e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke#define DEFINE_PROG_DATA_DOWNCAST(stage) \ 748e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunkestatic inline struct brw_##stage##_prog_data * \ 749e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunkebrw_##stage##_prog_data(struct brw_stage_prog_data *prog_data) \ 750e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke{ \ 751e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke return (struct brw_##stage##_prog_data *) prog_data; \ 752e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke} 753e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(vue) 754e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(vs) 755e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(tcs) 756e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(tes) 757e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(gs) 758e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(wm) 759e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(cs) 760e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(ff_gs) 761e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(clip) 762e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth GraunkeDEFINE_PROG_DATA_DOWNCAST(sf) 763e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke#undef DEFINE_PROG_DATA_DOWNCAST 7646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** @} */ 7666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 767252d497d4c51f51c62283a4d6b9cf1dfab671219Matt Turnerstruct brw_compiler * 768527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandbrw_compiler_create(void *mem_ctx, const struct gen_device_info *devinfo); 769252d497d4c51f51c62283a4d6b9cf1dfab671219Matt Turner 7706980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 7716980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Compile a vertex shader. 7726980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 7736980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Returns the final assembly and the program's size. 7746980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 7756980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandconst unsigned * 7766980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandbrw_compile_vs(const struct brw_compiler *compiler, void *log_data, 7776980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand void *mem_ctx, 7786980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct brw_vs_prog_key *key, 7796980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_vs_prog_data *prog_data, 7806980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct nir_shader *shader, 7816980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand gl_clip_plane *clip_planes, 7826980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand bool use_legacy_snorm_formula, 7836980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int shader_time_index, 7846980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned *final_assembly_size, 7856980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand char **error_str); 7866980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 7876980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 78824be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke * Compile a tessellation control shader. 78924be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke * 79024be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke * Returns the final assembly and the program's size. 79124be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke */ 79224be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunkeconst unsigned * 79324be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunkebrw_compile_tcs(const struct brw_compiler *compiler, 79424be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke void *log_data, 79524be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke void *mem_ctx, 79624be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke const struct brw_tcs_prog_key *key, 79724be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke struct brw_tcs_prog_data *prog_data, 79824be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke const struct nir_shader *nir, 79924be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke int shader_time_index, 80024be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke unsigned *final_assembly_size, 80124be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke char **error_str); 80224be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke 80324be658d13b13fdb8a1977208038b4ba43bce4acKenneth Graunke/** 804a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke * Compile a tessellation evaluation shader. 805a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke * 806a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke * Returns the final assembly and the program's size. 807a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke */ 808a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunkeconst unsigned * 809a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunkebrw_compile_tes(const struct brw_compiler *compiler, void *log_data, 810a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke void *mem_ctx, 811a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke const struct brw_tes_prog_key *key, 81286b9be777f11b1226565350363e6b39f7b2f22c8Kenneth Graunke const struct brw_vue_map *input_vue_map, 813a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke struct brw_tes_prog_data *prog_data, 814a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke const struct nir_shader *shader, 8152784128398e405405f0263d318ebe4121d1baf4cTimothy Arceri struct gl_program *prog, 816a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke int shader_time_index, 817a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke unsigned *final_assembly_size, 818a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke char **error_str); 819a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke 820a5038427c3624e559f954124d77304f9ae9b884cKenneth Graunke/** 8216980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Compile a vertex shader. 8226980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 8236980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Returns the final assembly and the program's size. 8246980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 8256980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandconst unsigned * 8266980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandbrw_compile_gs(const struct brw_compiler *compiler, void *log_data, 82772148de217786473bb2bb02b99f49fd28bdda0e2Jason Ekstrand void *mem_ctx, 8280e57694745979286cda0cd414cc6d1f4efe5408bJason Ekstrand const struct brw_gs_prog_key *key, 829fac9b21e037f9ce456039fbf35cd5fa573dee229Jason Ekstrand struct brw_gs_prog_data *prog_data, 8306980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct nir_shader *shader, 8312c0d267717d9b01c644864bae945d29e0a6ca881Timothy Arceri struct gl_program *prog, 8326980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int shader_time_index, 8336980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned *final_assembly_size, 8346980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand char **error_str); 8356980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 8366980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 8376980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Compile a fragment shader. 8386980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 8396980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Returns the final assembly and the program's size. 8406980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 8416980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandconst unsigned * 8426980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandbrw_compile_fs(const struct brw_compiler *compiler, void *log_data, 8436980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand void *mem_ctx, 8446980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct brw_wm_prog_key *key, 8456980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_wm_prog_data *prog_data, 8466980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct nir_shader *shader, 8476980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct gl_program *prog, 8486980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int shader_time_index8, 8496980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int shader_time_index16, 850265487aedfabbcfb073f9d6053d1ceb510b78b27Jason Ekstrand bool allow_spilling, 85191d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri bool use_rep_send, struct brw_vue_map *vue_map, 8526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned *final_assembly_size, 8536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand char **error_str); 8546980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 8556980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand/** 8566980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Compile a compute shader. 8576980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * 8586980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand * Returns the final assembly and the program's size. 8596980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand */ 8606980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandconst unsigned * 8616980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrandbrw_compile_cs(const struct brw_compiler *compiler, void *log_data, 8626980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand void *mem_ctx, 8636980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct brw_cs_prog_key *key, 8646980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand struct brw_cs_prog_data *prog_data, 8656980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand const struct nir_shader *shader, 8666980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand int shader_time_index, 8676980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand unsigned *final_assembly_size, 8686980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand char **error_str); 8696980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand 87087d062a94080373995170f51063a9649c96c6deaKenneth Graunkestatic inline uint32_t 8715a0d294d38505ae61293ae1a9184e1b3228ef2afKenneth Graunkeencode_slm_size(unsigned gen, uint32_t bytes) 87287d062a94080373995170f51063a9649c96c6deaKenneth Graunke{ 87387d062a94080373995170f51063a9649c96c6deaKenneth Graunke uint32_t slm_size = 0; 87487d062a94080373995170f51063a9649c96c6deaKenneth Graunke 87587d062a94080373995170f51063a9649c96c6deaKenneth Graunke /* Shared Local Memory is specified as powers of two, and encoded in 87687d062a94080373995170f51063a9649c96c6deaKenneth Graunke * INTERFACE_DESCRIPTOR_DATA with the following representations: 87787d062a94080373995170f51063a9649c96c6deaKenneth Graunke * 87887d062a94080373995170f51063a9649c96c6deaKenneth Graunke * Size | 0 kB | 1 kB | 2 kB | 4 kB | 8 kB | 16 kB | 32 kB | 64 kB | 87987d062a94080373995170f51063a9649c96c6deaKenneth Graunke * ------------------------------------------------------------------- 88087d062a94080373995170f51063a9649c96c6deaKenneth Graunke * Gen7-8 | 0 | none | none | 1 | 2 | 4 | 8 | 16 | 88187d062a94080373995170f51063a9649c96c6deaKenneth Graunke * ------------------------------------------------------------------- 88287d062a94080373995170f51063a9649c96c6deaKenneth Graunke * Gen9+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 88387d062a94080373995170f51063a9649c96c6deaKenneth Graunke */ 88487d062a94080373995170f51063a9649c96c6deaKenneth Graunke assert(bytes <= 64 * 1024); 88587d062a94080373995170f51063a9649c96c6deaKenneth Graunke 88687d062a94080373995170f51063a9649c96c6deaKenneth Graunke if (bytes > 0) { 88787d062a94080373995170f51063a9649c96c6deaKenneth Graunke /* Shared Local Memory Size is specified as powers of two. */ 88887d062a94080373995170f51063a9649c96c6deaKenneth Graunke slm_size = util_next_power_of_two(bytes); 88987d062a94080373995170f51063a9649c96c6deaKenneth Graunke 8905a0d294d38505ae61293ae1a9184e1b3228ef2afKenneth Graunke if (gen >= 9) { 89187d062a94080373995170f51063a9649c96c6deaKenneth Graunke /* Use a minimum of 1kB; turn an exponent of 10 (1024 kB) into 1. */ 89287d062a94080373995170f51063a9649c96c6deaKenneth Graunke slm_size = ffs(MAX2(slm_size, 1024)) - 10; 89387d062a94080373995170f51063a9649c96c6deaKenneth Graunke } else { 89487d062a94080373995170f51063a9649c96c6deaKenneth Graunke /* Use a minimum of 4kB; convert to the pre-Gen9 representation. */ 89587d062a94080373995170f51063a9649c96c6deaKenneth Graunke slm_size = MAX2(slm_size, 4096) / 4096; 89687d062a94080373995170f51063a9649c96c6deaKenneth Graunke } 89787d062a94080373995170f51063a9649c96c6deaKenneth Graunke } 89887d062a94080373995170f51063a9649c96c6deaKenneth Graunke 89987d062a94080373995170f51063a9649c96c6deaKenneth Graunke return slm_size; 90087d062a94080373995170f51063a9649c96c6deaKenneth Graunke} 90187d062a94080373995170f51063a9649c96c6deaKenneth Graunke 902f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez/** 903f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * Return true if the given shader stage is dispatched contiguously by the 904f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * relevant fixed function starting from channel 0 of the SIMD thread, which 905f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * implies that the dispatch mask of a thread can be assumed to have the form 906f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * '2^n - 1' for some n. 907f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez */ 908f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerezstatic inline bool 909f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerezbrw_stage_has_packed_dispatch(const struct gen_device_info *devinfo, 910f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez gl_shader_stage stage, 911f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez const struct brw_stage_prog_data *prog_data) 912f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez{ 913f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez /* The code below makes assumptions about the hardware's thread dispatch 914f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * behavior that could be proven wrong in future generations -- Make sure 915f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * to do a full test run with brw_fs_test_dispatch_packing() hooked up to 916f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * the NIR front-end before changing this assertion. 917f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez */ 918f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez assert(devinfo->gen <= 9); 919f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez 920f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez switch (stage) { 921f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez case MESA_SHADER_FRAGMENT: { 922f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez /* The PSD discards subspans coming in with no lit samples, which in the 923f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * per-pixel shading case implies that each subspan will either be fully 924f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * lit (due to the VMask being used to allow derivative computations), 925f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * or not dispatched at all. In per-sample dispatch mode individual 926f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * samples from the same subspan have a fixed relative location within 927f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * the SIMD thread, so dispatch of unlit samples cannot be avoided in 928f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * general and we should return false. 929f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez */ 930f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez const struct brw_wm_prog_data *wm_prog_data = 931f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez (const struct brw_wm_prog_data *)prog_data; 932f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez return !wm_prog_data->persample_dispatch; 933f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez } 934f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez case MESA_SHADER_COMPUTE: 935f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez /* Compute shaders will be spawned with either a fully enabled dispatch 936f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * mask or with whatever bottom/right execution mask was given to the 937f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * GPGPU walker command to be used along the workgroup edges -- In both 938f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * cases the dispatch mask is required to be tightly packed for our 939f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * invocation index calculations to work. 940f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez */ 941f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez return true; 942f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez default: 943f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez /* Most remaining fixed functions are limited to use a packed dispatch 944f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * mask due to the hardware representation of the dispatch mask as a 945f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez * single counter representing the number of enabled channels. 946f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez */ 947f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez return true; 948f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez } 949f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez} 950f57f526fc5cfaedf26b2becf8f1899d5de0d0461Francisco Jerez 9516980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#ifdef __cplusplus 9526980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand} /* extern "C" */ 9536980372010ad5929c0b4b0a0370d281cbd6f8b2eJason Ekstrand#endif 954