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