st_mesa_to_tgsi.c revision f1188d4464c78bfa0cd114d9331de8fba70724ac
1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org/**************************************************************************
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org *
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * All Rights Reserved.
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org *
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Permission is hereby granted, free of charge, to any person obtaining a
721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org * copy of this software and associated documentation files (the
85de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org * "Software"), to deal in the Software without restriction, including
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * the following conditions:
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org * The above copyright notice and this permission notice (including the
1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org * next paragraph) shall be included in all copies or substantial portions
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * of the Software.
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *
263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org **************************************************************************/
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/*
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \author
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Michal Krol,
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Keith Whitwell
32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */
33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
34c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "pipe/p_compiler.h"
35c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "pipe/p_context.h"
363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "pipe/p_screen.h"
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "pipe/p_shader_tokens.h"
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "pipe/p_state.h"
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "tgsi/tgsi_ureg.h"
40d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "st_mesa_to_tgsi.h"
41d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "st_context.h"
42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "program/prog_instruction.h"
43e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#include "program/prog_parameter.h"
448432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_debug.h"
458432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_math.h"
468432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_memory.h"
4741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define PROGRAM_ANY_CONST ((1 << PROGRAM_LOCAL_PARAM) |  \
503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                           (1 << PROGRAM_ENV_PARAM) |    \
51a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                           (1 << PROGRAM_STATE_VAR) |    \
52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           (1 << PROGRAM_NAMED_PARAM) |  \
53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           (1 << PROGRAM_CONSTANT) |     \
54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           (1 << PROGRAM_UNIFORM))
553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct label {
58c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned branch_target;
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   unsigned token;
60c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com};
61c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Intermediate state used during shader translation.
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstruct st_translate {
67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_program *ureg;
68c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   struct ureg_dst temps[MAX_PROGRAM_TEMPS];
70c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src *constants;
71c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
72c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS];
73c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_dst address[1];
74c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src samplers[PIPE_MAX_SAMPLERS];
75c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src systemValues[SYSTEM_VALUE_MAX];
76e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
77c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   const GLuint *inputMapping;
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   const GLuint *outputMapping;
79c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
80ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   /* For every instruction that contains a label (eg CALL), keep
81ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    * details so that we can go back afterwards and emit the correct
82a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    * tgsi instruction number for each label.
83c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    */
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   struct label *labels;
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   unsigned labels_size;
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   unsigned labels_count;
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   /* Keep a record of the tgsi instruction number that each mesa
89c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    * instruction starts at, will be used to fix up labels after
90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    * translation.
917c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    */
927c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org   unsigned *insn;
937c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org   unsigned insn_size;
94ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   unsigned insn_count;
95ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
963e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   unsigned procType;  /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */
97c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
98c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   boolean error;
995b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org};
100e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
101c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
1025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */
10370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgstatic unsigned mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = {
10470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org   TGSI_SEMANTIC_FACE,
10570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org   TGSI_SEMANTIC_VERTEXID,
10670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org   TGSI_SEMANTIC_INSTANCEID
10770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org};
1085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org/**
1115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org * Make note of a branch to a label in the TGSI code.
1125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org * After we've emitted all instructions, we'll go over the list
113e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * of labels built here and patch the TGSI code with the actual
1145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org * location of each label.
115c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */
116c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic unsigned *get_label( struct st_translate *t,
117c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org                            unsigned branch_target )
118c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{
119c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   unsigned i;
120c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
121c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   if (t->labels_count + 1 >= t->labels_size) {
122c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      t->labels_size = 1 << (util_logbase2(t->labels_size) + 1);
123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      t->labels = realloc(t->labels, t->labels_size * sizeof t->labels[0]);
1243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      if (t->labels == NULL) {
125c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         static unsigned dummy;
126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         t->error = TRUE;
127c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         return &dummy;
128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
131c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   i = t->labels_count++;
132c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   t->labels[i].branch_target = branch_target;
133c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   return &t->labels[i].token;
134c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
135c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
136c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
137c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/**
138c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Called prior to emitting the TGSI code for each Mesa instruction.
139c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Allocate additional space for instructions if needed.
140c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Update the insn[] array so the next Mesa instruction points to
141c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * the next TGSI instruction.
142c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */
143c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic void set_insn_start( struct st_translate *t,
144c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org                            unsigned start )
145dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org{
146c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   if (t->insn_count + 1 >= t->insn_size) {
147c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      t->insn_size = 1 << (util_logbase2(t->insn_size) + 1);
148c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      t->insn = realloc(t->insn, t->insn_size * sizeof t->insn[0]);
149c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      if (t->insn == NULL) {
150dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org         t->error = TRUE;
151c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         return;
152c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      }
153c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   }
154c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
155c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   t->insn[t->insn_count++] = start;
156c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
157c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
158c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
159c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/**
160c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Map a Mesa dst register to a TGSI ureg_dst register.
161c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */
162c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic struct ureg_dst
163c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgdst_register( struct st_translate *t,
164c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org              gl_register_file file,
165c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org              GLuint index )
166c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{
167c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   switch( file ) {
168c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_UNDEFINED:
169c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      return ureg_dst_undef();
170c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
171c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_TEMPORARY:
172c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      if (ureg_dst_is_undef(t->temps[index]))
173c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         t->temps[index] = ureg_DECL_temporary( t->ureg );
174c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
175c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      return t->temps[index];
176c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
177dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org   case PROGRAM_OUTPUT:
178c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      if (t->procType == TGSI_PROCESSOR_VERTEX)
179c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         assert(index < VERT_RESULT_MAX);
180248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      else if (t->procType == TGSI_PROCESSOR_FRAGMENT)
181c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         assert(index < FRAG_RESULT_MAX);
182dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org      else
183c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         assert(index < GEOM_RESULT_MAX);
184c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
185c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      assert(t->outputMapping[index] < Elements(t->outputs));
186068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
187068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return t->outputs[t->outputMapping[index]];
188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
189e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   case PROGRAM_ADDRESS:
190fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      return t->address[index];
191fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
192fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   default:
193fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      debug_assert( 0 );
194dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org      return ureg_dst_undef();
195dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org   }
196c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
197c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
198068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
199c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/**
200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * Map a Mesa src register to a TGSI ureg_src register.
201c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */
202c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic struct ureg_src
203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comsrc_register( struct st_translate *t,
204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com              gl_register_file file,
205c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org              GLint index )
206e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{
207e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   switch( file ) {
2083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case PROGRAM_UNDEFINED:
2093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return ureg_src_undef();
210c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
211c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_TEMPORARY:
212c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      assert(index >= 0);
213c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      assert(index < Elements(t->temps));
214c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      if (ureg_dst_is_undef(t->temps[index]))
215c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org         t->temps[index] = ureg_DECL_temporary( t->ureg );
216dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org      return ureg_src(t->temps[index]);
217fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
218c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_NAMED_PARAM:
219c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_ENV_PARAM:
220c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_LOCAL_PARAM:
221c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_UNIFORM:
222c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      assert(index >= 0);
223068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return t->constants[index];
2242c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org   case PROGRAM_STATE_VAR:
225068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case PROGRAM_CONSTANT:       /* ie, immediate */
226068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      if (index < 0)
227068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org         return ureg_DECL_constant( t->ureg, 0 );
228068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      else
229068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org         return t->constants[index];
230068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
231068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case PROGRAM_INPUT:
232068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      assert(t->inputMapping[index] < Elements(t->inputs));
233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return t->inputs[t->inputMapping[index]];
234e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
235c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_OUTPUT:
236c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      assert(t->outputMapping[index] < Elements(t->outputs));
237c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */
238c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
239c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   case PROGRAM_ADDRESS:
240c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      return ureg_src(t->address[index]);
2413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
2423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case PROGRAM_SYSTEM_VALUE:
2433e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      assert(index < Elements(t->systemValues));
2443e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return t->systemValues[index];
245c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
246c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   default:
247c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      debug_assert( 0 );
248c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      return ureg_src_undef();
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2527c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
2537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org/**
2547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org * Map mesa texture target to TGSI texture target.
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */
256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgunsigned
2572c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgst_translate_texture_target( GLuint textarget,
2582c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                          GLboolean shadow )
2593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org{
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   if (shadow) {
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      switch( textarget ) {
262f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      case TEXTURE_1D_INDEX:   return TGSI_TEXTURE_SHADOW1D;
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case TEXTURE_2D_INDEX:   return TGSI_TEXTURE_SHADOW2D;
26401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org      case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT;
265e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW1D_ARRAY;
26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW2D_ARRAY;
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_SHADOWCUBE;
268145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com      default: break;
269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   switch( textarget ) {
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case TEXTURE_1D_INDEX:   return TGSI_TEXTURE_1D;
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case TEXTURE_2D_INDEX:   return TGSI_TEXTURE_2D;
275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case TEXTURE_3D_INDEX:   return TGSI_TEXTURE_3D;
276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE;
277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT;
278e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   case TEXTURE_1D_ARRAY_INDEX:   return TGSI_TEXTURE_1D_ARRAY;
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case TEXTURE_2D_ARRAY_INDEX:   return TGSI_TEXTURE_2D_ARRAY;
28001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org   case TEXTURE_EXTERNAL_INDEX:   return TGSI_TEXTURE_2D;
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   default:
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      debug_assert( 0 );
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return TGSI_TEXTURE_1D;
2843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
2852c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
2865de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
2875de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
2882c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org/**
2892c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org * Create a TGSI ureg_dst register from a Mesa dest register.
2902c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org */
2912c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic struct ureg_dst
2922c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgtranslate_dst( struct st_translate *t,
2932c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org               const struct prog_dst_register *DstReg,
2942c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org               boolean saturate,
2955de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org               boolean clamp_color)
296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{
297c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_dst dst = dst_register( t,
298e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org                                       DstReg->File,
299c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                       DstReg->Index );
300e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
301c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   dst = ureg_writemask( dst,
302c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         DstReg->WriteMask );
303c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
30401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org   if (saturate)
30501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org      dst = ureg_saturate( dst );
306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   else if (clamp_color && DstReg->File == PROGRAM_OUTPUT) {
307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      /* Clamp colors for ARB_color_buffer_float. */
308c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org      switch (t->procType) {
309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      case TGSI_PROCESSOR_VERTEX:
310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         /* XXX if the geometry shader is present, this must be done there
3111845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org          * instead of here. */
3121845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org         if (DstReg->Index == VERT_RESULT_COL0 ||
3133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org             DstReg->Index == VERT_RESULT_COL1 ||
3141845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org             DstReg->Index == VERT_RESULT_BFC0 ||
315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com             DstReg->Index == VERT_RESULT_BFC1) {
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            dst = ureg_saturate(dst);
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         }
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         break;
3193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      case TGSI_PROCESSOR_FRAGMENT:
321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         if (DstReg->Index >= FRAG_RESULT_COLOR) {
322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org            dst = ureg_saturate(dst);
323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         }
324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         break;
325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
328e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   if (DstReg->RelAddr)
329c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) );
330c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org   return dst;
3321845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
333e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
335c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/**
3363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * Create a TGSI ureg_src register from a Mesa src register.
3371845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org */
3385de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgstatic struct ureg_src
339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtranslate_src( struct st_translate *t,
340e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org               const struct prog_src_register *SrcReg )
341c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{
342c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index );
343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3443cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) {
3453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      src = src_register( t, SrcReg->File, SrcReg->Index2 );
3465de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      if (SrcReg->RelAddr2)
3475de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org         src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]),
348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                            SrcReg->Index);
349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      else
350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         src = ureg_src_dimension( src, SrcReg->Index);
3513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
3523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
353c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   src = ureg_swizzle( src,
354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                       GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3,
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                       GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3,
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                       GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3,
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                       GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3);
3585de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
3595de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org   if (SrcReg->Negate == NEGATE_XYZW)
3605de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      src = ureg_negate(src);
361e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
3625de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org   if (SrcReg->Abs)
363068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      src = ureg_abs(src);
364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
365ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   if (SrcReg->RelAddr) {
366ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      src = ureg_src_indirect( src, ureg_src(t->address[0]));
3673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      if (SrcReg->File != PROGRAM_INPUT &&
368068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org          SrcReg->File != PROGRAM_OUTPUT) {
3692c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org         /* If SrcReg->Index was negative, it was set to zero in
3702c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org          * src_register().  Reassign it now.  But don't do this
371ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org          * for input/output regs since they get remapped while
3722c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org          * const buffers don't.
3732c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org          */
3742c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org         src.Index = SrcReg->Index;
3752c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org      }
376ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   }
3773cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
378ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   return src;
3792c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org}
3802c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
3812c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
3822c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgstatic struct ureg_src swizzle_4v( struct ureg_src src,
3832c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org                                   const unsigned *swz )
3842c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org{
3852c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org   return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] );
386c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
387c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3883cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
3893cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org/**
3903cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org * Translate a SWZ instruction into a MOV, MUL or MAD instruction.  EG:
391c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *
392c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *   SWZ dst, src.x-y10
393c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *
394c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * becomes:
3953cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org *
3963cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org *   MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0}
3973cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org */
3983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgstatic void emit_swz( struct st_translate *t,
399c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      struct ureg_dst dst,
400ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                      const struct prog_src_register *SrcReg )
401ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org{
402ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   struct ureg_program *ureg = t->ureg;
4033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index );
4043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
4053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   unsigned negate_mask =  SrcReg->Negate;
406c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
407c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 |
408c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 |
409c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 |
410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3);
411c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
412e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 |
413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 |
414c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 |
415c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3);
416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4173cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   unsigned negative_one_mask = one_mask & negate_mask;
4183cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   unsigned positive_one_mask = one_mask & ~negate_mask;
4193cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
420c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct ureg_src imm;
421c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned i;
422c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned mul_swizzle[4] = {0,0,0,0};
423c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned add_swizzle[4] = {0,0,0,0};
424c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned src_swizzle[4] = {0,0,0,0};
425c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   boolean need_add = FALSE;
426c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   boolean need_mul = FALSE;
4273cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
4283cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   if (dst.WriteMask == 0)
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
4303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
4313e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   /* Is this just a MOV?
4323e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    */
433c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   if (zero_mask == 0 &&
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen       one_mask == 0 &&
435e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org       (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW))
436c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   {
437c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ureg_MOV( ureg, dst, translate_src( t, SrcReg ));
438c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return;
439ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   }
440ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_ZERO    0
442c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_ONE     1
443c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_NEG_ONE 2
444c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
445c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   imm = ureg_imm3f( ureg, 0, 1, -1 );
44633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
447fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org   for (i = 0; i < 4; i++) {
44872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org      unsigned bit = 1 << i;
449474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org
450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      if (dst.WriteMask & bit) {
451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org         if (positive_one_mask & bit) {
452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            mul_swizzle[i] = IMM_ZERO;
453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            add_swizzle[i] = IMM_ONE;
454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            need_add = TRUE;
455c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         }
456c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         else if (negative_one_mask & bit) {
457c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            mul_swizzle[i] = IMM_ZERO;
458a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org            add_swizzle[i] = IMM_NEG_ONE;
459c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            need_add = TRUE;
460e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         }
461e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         else if (zero_mask & bit) {
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            mul_swizzle[i] = IMM_ZERO;
463ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            add_swizzle[i] = IMM_ZERO;
464ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            need_add = TRUE;
465ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org         }
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         else {
467ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            add_swizzle[i] = IMM_ZERO;
468ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i);
469ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            need_mul = TRUE;
470c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            if (negate_mask & bit) {
471c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com               mul_swizzle[i] = IMM_NEG_ONE;
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            }
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            else {
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               mul_swizzle[i] = IMM_ONE;
475068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org            }
476068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org         }
4773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      }
4783e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
479068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
4805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org   if (need_mul && need_add) {
4815de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      ureg_MAD( ureg,
482068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                dst,
4835de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                swizzle_4v( src, src_swizzle ),
484068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                swizzle_4v( imm, mul_swizzle ),
485068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                swizzle_4v( imm, add_swizzle ) );
486068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   }
487e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   else if (need_mul) {
488068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      ureg_MUL( ureg,
489068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                dst,
490068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                swizzle_4v( src, src_swizzle ),
491068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                swizzle_4v( imm, mul_swizzle ) );
4923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
4933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   else if (need_add) {
4943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      ureg_MOV( ureg,
4953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                dst,
496068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                swizzle_4v( imm, add_swizzle ) );
497068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   }
498068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   else {
499068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      debug_assert(0);
500e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   }
5011845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
502068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_ZERO
503068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_ONE
504068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_NEG_ONE
505068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
506068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
507068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
508068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org/**
509e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * Negate the value of DDY to match GL semantics where (0,0) is the
510068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * lower-left corner of the window.
511068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * Note that the GL_ARB_fragment_coord_conventions extension will
512068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * effect this someday.
513068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org */
514068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic void emit_ddy( struct st_translate *t,
515068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      struct ureg_dst dst,
516068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      const struct prog_src_register *SrcReg )
517e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{
5181845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org   struct ureg_program *ureg = t->ureg;
519068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   struct ureg_src src = translate_src( t, SrcReg );
520068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   src = ureg_negate( src );
521068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   ureg_DDY( ureg, dst, src );
522068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
523068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
524068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
525068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
526068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic unsigned
527068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgtranslate_opcode( unsigned op )
528c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{
529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   switch( op ) {
5301e71c4d02b6ae995c57bf1f7f3ce99a4ef88eba5mstarzinger@chromium.org   case OPCODE_ARL:
531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return TGSI_OPCODE_ARL;
532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   case OPCODE_ABS:
533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return TGSI_OPCODE_ABS;
534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   case OPCODE_ADD:
535c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_ADD;
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case OPCODE_BGNLOOP:
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return TGSI_OPCODE_BGNLOOP;
538c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_BGNSUB:
539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return TGSI_OPCODE_BGNSUB;
540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   case OPCODE_BRA:
541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return TGSI_OPCODE_BRA;
542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   case OPCODE_BRK:
543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return TGSI_OPCODE_BRK;
544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org   case OPCODE_CAL:
545c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_CAL;
546717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   case OPCODE_CMP:
547717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      return TGSI_OPCODE_CMP;
548068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_CONT:
549068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_CONT;
550c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_COS:
551c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_COS;
552e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   case OPCODE_DDX:
553068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_DDX;
554ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   case OPCODE_DDY:
555c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_DDY;
556c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_DP2:
5575de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return TGSI_OPCODE_DP2;
558ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   case OPCODE_DP2A:
559ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_DP2A;
560c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   case OPCODE_DP3:
561068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_DP3;
562068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_DP4:
563068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_DP4;
564068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_DPH:
565068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_DPH;
566068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_DST:
567068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_DST;
568068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_ELSE:
569068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_ELSE;
570068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_EMIT_VERTEX:
571068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_EMIT;
572068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_END_PRIMITIVE:
573068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_ENDPRIM;
574068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_ENDIF:
575068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_ENDIF;
576068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_ENDLOOP:
577068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_ENDLOOP;
578068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_ENDSUB:
579068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_ENDSUB;
580068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_EX2:
581068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_EX2;
582068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_EXP:
583068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_EXP;
584068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_FLR:
585068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_FLR;
586068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_FRC:
587068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_FRC;
588068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_IF:
589068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_IF;
590068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_TRUNC:
591c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_TRUNC;
592068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_KIL:
5933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_KIL;
5943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_KIL_NV:
595ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_KILP;
596c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_LG2:
597c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_LG2;
5983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_LOG:
5993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_LOG;
600c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_LIT:
601c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_LIT;
602717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   case OPCODE_LRP:
603068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_LRP;
604068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_MAD:
6055de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return TGSI_OPCODE_MAD;
606c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_MAX:
607c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_MAX;
6081845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org   case OPCODE_MIN:
6093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_MIN;
610068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_MOV:
6113e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_MOV;
6123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_MUL:
613c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_MUL;
614c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_NOP:
615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_NOP;
616c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_NRM3:
617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_NRM;
6183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_NRM4:
6193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_NRM4;
620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_POW:
621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_POW;
622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_RCP:
623c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_RCP;
624c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_RET:
625ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_RET;
626c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   case OPCODE_RSQ:
627c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      return TGSI_OPCODE_RSQ;
628068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_SCS:
629c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      return TGSI_OPCODE_SCS;
630c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   case OPCODE_SEQ:
631ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_SEQ;
632068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_SGE:
633c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_SGE;
634068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_SGT:
6355de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return TGSI_OPCODE_SGT;
6363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_SIN:
6373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_SIN;
6383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_SLE:
6393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_SLE;
6403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_SLT:
6413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_SLT;
642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_SNE:
643c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_SNE;
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case OPCODE_SSG:
645c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      return TGSI_OPCODE_SSG;
646068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_SUB:
647c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      return TGSI_OPCODE_SUB;
648ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   case OPCODE_TEX:
649ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_TEX;
650068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_TXB:
651ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      return TGSI_OPCODE_TXB;
652ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   case OPCODE_TXD:
653068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      return TGSI_OPCODE_TXD;
654068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   case OPCODE_TXL:
6553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_TXL;
6563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_TXP:
657c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_TXP;
658c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_XPD:
659c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_XPD;
660c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_END:
661c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return TGSI_OPCODE_END;
662717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   default:
663717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      debug_assert( 0 );
6643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return TGSI_OPCODE_NOP;
6653e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
666c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
667c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
668c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void
670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgcompile_instruction(
671e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   struct st_translate *t,
672e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   const struct prog_instruction *inst,
673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   boolean clamp_dst_color_output)
674e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{
675e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   struct ureg_program *ureg = t->ureg;
676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   GLuint i;
677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   struct ureg_dst dst[1] = { { 0 } };
678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   struct ureg_src src[4];
679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   unsigned num_dst;
6803e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   unsigned num_src;
681c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
682068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org   num_dst = _mesa_num_inst_dst_regs( inst->Opcode );
683c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   num_src = _mesa_num_inst_src_regs( inst->Opcode );
684c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
685c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   if (num_dst)
686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      dst[0] = translate_dst( t,
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                              &inst->DstReg,
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                              inst->SaturateMode,
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                              clamp_dst_color_output);
690c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6917d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   for (i = 0; i < num_src; i++)
6927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      src[i] = translate_src( t, &inst->SrcReg[i] );
6933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
6943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   switch( inst->Opcode ) {
695c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_SWZ:
696c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      emit_swz( t, dst[0], &inst->SrcReg[0] );
697c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return;
698c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
699c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_BGNLOOP:
700c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_CAL:
701c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_ELSE:
702e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org   case OPCODE_ENDLOOP:
703c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_IF:
704c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      debug_assert(num_dst == 0);
705c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ureg_label_insn( ureg,
70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                       translate_opcode( inst->Opcode ),
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                       src, num_src,
7083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                       get_label( t, inst->BranchTarget ));
7093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      return;
7102c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
711c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_TEX:
712c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_TXB:
713c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_TXD:
7145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org   case OPCODE_TXL:
715c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   case OPCODE_TXP:
716c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      src[num_src++] = t->samplers[inst->TexSrcUnit];
717c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ureg_tex_insn( ureg,
7183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                     translate_opcode( inst->Opcode ),
719c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                     dst, num_dst,
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     st_translate_texture_target( inst->TexSrcTarget,
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               inst->TexShadow ),
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     NULL, 0,
7233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                     src, num_src );
7249258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org      return;
7252c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
726c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   case OPCODE_SCS:
727c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY );
728c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      ureg_insn( ureg,
729c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org                 translate_opcode( inst->Opcode ),
730c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org                 dst, num_dst,
7317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org                 src, num_src );
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   case OPCODE_XPD:
735b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ );
736add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org      ureg_insn( ureg,
7375de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                 translate_opcode( inst->Opcode ),
7387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org                 dst, num_dst,
739add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org                 src, num_src );
740add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org      break;
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
742b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   case OPCODE_NOISE1:
743b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   case OPCODE_NOISE2:
744b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   case OPCODE_NOISE3:
745b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   case OPCODE_NOISE4:
746b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      /* At some point, a motivated person could add a better
747b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org       * implementation of noise.  Currently not even the nvidia
748b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org       * binary drivers do anything more than this.  In any case, the
749b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org       * place to do this is in the GL state tracker, not the poor
750c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com       * driver.
751c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com       */
752c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) );
753c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      break;
754c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
7553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   case OPCODE_DDY:
756c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      emit_ddy( t, dst[0], &inst->SrcReg[0] );
757c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      break;
758c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   default:
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      ureg_insn( ureg,
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 translate_opcode( inst->Opcode ),
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 dst, num_dst,
763c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                 src, num_src );
764c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      break;
765c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
766c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Emit the TGSI instructions for inverting and adjusting WPOS.
77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * This code is unavoidable because it also depends on whether
772c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM).
7733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org */
774c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic void
775e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgemit_wpos_adjustment( struct st_translate *t,
776c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      const struct gl_program *program,
777e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org                      boolean invert,
778c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      GLfloat adjX, GLfloat adjY[2])
779013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org{
780013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org   struct ureg_program *ureg = t->ureg;
781013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
782c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* Fragment program uses fragment position input.
7833e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    * Need to replace instances of INPUT[WPOS] with temp T
784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    * where T = INPUT[WPOS] by y is inverted.
785c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    */
786c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   static const gl_state_index wposTransformState[STATE_LENGTH]
787c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM, 0, 0, 0 };
788c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
789c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* XXX: note we are modifying the incoming shader here!  Need to
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    * do this before emitting the constant decls below, or this
791c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    * will be missed:
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    */
79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   unsigned wposTransConst = _mesa_add_state_reference(program->Parameters,
79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                                       wposTransformState);
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst );
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg );
7983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]];
7993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
8003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   /* First, apply the coordinate shift: */
8013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   if (adjX || adjY[0] || adjY[1]) {
8023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      if (adjY[0] != adjY[1]) {
8033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org         /* Adjust the y coordinate by adjY[1] or adjY[0] respectively
80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          * depending on whether inversion is actually going to be applied
80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          * or not, which is determined by testing against the inversion
80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          * state variable used below, which will be either +1 or -1.
807ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org          */
808ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org         struct ureg_dst adj_temp = ureg_DECL_temporary(ureg);
809ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
810ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org         ureg_CMP(ureg, adj_temp,
8115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                  ureg_scalar(wpostrans, invert ? 2 : 0),
812ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                  ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f),
813ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                  ureg_imm4f(ureg, adjX, adjY[1], 0.0f, 0.0f));
814ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org         ureg_ADD(ureg, wpos_temp, wpos_input, ureg_src(adj_temp));
815ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      } else {
8165de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org         ureg_ADD(ureg, wpos_temp, wpos_input,
817ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                  ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f));
818ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      }
819ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      wpos_input = ureg_src(wpos_temp);
820ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   } else {
821ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      /* MOV wpos_temp, input[wpos]
822ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org       */
823ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      ureg_MOV( ureg, wpos_temp, wpos_input );
824ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   }
825ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
826ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be
827ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    * inversion/identity, or the other way around if we're drawing to an FBO.
828ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    */
829ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   if (invert) {
8305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy
831ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org       */
832ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      ureg_MAD( ureg,
833ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ),
8345de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                wpos_input,
8353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                ureg_scalar(wpostrans, 0),
836068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                ureg_scalar(wpostrans, 1));
837ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   } else {
8383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww
839ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org       */
840ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      ureg_MAD( ureg,
841ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ),
842ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                wpos_input,
843ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                ureg_scalar(wpostrans, 2),
844ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org                ureg_scalar(wpostrans, 3));
845ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   }
846ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
847ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   /* Use wpos_temp as position input from here on:
848ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    */
8493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp);
850ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org}
851ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
852ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
853068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org/**
854068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * Emit fragment position/ooordinate code.
855ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */
856ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgstatic void
857ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgemit_wpos(struct st_context *st,
8583e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org          struct st_translate *t,
8593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org          const struct gl_program *program,
8603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org          struct ureg_program *ureg)
861ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org{
862ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   const struct gl_fragment_program *fp =
863ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      (const struct gl_fragment_program *) program;
864ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   struct pipe_screen *pscreen = st->pipe->screen;
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   GLfloat adjX = 0.0f;
8662efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org   GLfloat adjY[2] = { 0.0f, 0.0f };
8672efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org   boolean invert = FALSE;
8682efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
8692efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org   /* Query the pixel center conventions supported by the pipe driver and set
8702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    * adjX, adjY to help out if it cannot handle the requested one internally.
8712efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    *
8722efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    * The bias of the y-coordinate depends on whether y-inversion takes place
8732efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    * (adjY[1]) or not (adjY[0]), which is in turn dependent on whether we are
8742efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    * drawing to an FBO (causes additional inversion), and whether the the pipe
8752efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    * driver origin and the requested origin differ (the latter condition is
876e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    * stored in the 'invert' variable).
8772efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    *
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    * For height = 100 (i = integer, h = half-integer, l = lower, u = upper):
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    *
880f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org    * center shift only:
8819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    * i -> h: +0.5
882c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    * h -> i: -0.5
883c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    *
8843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    * inversion only:
885f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org    * l,i -> u,i: ( 0.0 + 1.0) * -1 + 100 = 99
886f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org    * l,h -> u,h: ( 0.5 + 0.0) * -1 + 100 = 99.5
887ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    * u,i -> l,i: (99.0 + 1.0) * -1 + 100 = 0
8883e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    * u,h -> l,h: (99.5 + 0.0) * -1 + 100 = 0.5
889ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    *
890ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    * inversion and center shift:
891ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    * l,i -> u,h: ( 0.0 + 0.5) * -1 + 100 = 99.5
8923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    * l,h -> u,i: ( 0.5 + 0.5) * -1 + 100 = 99
8933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    * u,i -> l,h: (99.0 + 0.5) * -1 + 100 = 0.5
89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    * u,h -> l,i: (99.5 + 0.5) * -1 + 100 = 0
89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    */
896ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org   if (fp->OriginUpperLeft) {
897ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      /* Fragment shader wants origin in upper-left */
89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) {
899c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         /* the driver supports upper-left origin */
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) {
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         /* the driver supports lower-left origin, need to invert Y */
9033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org         ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         invert = TRUE;
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
9063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      else
90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         assert(0);
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   else {
910c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      /* Fragment shader wants origin in lower-left */
911c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
912c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         /* the driver supports lower-left origin */
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
914c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
915c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         /* the driver supports upper-left origin, need to invert Y */
916c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         invert = TRUE;
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      else
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         assert(0);
91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
92072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org
9215de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org   if (fp->PixelCenterInteger) {
922ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      /* Fragment shader wants pixel center integer */
92372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org      if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
92472204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         /* the driver supports pixel center integer */
92572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         adjY[1] = 1.0f;
92672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
92772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org      }
92872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org      else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
92972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         /* the driver supports pixel center half integer, need to bias X,Y */
93072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         adjX = -0.5f;
93172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org         adjY[0] = -0.5f;
932b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org         adjY[1] = 0.5f;
933a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      }
934e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      else
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         assert(0);
936b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org   }
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   else {
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      /* Fragment shader wants pixel center half integer */
939c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
940c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         /* the driver supports pixel center half integer */
941c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         /* the driver supports pixel center integer, need to bias X,Y */
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         adjX = adjY[0] = adjY[1] = 0.5f;
94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
9467276f14ca716596e0a0d17539516370c1f453847kasper.lund      }
947b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org      else
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         assert(0);
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
950e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
951c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* we invert after adjustment so that we avoid the MOV to temporary,
952e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    * and reuse the adjustment ADD instead */
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   emit_wpos_adjustment(t, program, invert, adjX, adjY);
954c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
956e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
958c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back.
959c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * TGSI uses +1 for front, -1 for back.
9607276f14ca716596e0a0d17539516370c1f453847kasper.lund * This function converts the TGSI value to the GL value.  Simply clamping/
961c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * saturating the value to [0,1] does the job.
9627276f14ca716596e0a0d17539516370c1f453847kasper.lund */
9637276f14ca716596e0a0d17539516370c1f453847kasper.lundstatic void
9646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgemit_face_var( struct st_translate *t,
965c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com               const struct gl_program *program )
966c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{
9677276f14ca716596e0a0d17539516370c1f453847kasper.lund   struct ureg_program *ureg = t->ureg;
9687d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   struct ureg_dst face_temp = ureg_DECL_temporary( ureg );
9697d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]];
9707d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
9717d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   /* MOV_SAT face_temp, input[face]
9727d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    */
9737d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   face_temp = ureg_saturate( face_temp );
9743e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   ureg_MOV( ureg, face_temp, face_input );
9753e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
976c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* Use face_temp as face input from here on:
97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    */
978e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp);
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
980c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void
98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenemit_edgeflags( struct st_translate *t,
98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 const struct gl_program *program )
98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{
9867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   struct ureg_program *ureg = t->ureg;
987e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   struct ureg_dst edge_dst = t->outputs[t->outputMapping[VERT_RESULT_EDGE]];
988e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   struct ureg_src edge_src = t->inputs[t->inputMapping[VERT_ATTRIB_EDGEFLAG]];
989e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
9907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   ureg_MOV( ureg, edge_dst, edge_src );
9917d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
9927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
993e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
9947d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org/**
9957d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * Translate Mesa program to TGSI format.
9967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param program  the program to translate
9977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param numInputs  number of input registers used
9987d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputMapping  maps Mesa fragment program inputs to TGSI generic
99956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org *                      input indexes
10007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputSemanticName  the TGSI_SEMANTIC flag for each input
10017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputSemanticIndex  the semantic index (ex: which texcoord) for
100256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org *                            each input
10037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param interpMode  the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
100441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org * \param numOutputs  number of output registers used
1005b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org * \param outputMapping  maps Mesa fragment program outputs to TGSI
100641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org *                       generic outputs
10071845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * \param outputSemanticName  the TGSI_SEMANTIC flag for each output
10081845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * \param outputSemanticIndex  the semantic index (ex: which texcoord) for
10091845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org *                             each output
1010f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org *
1011f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org * \return  PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY
1012f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org */
10137d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgenum pipe_error
10147d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgst_translate_mesa_program(
1015e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   struct gl_context *ctx,
1016e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   uint procType,
1017e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   struct ureg_program *ureg,
10187d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const struct gl_program *program,
10197d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   GLuint numInputs,
10201845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org   const GLuint inputMapping[],
10217d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const ubyte inputSemanticName[],
10227d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const ubyte inputSemanticIndex[],
10237d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const GLuint interpMode[],
10247d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   GLuint numOutputs,
10257d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const GLuint outputMapping[],
10267d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const ubyte outputSemanticName[],
10277d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org   const ubyte outputSemanticIndex[],
102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   boolean passthrough_edgeflags,
1029c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   boolean clamp_color)
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{
1031c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   struct st_translate translate, *t;
1032c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   unsigned i;
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   enum pipe_error ret = PIPE_OK;
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   assert(numInputs <= Elements(t->inputs));
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   assert(numOutputs <= Elements(t->outputs));
103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   t = &translate;
1039e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   memset(t, 0, sizeof *t);
1040e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1041e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   t->procType = procType;
1042e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   t->inputMapping = inputMapping;
1043e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   t->outputMapping = outputMapping;
1044e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   t->ureg = ureg;
1045e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1046e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   /*_mesa_print_program(program);*/
1047e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1048e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   /*
1049e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    * Declare input attributes.
1050e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    */
1051e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   if (procType == TGSI_PROCESSOR_FRAGMENT) {
1052e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      for (i = 0; i < numInputs; i++) {
1053e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org         if (program->InputFlags[0] & PROG_PARAM_BIT_CYL_WRAP) {
1054e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            t->inputs[i] = ureg_DECL_fs_input_cyl(ureg,
1055e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                                                  inputSemanticName[i],
1056057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org                                                  inputSemanticIndex[i],
1057057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org                                                  interpMode[i],
1058057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org                                                  TGSI_CYLINDRICAL_WRAP_X);
1059057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org         }
1060057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org         else {
10613484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org            t->inputs[i] = ureg_DECL_fs_input(ureg,
1062e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org                                              inputSemanticName[i],
1063e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org                                              inputSemanticIndex[i],
10642c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org                                              interpMode[i]);
10652c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org         }
10662c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org      }
10672c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
1068e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      if (program->InputsRead & FRAG_BIT_WPOS) {
10692efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org         /* Must do this after setting up t->inputs, and before
10702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org          * emitting constant references, below:
10712c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org          */
10722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org         emit_wpos(st_context(ctx), t, program, ureg);
10733484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org      }
10743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
10753484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org      if (program->InputsRead & FRAG_BIT_FACE) {
10763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org         emit_face_var( t, program );
10773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org      }
1078e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
10796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      /*
1080ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org       * Declare output attributes.
1081ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org       */
1082ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      for (i = 0; i < numOutputs; i++) {
108327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org         switch (outputSemanticName[i]) {
108427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org         case TGSI_SEMANTIC_POSITION:
10853484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org            t->outputs[i] = ureg_DECL_output( ureg,
1086c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                              TGSI_SEMANTIC_POSITION, /* Z / Depth */
1087c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                              outputSemanticIndex[i] );
1088c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1089c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            t->outputs[i] = ureg_writemask( t->outputs[i],
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            TGSI_WRITEMASK_Z );
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            break;
1092e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         case TGSI_SEMANTIC_STENCIL:
1093ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org            t->outputs[i] = ureg_DECL_output( ureg,
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              TGSI_SEMANTIC_STENCIL, /* Stencil */
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              outputSemanticIndex[i] );
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            t->outputs[i] = ureg_writemask( t->outputs[i],
1097f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                            TGSI_WRITEMASK_Y );
1098f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org            break;
1099f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org         case TGSI_SEMANTIC_COLOR:
1100f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org            t->outputs[i] = ureg_DECL_output( ureg,
1101f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                              TGSI_SEMANTIC_COLOR,
1102f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                              outputSemanticIndex[i] );
1103f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org            break;
1104f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org         default:
1105e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org            debug_assert(0);
1106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org            return 0;
1107e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         }
1108f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org      }
1109f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org   }
1110f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org   else if (procType == TGSI_PROCESSOR_GEOMETRY) {
1111f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org      for (i = 0; i < numInputs; i++) {
1112f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org         t->inputs[i] = ureg_DECL_gs_input(ureg,
1113f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                           i,
1114f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                           inputSemanticName[i],
1115f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org                                           inputSemanticIndex[i]);
1116f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org      }
1117f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org
1118f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org      for (i = 0; i < numOutputs; i++) {
1119f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org         t->outputs[i] = ureg_DECL_output( ureg,
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                           outputSemanticName[i],
11213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                                           outputSemanticIndex[i] );
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
1124c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   else {
1125defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assert(procType == TGSI_PROCESSOR_VERTEX);
1126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1127ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      for (i = 0; i < numInputs; i++) {
1128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         t->inputs[i] = ureg_DECL_vs_input(ureg, i);
1129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
1130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1131c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org      for (i = 0; i < numOutputs; i++) {
1132ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org         t->outputs[i] = ureg_DECL_output( ureg,
1133c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                           outputSemanticName[i],
1134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                           outputSemanticIndex[i] );
1135a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      }
1136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      if (passthrough_edgeflags)
1137ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org         emit_edgeflags( t, program );
1138ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org   }
1139c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* Declare address register.
1141c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    */
1142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   if (program->NumAddressRegs > 0) {
1143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      debug_assert( program->NumAddressRegs == 1 );
1144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      t->address[0] = ureg_DECL_address( ureg );
1145c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
1146c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1147c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org   /* Declare misc input registers
1148c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    */
1149c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   {
1150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      GLbitfield sysInputs = program->SystemValuesRead;
1151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      unsigned numSys = 0;
1152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      for (i = 0; sysInputs; i++) {
1153ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org         if (sysInputs & (1 << i)) {
1154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            unsigned semName = mesa_sysval_to_semantic[i];
1155c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            t->systemValues[i] = ureg_DECL_system_value(ureg, numSys, semName, 0);
1156c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            if (semName == TGSI_SEMANTIC_INSTANCEID ||
1157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                semName == TGSI_SEMANTIC_VERTEXID) {
1158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com               /* From Gallium perspective, these system values are always
1159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                * integer, and require native integer support.  However, if
1160defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org                * native integer is supported on the vertex stage but not the
1161defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org                * pixel stage (e.g, i915g + draw), Mesa will generate IR that
1162c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org                * assumes these system values are floats. To resolve the
1163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                * inconsistency, we insert a U2F.
1164defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org                */
1165c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org               struct st_context *st = st_context(ctx);
1166defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org               struct pipe_screen *pscreen = st->pipe->screen;
1167c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org               assert(procType == TGSI_PROCESSOR_VERTEX);
1168defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org               assert(pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_INTEGERS));
1169c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org               if (!ctx->Const.NativeIntegers) {
1170defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org                  struct ureg_dst temp = ureg_DECL_local_temporary(t->ureg);
117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  ureg_U2F( t->ureg, ureg_writemask(temp, TGSI_WRITEMASK_X), t->systemValues[i]);
117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  t->systemValues[i] = ureg_scalar(ureg_src(temp), 0);
117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               }
11745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org            }
1175f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com            numSys++;
1176c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            sysInputs &= ~(1 << i);
1177f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com         }
11785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      }
11795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   }
11805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
1181ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   if (program->IndirectRegisterFiles & (1 << PROGRAM_TEMPORARY)) {
1182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      /* If temps are accessed with indirect addressing, declare temporaries
1183c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com       * in sequential order.  Else, we declare them on demand elsewhere.
11843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org       */
11853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      for (i = 0; i < program->NumTemporaries; i++) {
1186c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */
1187c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         t->temps[i] = ureg_DECL_temporary( t->ureg );
1188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
1189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
1190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
11915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   /* Emit constants and immediates.  Mesa uses a single index space
1192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    * for these, so we put all the translated regs in t->constants.
119321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    */
119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   if (program->Parameters) {
1195f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      t->constants = calloc( program->Parameters->NumParameters,
119643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                             sizeof t->constants[0] );
119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (t->constants == NULL) {
119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         ret = PIPE_ERROR_OUT_OF_MEMORY;
11993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org         goto out;
12003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      }
12013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
120243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      for (i = 0; i < program->Parameters->NumParameters; i++) {
120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         switch (program->Parameters->Parameters[i].Type) {
120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         case PROGRAM_ENV_PARAM:
1205e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         case PROGRAM_LOCAL_PARAM:
1206e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         case PROGRAM_STATE_VAR:
1207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         case PROGRAM_NAMED_PARAM:
1208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org         case PROGRAM_UNIFORM:
120943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            t->constants[i] = ureg_DECL_constant( ureg, i );
12103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org            break;
1211659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
1212659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org            /* Emit immediates only when there's no indirect addressing of
12133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org             * the const buffer.
1214659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org             * FIXME: Be smarter and recognize param arrays:
121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             * indirect addressing is only valid within the referenced
121643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             * array.
1217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org             */
121843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         case PROGRAM_CONSTANT:
1219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            if (program->IndirectRegisterFiles & PROGRAM_ANY_CONST)
1220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com               t->constants[i] = ureg_DECL_constant( ureg, i );
122130ce411529579186181838984710b0b0980857aaricow@chromium.org            else
1222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com               t->constants[i] =
122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  ureg_DECL_immediate( ureg,
1224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                       (const float*) program->Parameters->ParameterValues[i],
122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                       4 );
122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            break;
122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         default:
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            break;
122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         }
123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   /* texture samplers */
123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (program->SamplersUsed & (1 << i)) {
123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         t->samplers[i] = ureg_DECL_sampler( ureg, i );
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   }
123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   /* Emit each instruction in turn:
1241ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org    */
1242ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org   for (i = 0; i < program->NumInstructions; i++) {
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      set_insn_start( t, ureg_get_instruction_number( ureg ));
12445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      compile_instruction( t, &program->Instructions[i], clamp_color );
12455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   }
1246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   /* Fix up all emitted labels:
1248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    */
1249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   for (i = 0; i < t->labels_count; i++) {
1250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ureg_fixup_label( ureg,
1251c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        t->labels[i].token,
1252c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        t->insn[t->labels[i].branch_target] );
1253c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com   }
125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenout:
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   FREE(t->insn);
12573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   FREE(t->labels);
125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   FREE(t->constants);
125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1260ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   if (t->error) {
1261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      debug_printf("%s: translate error flag set\n", __FUNCTION__);
1262a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   }
1263a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1264a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   return ret;
1265c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1266c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1267c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1268c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com/**
1269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * Tokens cannot be free with free otherwise the builtin gallium
1270a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * malloc debugging will get confused.
1271ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org */
1272ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.orgvoid
1273ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.orgst_free_tokens(const struct tgsi_token *tokens)
1274ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org{
1275ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   ureg_free_tokens(tokens);
1276ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org}
1277e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org