19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*
29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca Intel funded Tungsten Graphics to
49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver.
547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke
69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining
79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the
89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including
99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish,
109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to
119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to
129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions:
1347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke
149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the
159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial
169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software.
1747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke
189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke
269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/
279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /*
289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  * Authors:
29877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca  *   Keith Whitwell <keithw@vmware.com>
309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  */
3147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke
329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke#include "brw_fs.h"
34f36993b46962eab4446bc1964eb47149751aee26Matt Turner#include "brw_wm.h"
359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke#undef P                        /* prompted depth */
3847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke#undef C                        /* computed */
3947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke#undef N                        /* non-promoted? */
409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define P 0
429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define C 1
439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define N 2
449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
4547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunkestatic const struct {
469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint mode:2;
479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint sd_present:1;
489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint sd_to_rt:1;
499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint dd_present:1;
509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint ds_present:1;
519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} wm_iz_table[IZ_BIT_MAX] =
529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
5347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
5447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
5547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
5647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
5747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
5847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 0 },
5947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 0 },
6047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 0 },
6147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
6247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
6347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
6447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
6547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
6647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 0 },
6747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
6847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
6947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 0 },
7547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 0 },
7647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 0 },
7747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
7947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
8047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
8147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
8247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 0 },
8347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
8447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 0 },
8547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
8647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
8747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
8847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
8947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
9047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 1 },
9147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 1 },
9247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 0, 1, 0, 1 },
9347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
9447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
9547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
9647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
9747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
9847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { N, 1, 1, 0, 1 },
9947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
10047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
10147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
10247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 0, 0, 1 },
10347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
10447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 0, 1 },
10547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
10647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 1, 1, 0, 1 },
10747a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 0, 1 },
10847a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 0, 1 },
10947a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
11047a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 1, 1, 1, 1 },
11147a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
11247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
11347a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { P, 0, 0, 0, 0 },
11447a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 1, 1, 1, 1 },
11547a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 },
11647a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke { C, 0, 1, 1, 1 }
1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
1189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1194d244fb8999440a1876281574eb045f0a5895e9eBrian Paul/**
1204d244fb8999440a1876281574eb045f0a5895e9eBrian Paul * \param line_aa  AA_NEVER, AA_ALWAYS or AA_SOMETIMES
1214d244fb8999440a1876281574eb045f0a5895e9eBrian Paul * \param lookup  bitmask of IZ_* flags
1224d244fb8999440a1876281574eb045f0a5895e9eBrian Paul */
123ae3543950c93ec4ac179013cb1c7baaf6f5ef4a7Jason Ekstrandvoid fs_visitor::setup_fs_payload_gen4()
1249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
12519b08e1bb3a3508049d0527743b2f50f855a24c2Jordan Justen   assert(stage == MESA_SHADER_FRAGMENT);
126e51e055fcdf8107aafaba358fa65b00f963e1728Kenneth Graunke   struct brw_wm_prog_data *prog_data = brw_wm_prog_data(this->prog_data);
12719b08e1bb3a3508049d0527743b2f50f855a24c2Jordan Justen   brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
1289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint reg = 2;
1292e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   bool kill_stats_promoted_workaround = false;
13065b2df3ec8906c51ae5b28df9c0b2c71981080d0Kenneth Graunke   int lookup = key->iz_lookup;
1319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
13247a6a7b51b774091f46aed264b3591fd36c8baedKenneth Graunke   assert(lookup < IZ_BIT_MAX);
133dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt
134dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt   /* Crazy workaround in the windowizer, which we need to track in
135dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt    * our register allocation and render target writes.  See the "If
136dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt    * statistics are enabled..." paragraph of 11.5.3.2: Early Depth
137dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt    * Test Cases [Pre-DevGT] of the 3D Pipeline - Windower B-Spec.
138dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt    */
13965b2df3ec8906c51ae5b28df9c0b2c71981080d0Kenneth Graunke   if (key->stats_wm &&
140dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt       (lookup & IZ_PS_KILL_ALPHATEST_BIT) &&
141dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt       wm_iz_table[lookup].mode == P) {
1422e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      kill_stats_promoted_workaround = true;
143dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt   }
144dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt
14556eb9c44adfa38f776689dd1a1bc42fe55c15dd8Jason Ekstrand   prog_data->uses_src_depth =
146e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri      (nir->info->inputs_read & (1 << VARYING_SLOT_POS)) != 0;
14756eb9c44adfa38f776689dd1a1bc42fe55c15dd8Jason Ekstrand   if (wm_iz_table[lookup].sd_present || prog_data->uses_src_depth ||
148dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt       kill_stats_promoted_workaround) {
1498ef78828fadb0f35b07be93492b3d7c297bb9ffdKenneth Graunke      payload.source_depth_reg = reg;
1509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      reg += 2;
1519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
153dd9a88f4ddf4e5fa384792f891a1cc3d8ff73946Eric Anholt   if (wm_iz_table[lookup].sd_to_rt || kill_stats_promoted_workaround)
15455f4e3a06b52c3e8b6bfad851e1d4e5243f1e2c0Kenneth Graunke      source_depth_to_render_target = true;
1559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
15665b2df3ec8906c51ae5b28df9c0b2c71981080d0Kenneth Graunke   if (wm_iz_table[lookup].ds_present || key->line_aa != AA_NEVER) {
1578ef78828fadb0f35b07be93492b3d7c297bb9ffdKenneth Graunke      payload.aa_dest_stencil_reg = reg;
15855f4e3a06b52c3e8b6bfad851e1d4e5243f1e2c0Kenneth Graunke      runtime_check_aads_emit =
15965b2df3ec8906c51ae5b28df9c0b2c71981080d0Kenneth Graunke         !wm_iz_table[lookup].ds_present && key->line_aa == AA_SOMETIMES;
1609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      reg++;
1619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (wm_iz_table[lookup].dd_present) {
1648ef78828fadb0f35b07be93492b3d7c297bb9ffdKenneth Graunke      payload.dest_depth_reg = reg;
1659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      reg+=2;
1669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1688ef78828fadb0f35b07be93492b3d7c297bb9ffdKenneth Graunke   payload.num_regs = reg;
1699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
171