ir_to_mesa.cpp revision 87708e8c90220cc1997cef9de9b394c04d952be9
184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt/* 2bd3b835e7c32e093f91f636330fd93b3dedd8362Eric Anholt * Copyright (C) 2005-2007 Brian Paul All Rights Reserved. 3bd3b835e7c32e093f91f636330fd93b3dedd8362Eric Anholt * Copyright (C) 2008 VMware, Inc. All Rights Reserved. 484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Copyright © 2010 Intel Corporation 584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * 684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * copy of this software and associated documentation files (the "Software"), 884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * to deal in the Software without restriction, including without limitation 984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * and/or sell copies of the Software, and to permit persons to whom the 1184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Software is furnished to do so, subject to the following conditions: 1284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * 1384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * The above copyright notice and this permission notice (including the next 1484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * paragraph) shall be included in all copies or substantial portions of the 1584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Software. 1684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * 1784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * DEALINGS IN THE SOFTWARE. 2484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */ 2584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 2684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt/** 2784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * \file ir_to_mesa.cpp 2884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * 2984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Translates the IR to ARB_fragment_program text if possible, 3084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * printing the result 3184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */ 3284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 330161515c395c44233529c8d51f823b60050bc7baEric Anholt#include <stdio.h> 34261bbc011d11ab9e390cd5fe9f5151821eefaffaIan Romanick#include "main/compiler.h" 3584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "ir.h" 3684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "ir_visitor.h" 3784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "ir_print_visitor.h" 3884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "ir_expression_flattening.h" 3984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "glsl_types.h" 40364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt#include "glsl_parser_extras.h" 41364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt#include "../glsl/program.h" 42364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt#include "ir_optimization.h" 43364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt#include "ast.h" 4484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 45aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholtextern "C" { 460a1b54df7ac118722bb627c61cb322cb4e248aceEric Anholt#include "main/mtypes.h" 47658e25987fbec3b826f500baa6d4d936b9552b13Eric Anholt#include "main/shaderapi.h" 48afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "main/shaderobj.h" 49afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "main/uniforms.h" 50fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholt#include "program/hash_table.h" 51afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/prog_instruction.h" 52afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/prog_optimize.h" 53afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/prog_print.h" 54afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/program.h" 55afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/prog_uniform.h" 56afe125e0a18ac3886c45c7e6b02b122fb2d327b5Eric Anholt#include "program/prog_parameter.h" 57aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholt} 5884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 599c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholtstatic int swizzle_for_size(int size); 609c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt 61554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt/** 62554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * This struct is a corresponding struct to Mesa prog_src_register, with 63554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * wider fields. 64554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt */ 65554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholttypedef struct ir_to_mesa_src_reg { 669c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir_to_mesa_src_reg(int file, int index, const glsl_type *type) 679c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt { 689c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->file = file; 699c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->index = index; 709c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt if (type && (type->is_scalar() || type->is_vector() || type->is_matrix())) 719c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->swizzle = swizzle_for_size(type->vector_elements); 729c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt else 739c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->swizzle = SWIZZLE_XYZW; 749c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->negate = 0; 759c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->reladdr = NULL; 769c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt } 779c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt 789c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir_to_mesa_src_reg() 799c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt { 809c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->file = PROGRAM_UNDEFINED; 8148c289fb552a3d363b505514b6ea22467f00e318Vinson Lee this->index = 0; 8248c289fb552a3d363b505514b6ea22467f00e318Vinson Lee this->swizzle = 0; 8348c289fb552a3d363b505514b6ea22467f00e318Vinson Lee this->negate = 0; 8448c289fb552a3d363b505514b6ea22467f00e318Vinson Lee this->reladdr = NULL; 859c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt } 869c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt 87554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int file; /**< PROGRAM_* from Mesa */ 88554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */ 89582b73fe691ef7ea12a002cb2ae57505c3b1c21eEric Anholt GLuint swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */ 90554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int negate; /**< NEGATE_XYZW mask from mesa */ 91f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt /** Register index should be offset by the integer in this reg. */ 92f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_src_reg *reladdr; 93554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt} ir_to_mesa_src_reg; 94554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 95554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholttypedef struct ir_to_mesa_dst_reg { 96554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int file; /**< PROGRAM_* from Mesa */ 97554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */ 98554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int writemask; /**< Bitfield of WRITEMASK_[XYZW] */ 99854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt GLuint cond_mask:4; 100f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt /** Register index should be offset by the integer in this reg. */ 101f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_src_reg *reladdr; 102554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt} ir_to_mesa_dst_reg; 103554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 104554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtextern ir_to_mesa_src_reg ir_to_mesa_undef; 105554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 106554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtclass ir_to_mesa_instruction : public exec_node { 107554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtpublic: 1087406898441bfec937840d575500fb6d43192310dEric Anholt /* Callers of this talloc-based new need not call delete. It's 1097406898441bfec937840d575500fb6d43192310dEric Anholt * easier to just talloc_free 'ctx' (or any of its ancestors). */ 1107406898441bfec937840d575500fb6d43192310dEric Anholt static void* operator new(size_t size, void *ctx) 1117406898441bfec937840d575500fb6d43192310dEric Anholt { 1127406898441bfec937840d575500fb6d43192310dEric Anholt void *node; 1137406898441bfec937840d575500fb6d43192310dEric Anholt 1147406898441bfec937840d575500fb6d43192310dEric Anholt node = talloc_zero_size(ctx, size); 1157406898441bfec937840d575500fb6d43192310dEric Anholt assert(node != NULL); 1167406898441bfec937840d575500fb6d43192310dEric Anholt 1177406898441bfec937840d575500fb6d43192310dEric Anholt return node; 1187406898441bfec937840d575500fb6d43192310dEric Anholt } 1197406898441bfec937840d575500fb6d43192310dEric Anholt 120554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt enum prog_opcode op; 121554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_dst_reg dst_reg; 122554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src_reg[3]; 123554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /** Pointer to the ir source this tree came from for debugging */ 124554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_instruction *ir; 125854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt GLboolean cond_update; 126d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt int sampler; /**< sampler index */ 127d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt int tex_target; /**< One of TEXTURE_*_INDEX */ 128b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt GLboolean tex_shadow; 1297b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1307b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt class function_entry *function; /* Set on OPCODE_CAL or OPCODE_BGNSUB */ 131554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt}; 132554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 133b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholtclass variable_storage : public exec_node { 134554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtpublic: 135b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage(ir_variable *var, int file, int index) 136554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt : file(file), index(index), var(var) 137554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt { 138554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /* empty */ 139554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt } 140554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 141554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int file; 142554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int index; 143554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_variable *var; /* variable that maps to this, if any */ 144554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt}; 145554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 1467b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholtclass function_entry : public exec_node { 1477b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholtpublic: 1487b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_function_signature *sig; 1497b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1507b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /** 1517b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * identifier of this function signature used by the program. 1527b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * 1537b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * At the point that Mesa instructions for function calls are 1547b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * generated, we don't know the address of the first instruction of 1557b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * the function body. So we make the BranchTarget that is called a 1567b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * small integer and rewrite them during set_branchtargets(). 1577b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt */ 1587b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt int sig_id; 1597b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1607b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /** 1617b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * Pointer to first instruction of the function body. 1627b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * 1637b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * Set during function body emits after main() is processed. 1647b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt */ 1657b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_instruction *bgn_inst; 1667b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1677b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /** 1687b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * Index of the first instruction of the function body in actual 1697b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * Mesa IR. 1707b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * 1717b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt * Set after convertion from ir_to_mesa_instruction to prog_instruction. 1727b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt */ 1737b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt int inst; 1747b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1757b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /** Storage for the return value. */ 1767b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_src_reg return_reg; 1777b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt}; 1787b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 179554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtclass ir_to_mesa_visitor : public ir_visitor { 180554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholtpublic: 181554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_visitor(); 182fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholt ~ir_to_mesa_visitor(); 183554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 1847b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *current_function; 1857b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 186364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt GLcontext *ctx; 187364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt struct gl_program *prog; 188aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt struct gl_shader_program *shader_program; 1896d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri struct gl_shader_compiler_options *options; 190364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 191554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt int next_temp; 192a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt 193b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *find_variable_storage(ir_variable *var); 194554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 1957b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *get_function_signature(ir_function_signature *sig); 1967b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1978364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt ir_to_mesa_src_reg get_temp(const glsl_type *type); 198f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt void reladdr_to_temp(ir_instruction *ir, 199f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_src_reg *reg, int *num_reladdr); 200554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 201554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt struct ir_to_mesa_src_reg src_reg_for_float(float val); 202554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 203554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /** 204554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * \name Visit methods 205554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * 206554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * As typical for the visitor pattern, there must be one \c visit method for 207554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * each concrete subclass of \c ir_instruction. Virtual base classes within 208554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt * the hierarchy should not have \c visit methods. 209554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt */ 210554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /*@{*/ 211554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_variable *); 212554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_loop *); 213554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_loop_jump *); 214554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_function_signature *); 215554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_function *); 216554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_expression *); 217554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_swizzle *); 218554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_dereference_variable *); 219554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_dereference_array *); 220554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_dereference_record *); 221554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_assignment *); 222554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_constant *); 223554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_call *); 224554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_return *); 22516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void visit(ir_discard *); 226554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_texture *); 227554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt virtual void visit(ir_if *); 228554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /*@}*/ 229554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 230554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt struct ir_to_mesa_src_reg result; 231554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 232b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt /** List of variable_storage */ 233b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt exec_list variables; 234554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 2357b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /** List of function_entry */ 2367b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt exec_list function_signatures; 2377b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt int next_signature_id; 2387b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 239554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt /** List of ir_to_mesa_instruction */ 240554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt exec_list instructions; 241554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 242021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_instruction *ir_to_mesa_emit_op0(ir_instruction *ir, 243021222c6a872ca2eef770ebadb8754f659775204Eric Anholt enum prog_opcode op); 244021222c6a872ca2eef770ebadb8754f659775204Eric Anholt 245554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_instruction *ir_to_mesa_emit_op1(ir_instruction *ir, 246554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt enum prog_opcode op, 247554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_dst_reg dst, 248554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src0); 249554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 250554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_instruction *ir_to_mesa_emit_op2(ir_instruction *ir, 251554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt enum prog_opcode op, 252554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_dst_reg dst, 253554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src0, 254554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src1); 255554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 256554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_instruction *ir_to_mesa_emit_op3(ir_instruction *ir, 257554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt enum prog_opcode op, 258554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_dst_reg dst, 259554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src0, 260554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src1, 261554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src2); 262554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 263554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt void ir_to_mesa_emit_scalar_op1(ir_instruction *ir, 264554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt enum prog_opcode op, 265554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_dst_reg dst, 266554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt ir_to_mesa_src_reg src0); 2670ee7d80269bfab14683623b0c8fc12da43db8d78Eric Anholt 268904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt void ir_to_mesa_emit_scalar_op2(ir_instruction *ir, 269904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt enum prog_opcode op, 270904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_dst_reg dst, 271904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg src0, 272904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg src1); 273904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt 2743f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt GLboolean try_emit_mad(ir_expression *ir, 2753f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt int mul_operand); 2763f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 277aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt int get_sampler_uniform_value(ir_dereference *deref); 278d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 279364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt void *mem_ctx; 280554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt}; 281554dbcce77cc7eb38b786c77eee87a5f391b090bEric Anholt 2829c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholtir_to_mesa_src_reg ir_to_mesa_undef = ir_to_mesa_src_reg(PROGRAM_UNDEFINED, 0, NULL); 28384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 284c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholtir_to_mesa_dst_reg ir_to_mesa_undef_dst = { 285f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt PROGRAM_UNDEFINED, 0, SWIZZLE_NOOP, COND_TR, NULL, 286c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt}; 287c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2880161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_dst_reg ir_to_mesa_address_reg = { 289f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt PROGRAM_ADDRESS, 0, WRITEMASK_X, COND_TR, NULL 2900161515c395c44233529c8d51f823b60050bc7baEric Anholt}; 2910161515c395c44233529c8d51f823b60050bc7baEric Anholt 292500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholtstatic void fail_link(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3); 293500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt 294500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholtstatic void fail_link(struct gl_shader_program *prog, const char *fmt, ...) 295500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt { 296500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt va_list args; 297500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt va_start(args, fmt); 298500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt prog->InfoLog = talloc_vasprintf_append(prog->InfoLog, fmt, args); 299500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt va_end(args); 300500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt 301500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt prog->LinkStatus = GL_FALSE; 302500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt } 303500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt 3040161515c395c44233529c8d51f823b60050bc7baEric Anholtstatic int swizzle_for_size(int size) 3050161515c395c44233529c8d51f823b60050bc7baEric Anholt{ 3060161515c395c44233529c8d51f823b60050bc7baEric Anholt int size_swizzles[4] = { 3070161515c395c44233529c8d51f823b60050bc7baEric Anholt MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), 3080161515c395c44233529c8d51f823b60050bc7baEric Anholt MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), 3090161515c395c44233529c8d51f823b60050bc7baEric Anholt MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z), 3100161515c395c44233529c8d51f823b60050bc7baEric Anholt MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W), 3110161515c395c44233529c8d51f823b60050bc7baEric Anholt }; 3120161515c395c44233529c8d51f823b60050bc7baEric Anholt 3130161515c395c44233529c8d51f823b60050bc7baEric Anholt return size_swizzles[size - 1]; 3140161515c395c44233529c8d51f823b60050bc7baEric Anholt} 3150161515c395c44233529c8d51f823b60050bc7baEric Anholt 31684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction * 3170161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_visitor::ir_to_mesa_emit_op3(ir_instruction *ir, 3180161515c395c44233529c8d51f823b60050bc7baEric Anholt enum prog_opcode op, 3190161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_dst_reg dst, 3200161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src0, 3210161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src1, 3220161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src2) 32384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 324364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt ir_to_mesa_instruction *inst = new(mem_ctx) ir_to_mesa_instruction(); 325f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt int num_reladdr = 0; 326f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 327f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt /* If we have to do relative addressing, we want to load the ARL 328f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt * reg directly for one of the regs, and preload the other reladdr 329f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt * sources into temps. 330f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt */ 331f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt num_reladdr += dst.reladdr != NULL; 332f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt num_reladdr += src0.reladdr != NULL; 333f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt num_reladdr += src1.reladdr != NULL; 334f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt num_reladdr += src2.reladdr != NULL; 335f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 336f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt reladdr_to_temp(ir, &src2, &num_reladdr); 337f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt reladdr_to_temp(ir, &src1, &num_reladdr); 338f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt reladdr_to_temp(ir, &src0, &num_reladdr); 339f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 340f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt if (dst.reladdr) { 341f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg, 342f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt *dst.reladdr); 343f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 344f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt num_reladdr--; 345f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt } 346f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt assert(num_reladdr == 0); 34784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 34884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt inst->op = op; 34984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt inst->dst_reg = dst; 35084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt inst->src_reg[0] = src0; 35184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt inst->src_reg[1] = src1; 35284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt inst->src_reg[2] = src2; 353c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt inst->ir = ir; 35484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 3557b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt inst->function = NULL; 3567b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 3570161515c395c44233529c8d51f823b60050bc7baEric Anholt this->instructions.push_tail(inst); 35884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 35984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt return inst; 36084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 36184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 36284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 36384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction * 3640161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_visitor::ir_to_mesa_emit_op2(ir_instruction *ir, 3650161515c395c44233529c8d51f823b60050bc7baEric Anholt enum prog_opcode op, 3660161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_dst_reg dst, 3670161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src0, 3680161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src1) 36984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 3700161515c395c44233529c8d51f823b60050bc7baEric Anholt return ir_to_mesa_emit_op3(ir, op, dst, src0, src1, ir_to_mesa_undef); 37184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 37284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 37384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction * 3740161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_visitor::ir_to_mesa_emit_op1(ir_instruction *ir, 3750161515c395c44233529c8d51f823b60050bc7baEric Anholt enum prog_opcode op, 3760161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_dst_reg dst, 3770161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src0) 378bf9953335031b3de721245ec7a2986d0b4f70027Eric Anholt{ 3795a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick assert(dst.writemask != 0); 3800161515c395c44233529c8d51f823b60050bc7baEric Anholt return ir_to_mesa_emit_op3(ir, op, dst, 3810161515c395c44233529c8d51f823b60050bc7baEric Anholt src0, ir_to_mesa_undef, ir_to_mesa_undef); 382bf9953335031b3de721245ec7a2986d0b4f70027Eric Anholt} 383bf9953335031b3de721245ec7a2986d0b4f70027Eric Anholt 384021222c6a872ca2eef770ebadb8754f659775204Eric Anholtir_to_mesa_instruction * 385021222c6a872ca2eef770ebadb8754f659775204Eric Anholtir_to_mesa_visitor::ir_to_mesa_emit_op0(ir_instruction *ir, 386021222c6a872ca2eef770ebadb8754f659775204Eric Anholt enum prog_opcode op) 387021222c6a872ca2eef770ebadb8754f659775204Eric Anholt{ 388021222c6a872ca2eef770ebadb8754f659775204Eric Anholt return ir_to_mesa_emit_op3(ir, op, ir_to_mesa_undef_dst, 389021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_undef, 390021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_undef, 391021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_undef); 392021222c6a872ca2eef770ebadb8754f659775204Eric Anholt} 393021222c6a872ca2eef770ebadb8754f659775204Eric Anholt 3940161515c395c44233529c8d51f823b60050bc7baEric Anholtinline ir_to_mesa_dst_reg 3950161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg reg) 39684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 3970161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_dst_reg dst_reg; 39884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 3990161515c395c44233529c8d51f823b60050bc7baEric Anholt dst_reg.file = reg.file; 4000161515c395c44233529c8d51f823b60050bc7baEric Anholt dst_reg.index = reg.index; 4010161515c395c44233529c8d51f823b60050bc7baEric Anholt dst_reg.writemask = WRITEMASK_XYZW; 402854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt dst_reg.cond_mask = COND_TR; 403f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt dst_reg.reladdr = reg.reladdr; 4040161515c395c44233529c8d51f823b60050bc7baEric Anholt 4050161515c395c44233529c8d51f823b60050bc7baEric Anholt return dst_reg; 406bf9953335031b3de721245ec7a2986d0b4f70027Eric Anholt} 407bf9953335031b3de721245ec7a2986d0b4f70027Eric Anholt 4082d1789e667c4180777829f96856daf91326721b9Eric Anholtinline ir_to_mesa_src_reg 4092d1789e667c4180777829f96856daf91326721b9Eric Anholtir_to_mesa_src_reg_from_dst(ir_to_mesa_dst_reg reg) 4102d1789e667c4180777829f96856daf91326721b9Eric Anholt{ 4119c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt return ir_to_mesa_src_reg(reg.file, reg.index, NULL); 4122d1789e667c4180777829f96856daf91326721b9Eric Anholt} 4132d1789e667c4180777829f96856daf91326721b9Eric Anholt 41412f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt/** 41512f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * Emits Mesa scalar opcodes to produce unique answers across channels. 41612f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * 41712f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * Some Mesa opcodes are scalar-only, like ARB_fp/vp. The src X 41812f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * channel determines the result across all channels. So to do a vec4 41912f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * of this operation, we want to emit a scalar per source channel used 42012f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * to produce dest channels. 42112f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt */ 42212f654c63bc42d353e258cde989d9114cdde26c6Eric Anholtvoid 423904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholtir_to_mesa_visitor::ir_to_mesa_emit_scalar_op2(ir_instruction *ir, 4240161515c395c44233529c8d51f823b60050bc7baEric Anholt enum prog_opcode op, 4250161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_dst_reg dst, 426904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg orig_src0, 427904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg orig_src1) 42812f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt{ 42912f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt int i, j; 430315c638b8cf0a92f9f0a8ee496e77e90e4b66d09Eric Anholt int done_mask = ~dst.writemask; 43112f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt 43212f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt /* Mesa RCP is a scalar operation splatting results to all channels, 43312f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * like ARB_fp/vp. So emit as many RCPs as necessary to cover our 43412f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt * dst channels. 43512f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt */ 43612f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt for (i = 0; i < 4; i++) { 437582b73fe691ef7ea12a002cb2ae57505c3b1c21eEric Anholt GLuint this_mask = (1 << i); 43812f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt ir_to_mesa_instruction *inst; 439904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg src0 = orig_src0; 440904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg src1 = orig_src1; 44112f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt 44212f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt if (done_mask & this_mask) 44312f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt continue; 44412f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt 445904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt GLuint src0_swiz = GET_SWZ(src0.swizzle, i); 446904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt GLuint src1_swiz = GET_SWZ(src1.swizzle, i); 44712f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt for (j = i + 1; j < 4; j++) { 448904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt if (!(done_mask & (1 << j)) && 449904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt GET_SWZ(src0.swizzle, j) == src0_swiz && 450904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt GET_SWZ(src1.swizzle, j) == src1_swiz) { 45112f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt this_mask |= (1 << j); 45212f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt } 45312f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt } 454904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz, 455904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src0_swiz, src0_swiz); 456904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src1.swizzle = MAKE_SWIZZLE4(src1_swiz, src1_swiz, 457904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src1_swiz, src1_swiz); 45812f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt 459904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt inst = ir_to_mesa_emit_op2(ir, op, 4600161515c395c44233529c8d51f823b60050bc7baEric Anholt dst, 461904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src0, 462904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt src1); 46312f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt inst->dst_reg.writemask = this_mask; 46412f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt done_mask |= this_mask; 46512f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt } 46612f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt} 46712f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt 468904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholtvoid 469904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholtir_to_mesa_visitor::ir_to_mesa_emit_scalar_op1(ir_instruction *ir, 470904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt enum prog_opcode op, 471904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_dst_reg dst, 472904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_src_reg src0) 473904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt{ 47459a23d7fb93603b2449db4c5d786934a07aebfcbEric Anholt ir_to_mesa_src_reg undef = ir_to_mesa_undef; 475904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt 476904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt undef.swizzle = SWIZZLE_XXXX; 477904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt 478904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_emit_scalar_op2(ir, op, dst, src0, undef); 479904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt} 480904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt 4810161515c395c44233529c8d51f823b60050bc7baEric Anholtstruct ir_to_mesa_src_reg 4820161515c395c44233529c8d51f823b60050bc7baEric Anholtir_to_mesa_visitor::src_reg_for_float(float val) 483b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt{ 4849c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir_to_mesa_src_reg src_reg(PROGRAM_CONSTANT, -1, NULL); 4851d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt 486582b73fe691ef7ea12a002cb2ae57505c3b1c21eEric Anholt src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters, 487582b73fe691ef7ea12a002cb2ae57505c3b1c21eEric Anholt &val, 1, &src_reg.swizzle); 4881d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt 4890161515c395c44233529c8d51f823b60050bc7baEric Anholt return src_reg; 4901d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt} 4911d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt 4922c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholtstatic int 4932c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholttype_size(const struct glsl_type *type) 4942c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt{ 4952c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt unsigned int i; 4962c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt int size; 4972c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt 4982c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt switch (type->base_type) { 4992c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_UINT: 5002c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_INT: 5012c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_FLOAT: 5022c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_BOOL: 503a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt if (type->is_matrix()) { 5049968f1b23c475c99139f0209c7a049ed00df01afEric Anholt return type->matrix_columns; 505a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt } else { 506a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt /* Regardless of size of vector, it gets a vec4. This is bad 507a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt * packing for things like floats, but otherwise arrays become a 508a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt * mess. Hopefully a later pass over the code can pack scalars 509a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt * down if appropriate. 510a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt */ 511a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt return 1; 512a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt } 5132c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_ARRAY: 5142c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt return type_size(type->fields.array) * type->length; 5152c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt case GLSL_TYPE_STRUCT: 5162c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt size = 0; 5172c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt for (i = 0; i < type->length; i++) { 5182c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt size += type_size(type->fields.structure[i].type); 5192c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt } 5202c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt return size; 5218d61a23b1a1d0d4b21f0fab64f6d863a8ee3d7f1Eric Anholt case GLSL_TYPE_SAMPLER: 5220924ba0c3496160a134d37cec800f902ae805b9cEric Anholt /* Samplers take up one slot in UNIFORMS[], but they're baked in 5230924ba0c3496160a134d37cec800f902ae805b9cEric Anholt * at link time. 5248d61a23b1a1d0d4b21f0fab64f6d863a8ee3d7f1Eric Anholt */ 5250924ba0c3496160a134d37cec800f902ae805b9cEric Anholt return 1; 5262c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt default: 5272c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt assert(0); 52819acfa42ed47edb63f5ec3de8051a3102e62e96bJosé Fonseca return 0; 5292c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt } 5302c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt} 5312c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt 532d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt/** 533d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt * In the initial pass of codegen, we assign temporary numbers to 534d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt * intermediate results. (not SSA -- variable assignments will reuse 535d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt * storage). Actual register allocation for the Mesa VM occurs in a 536d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt * pass over the Mesa IR later. 537d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt */ 538d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholtir_to_mesa_src_reg 539d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholtir_to_mesa_visitor::get_temp(const glsl_type *type) 540d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt{ 541d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt ir_to_mesa_src_reg src_reg; 542d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt int swizzle[4]; 543d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt int i; 544d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt 545d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt src_reg.file = PROGRAM_TEMPORARY; 546d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt src_reg.index = next_temp; 547f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt src_reg.reladdr = NULL; 548d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt next_temp += type_size(type); 549d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt 55020c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt if (type->is_array() || type->is_record()) { 55120c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt src_reg.swizzle = SWIZZLE_NOOP; 55220c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt } else { 55320c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt for (i = 0; i < type->vector_elements; i++) 55420c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt swizzle[i] = i; 55520c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt for (; i < 4; i++) 55620c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt swizzle[i] = type->vector_elements - 1; 55720c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1], 55820c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt swizzle[2], swizzle[3]); 55920c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt } 560ea6b34cce4471d6239201101a3b24db17eaae870Eric Anholt src_reg.negate = 0; 561d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt 562d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt return src_reg; 563d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt} 564d5a5df45a4af93bb845483bdeeae7c8e042b03d8Eric Anholt 565b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholtvariable_storage * 566a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholtir_to_mesa_visitor::find_variable_storage(ir_variable *var) 56784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 568a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt 569b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *entry; 57084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 571b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt foreach_iter(exec_list_iterator, iter, this->variables) { 572b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt entry = (variable_storage *)iter.get(); 57384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 5740161515c395c44233529c8d51f823b60050bc7baEric Anholt if (entry->var == var) 575a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt return entry; 57684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 57784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 578a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt return NULL; 579a9b619bb3b96a90d14650771dedaf1db840d70a6Eric Anholt} 58084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 5816c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstruct statevar_element { 5826c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt const char *field; 5836c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt int tokens[STATE_LENGTH]; 5846c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt int swizzle; 5856c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt bool array_indexed; 5866c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 5876c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 5886c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_DepthRange_elements[] = { 5896c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX}, 5906c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY}, 5916c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ}, 5926c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 5936c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 5946c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_ClipPlane_elements[] = { 5956c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW} 5966c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 5976c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 5986c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_Point_elements[] = { 5996c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX}, 6006c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY}, 6016c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ}, 6026c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW}, 6036c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX}, 6046c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY}, 6056c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ}, 6066c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6076c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6086c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_FrontMaterial_elements[] = { 6096c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"emission", {STATE_MATERIAL, 0, STATE_EMISSION}, SWIZZLE_XYZW}, 6106c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_MATERIAL, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, 6116c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diffuse", {STATE_MATERIAL, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, 6126c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"specular", {STATE_MATERIAL, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, 6136c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"shininess", {STATE_MATERIAL, 0, STATE_SHININESS}, SWIZZLE_XXXX}, 6146c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6156c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6166c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_BackMaterial_elements[] = { 6176c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"emission", {STATE_MATERIAL, 1, STATE_EMISSION}, SWIZZLE_XYZW}, 6186c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_MATERIAL, 1, STATE_AMBIENT}, SWIZZLE_XYZW}, 6196c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diffuse", {STATE_MATERIAL, 1, STATE_DIFFUSE}, SWIZZLE_XYZW}, 6206c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"specular", {STATE_MATERIAL, 1, STATE_SPECULAR}, SWIZZLE_XYZW}, 6216c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"shininess", {STATE_MATERIAL, 1, STATE_SHININESS}, SWIZZLE_XXXX}, 6226c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6236c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6246c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_LightSource_elements[] = { 6256c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, 6266c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, 6276c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, 6286c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW}, 6296c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW}, 6306c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_XYZW}, 6316c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW}, 6326c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX}, 6336c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW}, 6346c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX}, 6356c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY}, 6366c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ}, 6376c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6386c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6396c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_LightModel_elements[] = { 6406c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW}, 6416c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6426c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6436c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_FrontLightModelProduct_elements[] = { 6446c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW}, 6456c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6466c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6476c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_BackLightModelProduct_elements[] = { 6486c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW}, 6496c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6506c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6516c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_FrontLightProduct_elements[] = { 6526c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_LIGHTPROD, 0, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, 6536c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diffuse", {STATE_LIGHTPROD, 0, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, 6546c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"specular", {STATE_LIGHTPROD, 0, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, 6556c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6566c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6576c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_BackLightProduct_elements[] = { 6586c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"ambient", {STATE_LIGHTPROD, 0, 1, STATE_AMBIENT}, SWIZZLE_XYZW}, 6596c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"diffuse", {STATE_LIGHTPROD, 0, 1, STATE_DIFFUSE}, SWIZZLE_XYZW}, 6606c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"specular", {STATE_LIGHTPROD, 0, 1, STATE_SPECULAR}, SWIZZLE_XYZW}, 6616c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6626c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6636c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_TextureEnvColor_elements[] = { 6646c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW}, 6656c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6666c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6676c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_EyePlaneS_elements[] = { 6686c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW}, 6696c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6706c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6716c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_EyePlaneT_elements[] = { 6726c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW}, 6736c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6746c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6756c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_EyePlaneR_elements[] = { 6766c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW}, 6776c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6786c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6796c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_EyePlaneQ_elements[] = { 6806c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW}, 6816c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6826c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6836c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_ObjectPlaneS_elements[] = { 6846c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW}, 6856c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6866c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6876c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_ObjectPlaneT_elements[] = { 6886c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW}, 6896c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6906c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6916c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_ObjectPlaneR_elements[] = { 6926c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW}, 6936c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6946c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6956c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_ObjectPlaneQ_elements[] = { 6966c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW}, 6976c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 6986c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 6996c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_Fog_elements[] = { 7006c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW}, 7016c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX}, 7026c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY}, 7036c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ}, 7046c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW}, 7056c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 7066c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7074a867be14378587574b3082071e9fff962d28d12Eric Anholtstatic struct statevar_element gl_NormalScale_elements[] = { 7084a867be14378587574b3082071e9fff962d28d12Eric Anholt {NULL, {STATE_NORMAL_SCALE}, SWIZZLE_XXXX}, 7094a867be14378587574b3082071e9fff962d28d12Eric Anholt}; 7104a867be14378587574b3082071e9fff962d28d12Eric Anholt 7116c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt#define MATRIX(name, statevar, modifier) \ 7126c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt static struct statevar_element name ## _elements[] = { \ 7136c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW }, \ 7146c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { statevar, 0, 1, 1, modifier}, SWIZZLE_XYZW }, \ 7156c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { statevar, 0, 2, 2, modifier}, SWIZZLE_XYZW }, \ 7166c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { statevar, 0, 3, 3, modifier}, SWIZZLE_XYZW }, \ 7176c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 7186c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7196c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewMatrix, 7206c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE); 7216c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewMatrixInverse, 7226c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS); 7236c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewMatrixTranspose, 7246c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MODELVIEW_MATRIX, 0); 7256c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewMatrixInverseTranspose, 7266c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE); 7276c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7286c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ProjectionMatrix, 7296c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE); 7306c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ProjectionMatrixInverse, 7316c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS); 7326c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ProjectionMatrixTranspose, 7336c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_PROJECTION_MATRIX, 0); 7346c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ProjectionMatrixInverseTranspose, 7356c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE); 7366c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7376c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewProjectionMatrix, 7386c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE); 7396c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewProjectionMatrixInverse, 7406c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS); 7416c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewProjectionMatrixTranspose, 7426c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MVP_MATRIX, 0); 7436c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_ModelViewProjectionMatrixInverseTranspose, 7446c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_MVP_MATRIX, STATE_MATRIX_INVERSE); 7456c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7466c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_TextureMatrix, 7476c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE); 7486c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_TextureMatrixInverse, 7496c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS); 7506c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_TextureMatrixTranspose, 7516c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_TEXTURE_MATRIX, 0); 7526c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric AnholtMATRIX(gl_TextureMatrixInverseTranspose, 7536c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE); 7546c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7556c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic struct statevar_element gl_NormalMatrix_elements[] = { 7566c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { STATE_MODELVIEW_MATRIX, 0, 0, 0, STATE_MATRIX_INVERSE}, 7576c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt SWIZZLE_XYZW }, 7586c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { STATE_MODELVIEW_MATRIX, 0, 1, 1, STATE_MATRIX_INVERSE}, 7596c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt SWIZZLE_XYZW }, 7606c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt { NULL, { STATE_MODELVIEW_MATRIX, 0, 2, 2, STATE_MATRIX_INVERSE}, 7616c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt SWIZZLE_XYZW }, 7626c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 7636c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7646c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt#undef MATRIX 7656c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7666c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt#define STATEVAR(name) {#name, name ## _elements, Elements(name ## _elements)} 7676c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7686c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholtstatic const struct statevar { 7696c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt const char *name; 7706c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt struct statevar_element *elements; 7716c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt unsigned int num_elements; 7726c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt} statevars[] = { 7736c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_DepthRange), 7746c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ClipPlane), 7756c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_Point), 7766c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_FrontMaterial), 7776c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_BackMaterial), 7786c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_LightSource), 7796c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_LightModel), 7806c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_FrontLightModelProduct), 7816c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_BackLightModelProduct), 7826c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_FrontLightProduct), 7836c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_BackLightProduct), 7846c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_TextureEnvColor), 7856c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_EyePlaneS), 7866c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_EyePlaneT), 7876c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_EyePlaneR), 7886c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_EyePlaneQ), 7896c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ObjectPlaneS), 7906c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ObjectPlaneT), 7916c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ObjectPlaneR), 7926c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ObjectPlaneQ), 7936c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_Fog), 7946c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 7956c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewMatrix), 7966c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewMatrixInverse), 7976c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewMatrixTranspose), 7986c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewMatrixInverseTranspose), 7996c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8006c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ProjectionMatrix), 8016c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ProjectionMatrixInverse), 8026c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ProjectionMatrixTranspose), 8036c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ProjectionMatrixInverseTranspose), 8046c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8056c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewProjectionMatrix), 8066c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewProjectionMatrixInverse), 8076c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewProjectionMatrixTranspose), 8086c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose), 8096c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8106c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_TextureMatrix), 8116c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_TextureMatrixInverse), 8126c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_TextureMatrixTranspose), 8136c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_TextureMatrixInverseTranspose), 8146c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8156c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt STATEVAR(gl_NormalMatrix), 8164a867be14378587574b3082071e9fff962d28d12Eric Anholt STATEVAR(gl_NormalScale), 8176c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt}; 8186c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 81984771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 82084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_variable *ir) 82184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 8224a962170d7cf4243d6ae156fca20a6167388925dEric Anholt if (strcmp(ir->name, "gl_FragCoord") == 0) { 8234a962170d7cf4243d6ae156fca20a6167388925dEric Anholt struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog; 8244a962170d7cf4243d6ae156fca20a6167388925dEric Anholt 8254a962170d7cf4243d6ae156fca20a6167388925dEric Anholt fp->OriginUpperLeft = ir->origin_upper_left; 8264a962170d7cf4243d6ae156fca20a6167388925dEric Anholt fp->PixelCenterInteger = ir->pixel_center_integer; 8274a962170d7cf4243d6ae156fca20a6167388925dEric Anholt } 8286c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8296c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (ir->mode == ir_var_uniform && strncmp(ir->name, "gl_", 3) == 0) { 8306c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt unsigned int i; 8316c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8326c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt for (i = 0; i < Elements(statevars); i++) { 8336c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (strcmp(ir->name, statevars[i].name) == 0) 8346c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt break; 8356c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8366c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8376c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (i == Elements(statevars)) { 8386c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt fail_link(this->shader_program, 8396c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt "Failed to find builtin uniform `%s'\n", ir->name); 8406c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt return; 8416c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8426c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8436c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt const struct statevar *statevar = &statevars[i]; 8446c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8456c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt int array_count; 8466c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (ir->type->is_array()) { 8476c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt array_count = ir->type->length; 8486c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } else { 8496c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt array_count = 1; 8506c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8516c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8526c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt /* Check if this statevar's setup in the STATE file exactly 8536c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt * matches how we'll want to reference it as a 8546c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt * struct/array/whatever. If not, then we need to move it into 8556c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt * temporary storage and hope that it'll get copy-propagated 8566c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt * out. 8576c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt */ 8586c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt for (i = 0; i < statevar->num_elements; i++) { 8596c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (statevar->elements[i].swizzle != SWIZZLE_XYZW) { 8606c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt break; 8616c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8626c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8636c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8646c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt struct variable_storage *storage; 8656c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt ir_to_mesa_dst_reg dst; 8666c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (i == statevar->num_elements) { 8676c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt /* We'll set the index later. */ 8686c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1); 8696c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt this->variables.push_tail(storage); 8706c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8716c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt dst = ir_to_mesa_undef_dst; 8726c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } else { 8736c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt storage = new(mem_ctx) variable_storage(ir, PROGRAM_TEMPORARY, 8746c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt this->next_temp); 8756c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt this->variables.push_tail(storage); 8766c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt this->next_temp += type_size(ir->type); 8776c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8786c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt dst = ir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg(PROGRAM_TEMPORARY, 8796c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt storage->index, 8806c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt NULL)); 8816c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8826c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8836c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8846c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt for (int a = 0; a < array_count; a++) { 8856c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt for (unsigned int i = 0; i < statevar->num_elements; i++) { 8866c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt struct statevar_element *element = &statevar->elements[i]; 8876c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt int tokens[STATE_LENGTH]; 8886c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8896c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt memcpy(tokens, element->tokens, sizeof(element->tokens)); 8906c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (ir->type->is_array()) { 8916c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt tokens[1] = a; 8926c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 8936c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8946c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt int index = _mesa_add_state_reference(this->prog->Parameters, 8956c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt (gl_state_index *)tokens); 8966c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt 8976c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (storage->file == PROGRAM_STATE_VAR) { 8986c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (storage->index == -1) { 8996c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt storage->index = index; 9006c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } else { 901acd7c21541110d7ae6b9e63647391f65946e5c5dEric Anholt assert(index == ((int)storage->index + 9026c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt a * statevar->num_elements + i)); 9036c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 9046c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } else { 9056c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt ir_to_mesa_src_reg src(PROGRAM_STATE_VAR, index, NULL); 9066c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt src.swizzle = element->swizzle; 9076c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, dst, src); 9086c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt /* even a float takes up a whole vec4 reg in a struct/array. */ 9096c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt dst.index++; 9106c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 9116c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 9126c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 9136c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt if (storage->file == PROGRAM_TEMPORARY && 9146c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt dst.index != storage->index + type_size(ir->type)) { 9156c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt fail_link(this->shader_program, 9166c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt "failed to load builtin uniform `%s' (%d/%d regs loaded)\n", 9176c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt ir->name, dst.index - storage->index, 9186c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt type_size(ir->type)); 9196c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 9206c0ba32fd1466e8c1700acab3003dc1fe1deb337Eric Anholt } 92184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 92284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 92384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 92484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_loop *ir) 92584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 9260f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_dereference_variable *counter = NULL; 9270f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9280f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if (ir->counter != NULL) 9290f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick counter = new(ir) ir_dereference_variable(ir->counter); 9300f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9310f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if (ir->from != NULL) { 9320f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick assert(ir->counter != NULL); 9330f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9340f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_assignment *a = new(ir) ir_assignment(counter, ir->from, NULL); 9350f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9360f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick a->accept(this); 9370f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete a; 9380f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick } 93984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 940021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_emit_op0(NULL, OPCODE_BGNLOOP); 9410f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9420f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if (ir->to) { 9430f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_expression *e = 9440f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick new(ir) ir_expression(ir->cmp, glsl_type::bool_type, 9450f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick counter, ir->to); 9460f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_if *if_stmt = new(ir) ir_if(e); 9470f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9480f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_loop_jump *brk = new(ir) ir_loop_jump(ir_loop_jump::jump_break); 9490f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9500f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if_stmt->then_instructions.push_tail(brk); 9510f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9520f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if_stmt->accept(this); 9530f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9540f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete if_stmt; 9550f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete e; 9560f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete brk; 9570f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick } 9580f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 95964fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt visit_exec_list(&ir->body_instructions, this); 9600f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9610f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick if (ir->increment) { 9620f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_expression *e = 9630f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick new(ir) ir_expression(ir_binop_add, counter->type, 9640f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick counter, ir->increment); 9650f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9660f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick ir_assignment *a = new(ir) ir_assignment(counter, e, NULL); 9670f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 9680f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick a->accept(this); 9690f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete a; 9700f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick delete e; 9710f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick } 9720f4f8c73644a9cc436500d605413207c44cfb4eeIan Romanick 973021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_emit_op0(NULL, OPCODE_ENDLOOP); 97484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 97584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 97684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 97784771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_loop_jump *ir) 97884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 97964fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt switch (ir->mode) { 98064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case ir_loop_jump::jump_break: 981021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_emit_op0(NULL, OPCODE_BRK); 98264fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 98364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case ir_loop_jump::jump_continue: 984021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_emit_op0(NULL, OPCODE_CONT); 98564fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 98664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt } 98784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 98884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 98984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 99084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 99184771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_function_signature *ir) 99284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 99384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt assert(0); 99484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt (void)ir; 99584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 99684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 99784771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 99884771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_function *ir) 99984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 100084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt /* Ignore function bodies other than main() -- we shouldn't see calls to 100184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * them since they should all be inlined before we get to ir_to_mesa. 100284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */ 100384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt if (strcmp(ir->name, "main") == 0) { 100484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt const ir_function_signature *sig; 100584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt exec_list empty; 100684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 100784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt sig = ir->matching_signature(&empty); 100884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 100984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt assert(sig); 101084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 101184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt foreach_iter(exec_list_iterator, iter, sig->body) { 101284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir_instruction *ir = (ir_instruction *)iter.get(); 101384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 101484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->accept(this); 101584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 101684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 101784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 101884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 10193f08989267d9cdd944787fcf7a300c6f1f84462cEric AnholtGLboolean 10203f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholtir_to_mesa_visitor::try_emit_mad(ir_expression *ir, int mul_operand) 10213f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt{ 10223f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt int nonmul_operand = 1 - mul_operand; 10233f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt ir_to_mesa_src_reg a, b, c; 10243f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 10253f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt ir_expression *expr = ir->operands[mul_operand]->as_expression(); 10263f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt if (!expr || expr->operation != ir_binop_mul) 10273f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt return false; 10283f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 10293f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt expr->operands[0]->accept(this); 10303f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt a = this->result; 10313f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt expr->operands[1]->accept(this); 10323f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt b = this->result; 10333f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt ir->operands[nonmul_operand]->accept(this); 10343f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt c = this->result; 10353f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 10363f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt this->result = get_temp(ir->type); 10373f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt ir_to_mesa_emit_op3(ir, OPCODE_MAD, 10383f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt ir_to_mesa_dst_reg_from_src(this->result), a, b, c); 10393f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 10403f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt return true; 10413f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt} 10423f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 104384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 1044f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholtir_to_mesa_visitor::reladdr_to_temp(ir_instruction *ir, 1045f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_src_reg *reg, int *num_reladdr) 1046f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt{ 1047f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt if (!reg->reladdr) 1048f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt return; 1049f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 1050f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg, *reg->reladdr); 1051f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 1052f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt if (*num_reladdr != 1) { 1053f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type); 1054f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 1055f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, 1056f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt ir_to_mesa_dst_reg_from_src(temp), *reg); 1057f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt *reg = temp; 1058f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt } 1059f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 1060f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt (*num_reladdr)--; 1061f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt} 1062f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 1063f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholtvoid 106484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_expression *ir) 106584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 106684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt unsigned int operand; 1067f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt struct ir_to_mesa_src_reg op[2]; 10680161515c395c44233529c8d51f823b60050bc7baEric Anholt struct ir_to_mesa_src_reg result_src; 10690161515c395c44233529c8d51f823b60050bc7baEric Anholt struct ir_to_mesa_dst_reg result_dst; 107084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt const glsl_type *vec4_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, 4, 1); 107184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt const glsl_type *vec3_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, 3, 1); 107284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt const glsl_type *vec2_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, 2, 1); 107384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 10743f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt /* Quick peephole: Emit OPCODE_MAD(a, b, c) instead of ADD(MUL(a, b), c) 10753f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt */ 10763f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt if (ir->operation == ir_binop_add) { 10773f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt if (try_emit_mad(ir, 1)) 10783f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt return; 10793f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt if (try_emit_mad(ir, 0)) 10803f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt return; 10813f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt } 10823f08989267d9cdd944787fcf7a300c6f1f84462cEric Anholt 108384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt for (operand = 0; operand < ir->get_num_operands(); operand++) { 10840161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result.file = PROGRAM_UNDEFINED; 108584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->operands[operand]->accept(this); 10860161515c395c44233529c8d51f823b60050bc7baEric Anholt if (this->result.file == PROGRAM_UNDEFINED) { 108784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir_print_visitor v; 108884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt printf("Failed to get tree for expression operand:\n"); 108984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->operands[operand]->accept(&v); 109084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt exit(1); 109184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 109284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt op[operand] = this->result; 10938364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt 10944ca07882afad656bf0a0f56b68038ce556bceec4Eric Anholt /* Matrix expression operands should have been broken down to vector 10954ca07882afad656bf0a0f56b68038ce556bceec4Eric Anholt * operations already. 10964ca07882afad656bf0a0f56b68038ce556bceec4Eric Anholt */ 10974ca07882afad656bf0a0f56b68038ce556bceec4Eric Anholt assert(!ir->operands[operand]->type->is_matrix()); 109884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 109984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 11000161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result.file = PROGRAM_UNDEFINED; 11010161515c395c44233529c8d51f823b60050bc7baEric Anholt 11020161515c395c44233529c8d51f823b60050bc7baEric Anholt /* Storage for our result. Ideally for an assignment we'd be using 11030161515c395c44233529c8d51f823b60050bc7baEric Anholt * the actual storage for the result here, instead. 11040161515c395c44233529c8d51f823b60050bc7baEric Anholt */ 11058364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt result_src = get_temp(ir->type); 11060161515c395c44233529c8d51f823b60050bc7baEric Anholt /* convenience for the emit functions below. */ 11070161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst = ir_to_mesa_dst_reg_from_src(result_src); 11089cd8cad9f3dc4774366193acbfc5ab22198096e7Eric Anholt /* Limit writes to the channels that will be used by result_src later. 11099cd8cad9f3dc4774366193acbfc5ab22198096e7Eric Anholt * This does limit this temp's use as a temporary for multi-instruction 11109cd8cad9f3dc4774366193acbfc5ab22198096e7Eric Anholt * sequences. 11119cd8cad9f3dc4774366193acbfc5ab22198096e7Eric Anholt */ 11129cd8cad9f3dc4774366193acbfc5ab22198096e7Eric Anholt result_dst.writemask = (1 << ir->type->vector_elements) - 1; 111384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 111484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt switch (ir->operation) { 11151d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt case ir_unop_logic_not: 1116f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, 1117f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt op[0], src_reg_for_float(0.0)); 11181d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt break; 1119c45b615a379e5b9cbcf951f9d738a1be77a5964bEric Anholt case ir_unop_neg: 11200161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0].negate = ~op[0].negate; 11210161515c395c44233529c8d51f823b60050bc7baEric Anholt result_src = op[0]; 1122c45b615a379e5b9cbcf951f9d738a1be77a5964bEric Anholt break; 1123524745bc55dd23c612aebdb545125727bfb16e4dEric Anholt case ir_unop_abs: 1124524745bc55dd23c612aebdb545125727bfb16e4dEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_ABS, result_dst, op[0]); 1125524745bc55dd23c612aebdb545125727bfb16e4dEric Anholt break; 11263acd92a91f3e799b9f839a074f4d76a0e88d71feEric Anholt case ir_unop_sign: 11273acd92a91f3e799b9f839a074f4d76a0e88d71feEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_SSG, result_dst, op[0]); 11283acd92a91f3e799b9f839a074f4d76a0e88d71feEric Anholt break; 11298761fcc2bf964d26c70229c712ce446dbe504ab7Eric Anholt case ir_unop_rcp: 11308761fcc2bf964d26c70229c712ce446dbe504ab7Eric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_RCP, result_dst, op[0]); 11318761fcc2bf964d26c70229c712ce446dbe504ab7Eric Anholt break; 1132524745bc55dd23c612aebdb545125727bfb16e4dEric Anholt 11338c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt case ir_unop_exp2: 11340161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_EX2, result_dst, op[0]); 11358c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt break; 1136bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt case ir_unop_exp: 11378c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt case ir_unop_log: 1138bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt assert(!"not reached: should be handled by ir_explog_to_explog2"); 11398c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt break; 11408c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt case ir_unop_log2: 11410161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_LG2, result_dst, op[0]); 11428c29a1d84d738cfddf16d5f013876ee2cca96a81Eric Anholt break; 11433c5979565facebc82000a611b991d2977b8e9bbfEric Anholt case ir_unop_sin: 11440161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_SIN, result_dst, op[0]); 11453c5979565facebc82000a611b991d2977b8e9bbfEric Anholt break; 11463c5979565facebc82000a611b991d2977b8e9bbfEric Anholt case ir_unop_cos: 11470161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_COS, result_dst, op[0]); 11483c5979565facebc82000a611b991d2977b8e9bbfEric Anholt break; 1149ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt 1150ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt case ir_unop_dFdx: 1151ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_DDX, result_dst, op[0]); 1152ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt break; 1153ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt case ir_unop_dFdy: 1154ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_DDY, result_dst, op[0]); 1155ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt break; 1156ba9bd708cb3480817e18cc47e57d83a4e4c305bbEric Anholt 11573a5ce85cfa4914711e56c8cf831699242618928eIan Romanick case ir_unop_noise: { 11583a5ce85cfa4914711e56c8cf831699242618928eIan Romanick const enum prog_opcode opcode = 11593a5ce85cfa4914711e56c8cf831699242618928eIan Romanick prog_opcode(OPCODE_NOISE1 11603a5ce85cfa4914711e56c8cf831699242618928eIan Romanick + (ir->operands[0]->type->vector_elements) - 1); 11613a5ce85cfa4914711e56c8cf831699242618928eIan Romanick assert((opcode >= OPCODE_NOISE1) && (opcode <= OPCODE_NOISE4)); 11623a5ce85cfa4914711e56c8cf831699242618928eIan Romanick 11633a5ce85cfa4914711e56c8cf831699242618928eIan Romanick ir_to_mesa_emit_op1(ir, opcode, result_dst, op[0]); 11643a5ce85cfa4914711e56c8cf831699242618928eIan Romanick break; 11653a5ce85cfa4914711e56c8cf831699242618928eIan Romanick } 11663a5ce85cfa4914711e56c8cf831699242618928eIan Romanick 116784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_binop_add: 11687b48843ecd6690902e4f3bd709a041133b7fb540Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_ADD, result_dst, op[0], op[1]); 116984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 117084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_binop_sub: 11717b48843ecd6690902e4f3bd709a041133b7fb540Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]); 117284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 11739b68b88e43c424439d425534ef280ee7a9406a1bEric Anholt 117484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_binop_mul: 11754ca07882afad656bf0a0f56b68038ce556bceec4Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, op[0], op[1]); 117684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 117784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_binop_div: 11789a0e421983edc31371440c08687fa2bb2207924dEric Anholt assert(!"not reached: should be handled by ir_div_to_mul_rcp"); 1179411fb36b7cee223e090b4b9ef9bc14e058201a68Eric Anholt case ir_binop_mod: 1180411fb36b7cee223e090b4b9ef9bc14e058201a68Eric Anholt assert(!"ir_binop_mod should have been converted to b * fract(a/b)"); 1181411fb36b7cee223e090b4b9ef9bc14e058201a68Eric Anholt break; 118238315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt 118338315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_less: 1184f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SLT, result_dst, op[0], op[1]); 118538315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 118638315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_greater: 1187f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SGT, result_dst, op[0], op[1]); 118838315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 118938315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_lequal: 1190f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SLE, result_dst, op[0], op[1]); 119138315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 119238315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_gequal: 1193f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SGE, result_dst, op[0], op[1]); 119438315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 119538315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_equal: 11966992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt /* "==" operator producing a scalar boolean. */ 11976992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt if (ir->operands[0]->type->is_vector() || 11986992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir->operands[1]->type->is_vector()) { 11996992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type); 12006992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, 12016992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]); 12026992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP4, result_dst, temp, temp); 12036992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SEQ, 12046992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt result_dst, result_src, src_reg_for_float(0.0)); 12056992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt } else { 12066992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, op[0], op[1]); 12076992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt } 120838315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 120938315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt case ir_binop_nequal: 12106992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt /* "!=" operator producing a scalar boolean. */ 12116992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt if (ir->operands[0]->type->is_vector() || 12126992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir->operands[1]->type->is_vector()) { 12136992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type); 12146992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, 12156992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]); 12166992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP4, result_dst, temp, temp); 12176992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, 12186992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt result_dst, result_src, src_reg_for_float(0.0)); 12196992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt } else { 12206992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]); 12216992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt } 12226992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt break; 12235e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt 12245e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt case ir_unop_any: 12255e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt switch (ir->operands[0]->type->vector_elements) { 12265e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt case 4: 12275e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP4, result_dst, op[0], op[0]); 12285e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 12295e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt case 3: 12305e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP3, result_dst, op[0], op[0]); 12315e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 12325e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt case 2: 12335e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP2, result_dst, op[0], op[0]); 12345e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 12355e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt default: 12365e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt assert(!"unreached: ir_unop_any of non-bvec"); 12375e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 12385e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt } 12395e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, 12405e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt result_dst, result_src, src_reg_for_float(0.0)); 12415e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 12425e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt 12436992c3c3739dad249e8c396057d5cbeedcdf91deEric Anholt case ir_binop_logic_xor: 1244f4bd7f262e43301158f059af90176a476ffdbf60Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]); 124538315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt break; 124638315079571512dc5b502d9522d7a8c3eaf2cc8fEric Anholt 12474380099c98119611ceee684669d00be26195c7d7Eric Anholt case ir_binop_logic_or: 12480161515c395c44233529c8d51f823b60050bc7baEric Anholt /* This could be a saturated add and skip the SNE. */ 12490161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_ADD, 12500161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12510161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0], op[1]); 12520161515c395c44233529c8d51f823b60050bc7baEric Anholt 12530161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, 12540161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12550161515c395c44233529c8d51f823b60050bc7baEric Anholt result_src, src_reg_for_float(0.0)); 12564380099c98119611ceee684669d00be26195c7d7Eric Anholt break; 12574380099c98119611ceee684669d00be26195c7d7Eric Anholt 12584380099c98119611ceee684669d00be26195c7d7Eric Anholt case ir_binop_logic_and: 12594380099c98119611ceee684669d00be26195c7d7Eric Anholt /* the bool args are stored as float 0.0 or 1.0, so "mul" gives us "and". */ 12600161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MUL, 12610161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12620161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0], op[1]); 12634380099c98119611ceee684669d00be26195c7d7Eric Anholt break; 12644380099c98119611ceee684669d00be26195c7d7Eric Anholt 126584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_binop_dot: 126684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt if (ir->operands[0]->type == vec4_type) { 126784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt assert(ir->operands[1]->type == vec4_type); 12680161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP4, 12690161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12700161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0], op[1]); 127184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } else if (ir->operands[0]->type == vec3_type) { 127284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt assert(ir->operands[1]->type == vec3_type); 12730161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP3, 12740161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12750161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0], op[1]); 127684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } else if (ir->operands[0]->type == vec2_type) { 127784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt assert(ir->operands[1]->type == vec2_type); 12780161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_DP2, 12790161515c395c44233529c8d51f823b60050bc7baEric Anholt result_dst, 12800161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0], op[1]); 128184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 128284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 12839be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt 12849be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt case ir_binop_cross: 12859be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_XPD, result_dst, op[0], op[1]); 12869be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt break; 12879be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt 128884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case ir_unop_sqrt: 12894f189b3bf57a6500953dac49105f160af5fa6468Marek Olšák /* sqrt(x) = x * rsq(x). */ 12900161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]); 12914f189b3bf57a6500953dac49105f160af5fa6468Marek Olšák ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, result_src, op[0]); 1292c9039fdb167865547dc9b3828d69b99209344999Brian Paul /* For incoming channels <= 0, set the result to 0. */ 1293c9039fdb167865547dc9b3828d69b99209344999Brian Paul op[0].negate = ~op[0].negate; 12948f62ad6d0ff3c11808739c74441f82f6f12485d6Eric Anholt ir_to_mesa_emit_op3(ir, OPCODE_CMP, result_dst, 1295c9039fdb167865547dc9b3828d69b99209344999Brian Paul op[0], result_src, src_reg_for_float(0.0)); 129684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 1297878740bedf418e5bf42ed6d350c938d29abaaf25Eric Anholt case ir_unop_rsq: 12980161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]); 1299878740bedf418e5bf42ed6d350c938d29abaaf25Eric Anholt break; 130050ad96ebce6ea19b414a02d2d45f0b0c73586abfEric Anholt case ir_unop_i2f: 1301d6ebe9b16b25f25ba763baf3738addc50676d5d0Eric Anholt case ir_unop_b2f: 1302d6ebe9b16b25f25ba763baf3738addc50676d5d0Eric Anholt case ir_unop_b2i: 1303423a75c5d607a33cb5fe76a0a9c903cccc645fa7Eric Anholt /* Mesa IR lacks types, ints are stored as truncated floats. */ 13040161515c395c44233529c8d51f823b60050bc7baEric Anholt result_src = op[0]; 130550ad96ebce6ea19b414a02d2d45f0b0c73586abfEric Anholt break; 1306423a75c5d607a33cb5fe76a0a9c903cccc645fa7Eric Anholt case ir_unop_f2i: 13070161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]); 1308423a75c5d607a33cb5fe76a0a9c903cccc645fa7Eric Anholt break; 13091d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt case ir_unop_f2b: 1310411fb36b7cee223e090b4b9ef9bc14e058201a68Eric Anholt case ir_unop_i2b: 13110161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, 131266afcb560771b6ba6ad668156e9f442e86b9a7a2Eric Anholt op[0], src_reg_for_float(0.0)); 13131d20862c8a0e100e43458f01217c047c76da05f3Eric Anholt break; 1314c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt case ir_unop_trunc: 13150161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]); 1316c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt break; 1317c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt case ir_unop_ceil: 13180161515c395c44233529c8d51f823b60050bc7baEric Anholt op[0].negate = ~op[0].negate; 13190161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]); 13200161515c395c44233529c8d51f823b60050bc7baEric Anholt result_src.negate = ~result_src.negate; 1321c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt break; 1322c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt case ir_unop_floor: 13230161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]); 1324c2014f03e8d6b7e21e2d0c31270ced04e1025653Eric Anholt break; 1325d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt case ir_unop_fract: 1326d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_FRC, result_dst, op[0]); 1327d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt break; 1328d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt 1329c23c6c773a5c79b458e52ff42bd9f431c87d4036Eric Anholt case ir_binop_min: 13300161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MIN, result_dst, op[0], op[1]); 1331c23c6c773a5c79b458e52ff42bd9f431c87d4036Eric Anholt break; 1332c23c6c773a5c79b458e52ff42bd9f431c87d4036Eric Anholt case ir_binop_max: 13330161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MAX, result_dst, op[0], op[1]); 1334c23c6c773a5c79b458e52ff42bd9f431c87d4036Eric Anholt break; 1335904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt case ir_binop_pow: 1336904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt ir_to_mesa_emit_scalar_op2(ir, OPCODE_POW, result_dst, op[0], op[1]); 1337904b5bfe9986a297dc71fe081ce0f2661d43b00bEric Anholt break; 1338e64a4aaacbc682f24180dff3627b84861844476dEric Anholt 1339e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_unop_bit_not: 1340e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_unop_u2f: 1341e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_binop_lshift: 1342e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_binop_rshift: 1343e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_binop_bit_and: 1344e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_binop_bit_xor: 1345e64a4aaacbc682f24180dff3627b84861844476dEric Anholt case ir_binop_bit_or: 1346e64a4aaacbc682f24180dff3627b84861844476dEric Anholt assert(!"GLSL 1.30 features unsupported"); 1347e64a4aaacbc682f24180dff3627b84861844476dEric Anholt break; 134884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 1349b2ed4dd7b0270e469302965269007292117d02e2Eric Anholt 13500161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result = result_src; 135184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 135284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 135384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 135484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 135584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_swizzle *ir) 135684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 13570161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src_reg; 135884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt int i; 135984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt int swizzle[4]; 136084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 1361b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt /* Note that this is only swizzles in expressions, not those on the left 1362b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt * hand side of an assignment, which do write masking. See ir_assignment 1363b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt * for that. 1364b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt */ 136584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 136684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->val->accept(this); 13674006424f5b5b3b189209faf03f2335f45c22b148Eric Anholt src_reg = this->result; 13684006424f5b5b3b189209faf03f2335f45c22b148Eric Anholt assert(src_reg.file != PROGRAM_UNDEFINED); 136984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 137084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt for (i = 0; i < 4; i++) { 137184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt if (i < ir->type->vector_elements) { 137284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt switch (i) { 137384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case 0: 1374698b84444343189357ad252856d3c5493e47e4faEric Anholt swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.x); 137584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 137684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case 1: 1377698b84444343189357ad252856d3c5493e47e4faEric Anholt swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.y); 137884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 137984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case 2: 1380698b84444343189357ad252856d3c5493e47e4faEric Anholt swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.z); 138184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 138284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt case 3: 1383698b84444343189357ad252856d3c5493e47e4faEric Anholt swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.w); 138484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt break; 138584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 138684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } else { 138784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt /* If the type is smaller than a vec4, replicate the last 138884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * channel out. 138984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */ 1390698b84444343189357ad252856d3c5493e47e4faEric Anholt swizzle[i] = swizzle[ir->type->vector_elements - 1]; 139184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 139284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 139384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 13940161515c395c44233529c8d51f823b60050bc7baEric Anholt src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], 13950161515c395c44233529c8d51f823b60050bc7baEric Anholt swizzle[1], 13960161515c395c44233529c8d51f823b60050bc7baEric Anholt swizzle[2], 13970161515c395c44233529c8d51f823b60050bc7baEric Anholt swizzle[3]); 139884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 13990161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result = src_reg; 140084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 140184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 140284771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 140384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_dereference_variable *ir) 140484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 1405b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *entry = find_variable_storage(ir->var); 140684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 14078364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt if (!entry) { 14088364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt switch (ir->var->mode) { 14098364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt case ir_var_uniform: 14100924ba0c3496160a134d37cec800f902ae805b9cEric Anholt entry = new(mem_ctx) variable_storage(ir->var, PROGRAM_UNIFORM, 14110924ba0c3496160a134d37cec800f902ae805b9cEric Anholt ir->var->location); 1412b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt this->variables.push_tail(entry); 14138364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt break; 14148364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt case ir_var_in: 14158364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt case ir_var_out: 14168364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt case ir_var_inout: 1417a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt /* The linker assigns locations for varyings and attributes, 1418a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt * including deprecated builtins (like gl_Color), user-assign 1419a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt * generic attributes (glBindVertexLocation), and 1420a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt * user-defined varyings. 1421a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt * 1422a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt * FINISHME: We would hit this path for function arguments. Fix! 1423f9ffccb06bcc90c862f20f8849b824022fbeebbfEric Anholt */ 1424f9ffccb06bcc90c862f20f8849b824022fbeebbfEric Anholt assert(ir->var->location != -1); 1425a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt if (ir->var->mode == ir_var_in || 1426a0b3b9302978ab6d4db62f0c9b2b313ebc7ed0b4Eric Anholt ir->var->mode == ir_var_inout) { 1427b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt entry = new(mem_ctx) variable_storage(ir->var, 1428b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt PROGRAM_INPUT, 1429b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt ir->var->location); 1430edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt 1431edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt if (this->prog->Target == GL_VERTEX_PROGRAM_ARB && 1432edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt ir->var->location >= VERT_ATTRIB_GENERIC0) { 1433edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt _mesa_add_attribute(prog->Attributes, 1434edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt ir->var->name, 1435658e25987fbec3b826f500baa6d4d936b9552b13Eric Anholt _mesa_sizeof_glsl_type(ir->var->type->gl_type), 1436edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt ir->var->type->gl_type, 1437c64da87611823b4b53e93188f861f748a69936a3Eric Anholt ir->var->location - VERT_ATTRIB_GENERIC0); 1438edcb9c2b062693a5974aa74725f6259023fff794Eric Anholt } 1439f9ffccb06bcc90c862f20f8849b824022fbeebbfEric Anholt } else { 1440b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt entry = new(mem_ctx) variable_storage(ir->var, 1441b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt PROGRAM_OUTPUT, 1442b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt ir->var->location); 1443f9ffccb06bcc90c862f20f8849b824022fbeebbfEric Anholt } 1444f9ffccb06bcc90c862f20f8849b824022fbeebbfEric Anholt 14458364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt break; 14468364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt case ir_var_auto: 14477e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick case ir_var_temporary: 1448b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt entry = new(mem_ctx) variable_storage(ir->var, PROGRAM_TEMPORARY, 1449b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt this->next_temp); 1450b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt this->variables.push_tail(entry); 1451224f712950494730c76b48864f2ca19acde1c8cfEric Anholt 14528364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt next_temp += type_size(ir->var->type); 14538364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt break; 145484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 14558364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt 14568364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt if (!entry) { 14578364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt printf("Failed to make storage for %s\n", ir->var->name); 14588364fc85b8273b4d0f2ecebe7e0085e250d29990Eric Anholt exit(1); 1459224f712950494730c76b48864f2ca19acde1c8cfEric Anholt } 146084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 146184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 14629c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->result = ir_to_mesa_src_reg(entry->file, entry->index, ir->var->type); 146384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 146484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 146584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 146684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_dereference_array *ir) 146784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 1468ab386f18b045fe260112bd9a239cb503e737c1dbEric Anholt ir_constant *index; 14690161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src_reg; 14708258a6a2c36c9769428f4525415d6c0d565e588cEric Anholt int element_size = type_size(ir->type); 1471ab386f18b045fe260112bd9a239cb503e737c1dbEric Anholt 1472ab386f18b045fe260112bd9a239cb503e737c1dbEric Anholt index = ir->array_index->constant_expression_value(); 14734e5e0f018baedb2d0aa0e1f43efe339da16a09c6Eric Anholt 1474ab386f18b045fe260112bd9a239cb503e737c1dbEric Anholt ir->array->accept(this); 14750161515c395c44233529c8d51f823b60050bc7baEric Anholt src_reg = this->result; 14764e5e0f018baedb2d0aa0e1f43efe339da16a09c6Eric Anholt 14774d5da50b94115d055ba8d0ff8717054582665384Eric Anholt if (index) { 14784d5da50b94115d055ba8d0ff8717054582665384Eric Anholt src_reg.index += index->value.i[0] * element_size; 14794e5e0f018baedb2d0aa0e1f43efe339da16a09c6Eric Anholt } else { 14804d5da50b94115d055ba8d0ff8717054582665384Eric Anholt ir_to_mesa_src_reg array_base = this->result; 14814d5da50b94115d055ba8d0ff8717054582665384Eric Anholt /* Variable index array dereference. It eats the "vec4" of the 14824d5da50b94115d055ba8d0ff8717054582665384Eric Anholt * base of the array and an index that offsets the Mesa register 14834d5da50b94115d055ba8d0ff8717054582665384Eric Anholt * index. 14844d5da50b94115d055ba8d0ff8717054582665384Eric Anholt */ 14854d5da50b94115d055ba8d0ff8717054582665384Eric Anholt ir->array_index->accept(this); 14868258a6a2c36c9769428f4525415d6c0d565e588cEric Anholt 14874d5da50b94115d055ba8d0ff8717054582665384Eric Anholt ir_to_mesa_src_reg index_reg; 14888258a6a2c36c9769428f4525415d6c0d565e588cEric Anholt 14894d5da50b94115d055ba8d0ff8717054582665384Eric Anholt if (element_size == 1) { 14904d5da50b94115d055ba8d0ff8717054582665384Eric Anholt index_reg = this->result; 14914d5da50b94115d055ba8d0ff8717054582665384Eric Anholt } else { 14924d5da50b94115d055ba8d0ff8717054582665384Eric Anholt index_reg = get_temp(glsl_type::float_type); 1493f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt 14944d5da50b94115d055ba8d0ff8717054582665384Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MUL, 14954d5da50b94115d055ba8d0ff8717054582665384Eric Anholt ir_to_mesa_dst_reg_from_src(index_reg), 14964d5da50b94115d055ba8d0ff8717054582665384Eric Anholt this->result, src_reg_for_float(element_size)); 1497bdbd9f112e2832eeddce8fc4f70f11005bbe4027Eric Anholt } 14984d5da50b94115d055ba8d0ff8717054582665384Eric Anholt 14994d5da50b94115d055ba8d0ff8717054582665384Eric Anholt src_reg.reladdr = talloc(mem_ctx, ir_to_mesa_src_reg); 15004d5da50b94115d055ba8d0ff8717054582665384Eric Anholt memcpy(src_reg.reladdr, &index_reg, sizeof(index_reg)); 15014e5e0f018baedb2d0aa0e1f43efe339da16a09c6Eric Anholt } 150284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 150384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt /* If the type is smaller than a vec4, replicate the last channel out. */ 150485e93da18ca2c967ca12870b62ab1aac2f0b880cEric Anholt if (ir->type->is_scalar() || ir->type->is_vector()) 150585e93da18ca2c967ca12870b62ab1aac2f0b880cEric Anholt src_reg.swizzle = swizzle_for_size(ir->type->vector_elements); 150685e93da18ca2c967ca12870b62ab1aac2f0b880cEric Anholt else 150785e93da18ca2c967ca12870b62ab1aac2f0b880cEric Anholt src_reg.swizzle = SWIZZLE_NOOP; 150884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 15090161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result = src_reg; 151084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 151184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 15122c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholtvoid 15132c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholtir_to_mesa_visitor::visit(ir_dereference_record *ir) 15142c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt{ 15152c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt unsigned int i; 15160161515c395c44233529c8d51f823b60050bc7baEric Anholt const glsl_type *struct_type = ir->record->type; 15172c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt int offset = 0; 15182c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt 15190161515c395c44233529c8d51f823b60050bc7baEric Anholt ir->record->accept(this); 15202c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt 15212c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt for (i = 0; i < struct_type->length; i++) { 15220161515c395c44233529c8d51f823b60050bc7baEric Anholt if (strcmp(struct_type->fields.structure[i].name, ir->field) == 0) 15232c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt break; 15242c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt offset += type_size(struct_type->fields.structure[i].type); 15252c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt } 152685e93da18ca2c967ca12870b62ab1aac2f0b880cEric Anholt this->result.swizzle = swizzle_for_size(ir->type->vector_elements); 15270161515c395c44233529c8d51f823b60050bc7baEric Anholt this->result.index += offset; 15282c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt} 15292c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt 15302c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt/** 15312c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt * We want to be careful in assignment setup to hit the actual storage 15322c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt * instead of potentially using a temporary like we might with the 15332c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt * ir_dereference handler. 15342c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt */ 15350161515c395c44233529c8d51f823b60050bc7baEric Anholtstatic struct ir_to_mesa_dst_reg 1536fc63e37b971b641dfdff000ba353c4810414c20eIan Romanickget_assignment_lhs(ir_dereference *ir, ir_to_mesa_visitor *v) 1537b07cc372c6360d0e59c84bb7586597f028c74b02Eric Anholt{ 15385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /* The LHS must be a dereference. If the LHS is a variable indexed array 15395a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * access of a vector, it must be separated into a series conditional moves 15405a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * before reaching this point (see ir_vec_index_to_cond_assign). 15415a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 15425a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick assert(ir->as_dereference()); 1543ea2a03f0a5b8b58ea88ecb607664ea50c9d6e96eEric Anholt ir_dereference_array *deref_array = ir->as_dereference_array(); 1544ea2a03f0a5b8b58ea88ecb607664ea50c9d6e96eEric Anholt if (deref_array) { 1545ea2a03f0a5b8b58ea88ecb607664ea50c9d6e96eEric Anholt assert(!deref_array->array->type->is_vector()); 1546ea2a03f0a5b8b58ea88ecb607664ea50c9d6e96eEric Anholt } 1547ea2a03f0a5b8b58ea88ecb607664ea50c9d6e96eEric Anholt 15480161515c395c44233529c8d51f823b60050bc7baEric Anholt /* Use the rvalue deref handler for the most part. We'll ignore 15490161515c395c44233529c8d51f823b60050bc7baEric Anholt * swizzles in it and write swizzles using writemask, though. 15500161515c395c44233529c8d51f823b60050bc7baEric Anholt */ 15512c432637d0960aa522ccd09416ba1d8a65c6988bEric Anholt ir->accept(v); 15525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick return ir_to_mesa_dst_reg_from_src(v->result); 1553cab95c228b12f0fc568164d57475c561c8d6053eEric Anholt} 1554cab95c228b12f0fc568164d57475c561c8d6053eEric Anholt 155584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 155684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_assignment *ir) 155784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 15580161515c395c44233529c8d51f823b60050bc7baEric Anholt struct ir_to_mesa_dst_reg l; 15590161515c395c44233529c8d51f823b60050bc7baEric Anholt struct ir_to_mesa_src_reg r; 15607d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt int i; 156184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 156284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->rhs->accept(this); 156384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt r = this->result; 1564cab95c228b12f0fc568164d57475c561c8d6053eEric Anholt 1565fc63e37b971b641dfdff000ba353c4810414c20eIan Romanick l = get_assignment_lhs(ir->lhs, this); 1566cab95c228b12f0fc568164d57475c561c8d6053eEric Anholt 15675a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /* FINISHME: This should really set to the correct maximal writemask for each 15685a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * FINISHME: component written (in the loops below). This case can only 15695a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * FINISHME: occur for matrices, arrays, and structures. 15705a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 15715a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick if (ir->write_mask == 0) { 15725a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick assert(!ir->lhs->type->is_scalar() && !ir->lhs->type->is_vector()); 15735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick l.writemask = WRITEMASK_XYZW; 15745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick } else if (ir->lhs->type->is_scalar()) { 15755a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /* FINISHME: This hack makes writing to gl_FragData, which lives in the 15765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * FINISHME: W component of fragment shader output zero, work correctly. 15775a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 15785a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick l.writemask = WRITEMASK_XYZW; 15795a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick } else { 15805a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick assert(ir->lhs->type->is_vector()); 15815a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick l.writemask = ir->write_mask; 15825a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick } 15835a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 15840161515c395c44233529c8d51f823b60050bc7baEric Anholt assert(l.file != PROGRAM_UNDEFINED); 15850161515c395c44233529c8d51f823b60050bc7baEric Anholt assert(r.file != PROGRAM_UNDEFINED); 158684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 1587346daeca07d3c19c051799f96fa9f442262bd49fEric Anholt if (ir->condition) { 15882d1789e667c4180777829f96856daf91326721b9Eric Anholt ir_to_mesa_src_reg condition; 15892d1789e667c4180777829f96856daf91326721b9Eric Anholt 15902d1789e667c4180777829f96856daf91326721b9Eric Anholt ir->condition->accept(this); 15912d1789e667c4180777829f96856daf91326721b9Eric Anholt condition = this->result; 15922d1789e667c4180777829f96856daf91326721b9Eric Anholt 15932d1789e667c4180777829f96856daf91326721b9Eric Anholt /* We use the OPCODE_CMP (a < 0 ? b : c) for conditional moves, 15942d1789e667c4180777829f96856daf91326721b9Eric Anholt * and the condition we produced is 0.0 or 1.0. By flipping the 15952d1789e667c4180777829f96856daf91326721b9Eric Anholt * sign, we can choose which value OPCODE_CMP produces without 15962d1789e667c4180777829f96856daf91326721b9Eric Anholt * an extra computing the condition. 15972d1789e667c4180777829f96856daf91326721b9Eric Anholt */ 15982d1789e667c4180777829f96856daf91326721b9Eric Anholt condition.negate = ~condition.negate; 15997d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt for (i = 0; i < type_size(ir->lhs->type); i++) { 16007d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt ir_to_mesa_emit_op3(ir, OPCODE_CMP, l, 16017d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt condition, r, ir_to_mesa_src_reg_from_dst(l)); 16027d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt l.index++; 16037d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt r.index++; 16047d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt } 16052d1789e667c4180777829f96856daf91326721b9Eric Anholt } else { 16067d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt for (i = 0; i < type_size(ir->lhs->type); i++) { 16077d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r); 16087d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt l.index++; 16097d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt r.index++; 16107d8091f7cca0314dd66599bdce5bfcf09fe8b578Eric Anholt } 1611346daeca07d3c19c051799f96fa9f442262bd49fEric Anholt } 161284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 161384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 161484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 161584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 161684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_constant *ir) 161784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 16180161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_src_reg src_reg; 16190a46497a4ee3325fab47929cb17cfe2525e1fc33Vinson Lee GLfloat stack_vals[4] = { 0 }; 16200bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt GLfloat *values = stack_vals; 16210bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt unsigned int i; 162284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 16235b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt /* Unfortunately, 4 floats is all we can get into 16245b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt * _mesa_add_unnamed_constant. So, make a temp to store an 16255b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt * aggregate constant and move each constant value into it. If we 16265b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt * get lucky, copy propagation will eliminate the extra moves. 16275b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt */ 16285b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16295b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt if (ir->type->base_type == GLSL_TYPE_STRUCT) { 16305b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt ir_to_mesa_src_reg temp_base = get_temp(ir->type); 16315b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base); 16325b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16335b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt foreach_iter(exec_list_iterator, iter, ir->components) { 16345b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt ir_constant *field_value = (ir_constant *)iter.get(); 16355b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt int size = type_size(field_value->type); 16365b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16375b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt assert(size > 0); 16385b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16395b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt field_value->accept(this); 16405b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt src_reg = this->result; 16415b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16425b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt for (i = 0; i < (unsigned int)size; i++) { 16435b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg); 16445b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 16455b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt src_reg.index++; 16465b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt temp.index++; 16475b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt } 16485b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt } 16495b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt this->result = temp_base; 16505b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt return; 16515b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt } 16525b6890a388d554f06880e88d61c73dcd62c5f141Eric Anholt 165320c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt if (ir->type->is_array()) { 165420c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt ir_to_mesa_src_reg temp_base = get_temp(ir->type); 165520c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base); 165620c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt int size = type_size(ir->type->fields.array); 165720c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt 165820c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt assert(size > 0); 165920c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt 166020c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt for (i = 0; i < ir->type->length; i++) { 166120c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt ir->array_elements[i]->accept(this); 166220c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt src_reg = this->result; 166320c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt for (int j = 0; j < size; j++) { 166420c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg); 166520c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt 166620c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt src_reg.index++; 166720c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt temp.index++; 166820c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt } 166920c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt } 167020c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt this->result = temp_base; 167120c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt return; 167220c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt } 167320c074ae28b310348a6a1920ad0ddf1e5cbb7a46Eric Anholt 1674ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt if (ir->type->is_matrix()) { 1675c91809e1e4a4fa8884e6588159368ea32431ee0eEric Anholt ir_to_mesa_src_reg mat = get_temp(ir->type); 1676ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt ir_to_mesa_dst_reg mat_column = ir_to_mesa_dst_reg_from_src(mat); 1677ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt 1678ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt for (i = 0; i < ir->type->matrix_columns; i++) { 1679ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt assert(ir->type->base_type == GLSL_TYPE_FLOAT); 1680ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt values = &ir->value.f[i * ir->type->vector_elements]; 1681ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt 16829c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt src_reg = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, NULL); 1683ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters, 16849c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt values, 16859c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir->type->vector_elements, 16869c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt &src_reg.swizzle); 1687ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, mat_column, src_reg); 1688ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt 1689ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt mat_column.index++; 1690ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt } 1691ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt 1692ffd24b0a6844871eed0c78608431e2f82d5615e1Eric Anholt this->result = mat; 1693ebef04011736ea8e13692fed87623d425c4d1b08Eric Anholt return; 1694582b73fe691ef7ea12a002cb2ae57505c3b1c21eEric Anholt } 16950bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt 16960bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt src_reg.file = PROGRAM_CONSTANT; 16970bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt switch (ir->type->base_type) { 16980bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt case GLSL_TYPE_FLOAT: 16990bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt values = &ir->value.f[0]; 17000bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt break; 17010bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt case GLSL_TYPE_UINT: 17020bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt for (i = 0; i < ir->type->vector_elements; i++) { 17030bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt values[i] = ir->value.u[i]; 17040bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt } 17050bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt break; 17060bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt case GLSL_TYPE_INT: 17070bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt for (i = 0; i < ir->type->vector_elements; i++) { 17080bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt values[i] = ir->value.i[i]; 17090bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt } 17100bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt break; 17110bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt case GLSL_TYPE_BOOL: 17120bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt for (i = 0; i < ir->type->vector_elements; i++) { 17130bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt values[i] = ir->value.b[i]; 17140bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt } 17150bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt break; 17160bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt default: 17170bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt assert(!"Non-float/uint/int/bool constant"); 17180bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt } 17190bef5b97a9eccebc4b59dff42b2863770da770feEric Anholt 17209c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->result = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, ir->type); 17219c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt this->result.index = _mesa_add_unnamed_constant(this->prog->Parameters, 17229c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt values, 17239c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir->type->vector_elements, 17249c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt &this->result.swizzle); 172584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 172684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 17277b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholtfunction_entry * 17287b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholtir_to_mesa_visitor::get_function_signature(ir_function_signature *sig) 17297b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt{ 17307b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *entry; 17317b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17327b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, this->function_signatures) { 17337b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry = (function_entry *)iter.get(); 17347b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17357b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (entry->sig == sig) 17367b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt return entry; 17377b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 17387b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17397b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry = talloc(mem_ctx, function_entry); 17407b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->sig = sig; 17417b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->sig_id = this->next_signature_id++; 17427b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->bgn_inst = NULL; 17437b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17447b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Allocate storage for all the parameters. */ 17457b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, sig->parameters) { 17467b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_variable *param = (ir_variable *)iter.get(); 1747b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *storage; 17487b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17497b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt storage = find_variable_storage(param); 17507b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt assert(!storage); 17517b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1752b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt storage = new(mem_ctx) variable_storage(param, PROGRAM_TEMPORARY, 1753b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt this->next_temp); 1754b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt this->variables.push_tail(storage); 17557b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17567b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt this->next_temp += type_size(param->type); 17577b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 17587b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 1759576d01ad8c8b8aa57b4711c98d8e004d4f20fc0bEric Anholt if (!sig->return_type->is_void()) { 17607b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->return_reg = get_temp(sig->return_type); 17617b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } else { 17627b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->return_reg = ir_to_mesa_undef; 17637b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 17647b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17657b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt this->function_signatures.push_tail(entry); 17667b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt return entry; 17677b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt} 176884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 176984771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 177084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_call *ir) 177184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 17727b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_instruction *call_inst; 17737b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_function_signature *sig = ir->get_callee(); 17747b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *entry = get_function_signature(sig); 17757b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt int i; 17767b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17777b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Process in parameters. */ 17787b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt exec_list_iterator sig_iter = sig->parameters.iterator(); 17797b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, *ir) { 17807b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_rvalue *param_rval = (ir_rvalue *)iter.get(); 17817b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_variable *param = (ir_variable *)sig_iter.get(); 17827b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17837b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (param->mode == ir_var_in || 17847b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt param->mode == ir_var_inout) { 1785b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *storage = find_variable_storage(param); 17867b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt assert(storage); 17877b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17887b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt param_rval->accept(this); 17897b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_src_reg r = this->result; 17907b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17917b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_dst_reg l; 17927b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.file = storage->file; 17937b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.index = storage->index; 17947b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.reladdr = NULL; 17957b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.writemask = WRITEMASK_XYZW; 17967b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.cond_mask = COND_TR; 17977b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 17987b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt for (i = 0; i < type_size(param->type); i++) { 17997b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r); 18007b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.index++; 18017b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.index++; 18027b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18037b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18047b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18057b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt sig_iter.next(); 18067b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18077b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt assert(!sig_iter.has_next()); 18087b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18097b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Emit call instruction */ 18107b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt call_inst = ir_to_mesa_emit_op1(ir, OPCODE_CAL, 18117b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_undef_dst, ir_to_mesa_undef); 18127b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt call_inst->function = entry; 18137b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18147b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Process out parameters. */ 18157b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt sig_iter = sig->parameters.iterator(); 18167b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, *ir) { 18177b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_rvalue *param_rval = (ir_rvalue *)iter.get(); 18187b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_variable *param = (ir_variable *)sig_iter.get(); 18197b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18207b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (param->mode == ir_var_out || 18217b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt param->mode == ir_var_inout) { 1822b29d31cd67a423995b5673fdeedea82dfa12ec3cEric Anholt variable_storage *storage = find_variable_storage(param); 18237b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt assert(storage); 18247b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18257b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_src_reg r; 18267b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.file = storage->file; 18277b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.index = storage->index; 18287b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.reladdr = NULL; 18297b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.swizzle = SWIZZLE_NOOP; 18307b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.negate = 0; 18317b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18327b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt param_rval->accept(this); 18337b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_dst_reg l = ir_to_mesa_dst_reg_from_src(this->result); 18347b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18357b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt for (i = 0; i < type_size(param->type); i++) { 18367b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r); 18377b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.index++; 18387b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.index++; 18397b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18407b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18417b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18427b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt sig_iter.next(); 18437b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 18447b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt assert(!sig_iter.has_next()); 18457b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 18467b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Process return value. */ 18477b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt this->result = entry->return_reg; 184884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 184984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 1850aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholtclass get_sampler_name : public ir_hierarchical_visitor 1851aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt{ 1852aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholtpublic: 1853aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt get_sampler_name(ir_to_mesa_visitor *mesa, ir_dereference *last) 1854aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt { 1855aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->mem_ctx = mesa->mem_ctx; 1856aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->mesa = mesa; 1857aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->name = NULL; 1858aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->offset = 0; 1859aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->last = last; 1860aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1861aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1862aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt virtual ir_visitor_status visit(ir_dereference_variable *ir) 1863aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt { 1864aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->name = ir->var->name; 1865aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt return visit_continue; 1866aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1867aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1868aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt virtual ir_visitor_status visit_leave(ir_dereference_record *ir) 1869aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt { 1870aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->name = talloc_asprintf(mem_ctx, "%s.%s", name, ir->field); 1871aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt return visit_continue; 1872aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1873aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1874aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt virtual ir_visitor_status visit_leave(ir_dereference_array *ir) 1875aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt { 1876aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt ir_constant *index = ir->array_index->as_constant(); 1877aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt int i; 1878aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1879aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (index) { 1880aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt i = index->value.i[0]; 1881aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } else { 1882aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt /* GLSL 1.10 and 1.20 allowed variable sampler array indices, 1883aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * while GLSL 1.30 requires that the array indices be 1884aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * constant integer expressions. We don't expect any driver 1885aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * to actually work with a really variable array index, so 1886aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * all that would work would be an unrolled loop counter that ends 1887aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * up being constant above. 1888aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt */ 1889aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt mesa->shader_program->InfoLog = 1890aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt talloc_asprintf_append(mesa->shader_program->InfoLog, 1891aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt "warning: Variable sampler array index " 1892aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt "unsupported.\nThis feature of the language " 1893aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt "was removed in GLSL 1.20 and is unlikely " 1894aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt "to be supported for 1.10 in Mesa.\n"); 1895aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt i = 0; 1896aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1897aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (ir != last) { 1898aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt this->name = talloc_asprintf(mem_ctx, "%s[%d]", name, i); 1899aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } else { 1900aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt offset = i; 1901aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1902aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt return visit_continue; 1903aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1904aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1905aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt ir_to_mesa_visitor *mesa; 1906aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt const char *name; 1907aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt void *mem_ctx; 1908aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt int offset; 1909aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt ir_dereference *last; 1910aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt}; 1911aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1912aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholtint 1913aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholtir_to_mesa_visitor::get_sampler_uniform_value(ir_dereference *sampler) 1914aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt{ 1915aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt get_sampler_name getname(this, sampler); 1916aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1917aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt sampler->accept(&getname); 1918aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1919aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt GLint index = _mesa_lookup_parameter_index(prog->Parameters, -1, 1920aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt getname.name); 1921aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1922aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (index < 0) { 1923500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt fail_link(this->shader_program, 1924500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt "failed to find sampler named %s.\n", getname.name); 1925aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt return 0; 1926aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 1927aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1928aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt index += getname.offset; 1929aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 1930aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt return this->prog->Parameters->ParameterValues[index][0]; 1931aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt} 193284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 193384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 193484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_texture *ir) 193584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 19369c02412cdc0270f2b0dc64afe709721e049fd5b0Eric Anholt ir_to_mesa_src_reg result_src, coord, lod_info, projector; 1937d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_dst_reg result_dst, coord_dst; 1938d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt ir_to_mesa_instruction *inst = NULL; 1939d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt prog_opcode opcode = OPCODE_NOP; 194084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 194184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir->coordinate->accept(this); 1942d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 1943d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt /* Put our coords in a temp. We'll need to modify them for shadow, 1944d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt * projection, or LOD, so the only case we'd use it as is is if 1945d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt * we're doing plain old texturing. Mesa IR optimization should 1946d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt * handle cleaning up our mess in that case. 1947d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt */ 1948d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord = get_temp(glsl_type::vec4_type); 1949d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst = ir_to_mesa_dst_reg_from_src(coord); 1950d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, 1951d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt this->result); 1952d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 1953de75dfac4ea2cad64dc91f6ac16fe205b5015af6Eric Anholt if (ir->projector) { 1954de75dfac4ea2cad64dc91f6ac16fe205b5015af6Eric Anholt ir->projector->accept(this); 1955de75dfac4ea2cad64dc91f6ac16fe205b5015af6Eric Anholt projector = this->result; 1956de75dfac4ea2cad64dc91f6ac16fe205b5015af6Eric Anholt } 1957de75dfac4ea2cad64dc91f6ac16fe205b5015af6Eric Anholt 1958d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt /* Storage for our result. Ideally for an assignment we'd be using 1959d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt * the actual storage for the result here, instead. 1960d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt */ 1961d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt result_src = get_temp(glsl_type::vec4_type); 1962d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt result_dst = ir_to_mesa_dst_reg_from_src(result_src); 1963d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 1964d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt switch (ir->op) { 1965d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case ir_tex: 1966d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt opcode = OPCODE_TEX; 1967d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 1968d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case ir_txb: 1969d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt opcode = OPCODE_TXB; 1970d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt ir->lod_info.bias->accept(this); 1971d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt lod_info = this->result; 1972d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 1973d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case ir_txl: 1974d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt opcode = OPCODE_TXL; 1975d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt ir->lod_info.lod->accept(this); 1976d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt lod_info = this->result; 1977d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 1978d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case ir_txd: 1979d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case ir_txf: 1980d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt assert(!"GLSL 1.30 features unsupported"); 1981d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 1982d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1983d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 1984d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt if (ir->projector) { 1985d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt if (opcode == OPCODE_TEX) { 1986d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt /* Slot the projector in as the last component of the coord. */ 1987d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_W; 1988d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, projector); 1989d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_XYZW; 1990d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt opcode = OPCODE_TXP; 1991d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt } else { 1992d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_src_reg coord_w = coord; 1993d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_w.swizzle = SWIZZLE_WWWW; 1994d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 1995d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt /* For the other TEX opcodes there's no projective version 1996d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt * since the last slot is taken up by lod info. Do the 1997d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt * projective divide now. 1998d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt */ 1999d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_W; 2000d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_RCP, coord_dst, projector); 2001d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 2002d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_XYZ; 2003d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_emit_op2(ir, OPCODE_MUL, coord_dst, coord, coord_w); 2004d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 2005d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_XYZW; 2006d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord.swizzle = SWIZZLE_XYZW; 2007d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt } 2008d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt } 2009d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 2010b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt if (ir->shadow_comparitor) { 2011b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt /* Slot the shadow value in as the second to last component of the 2012b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt * coord. 2013b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt */ 2014b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt ir->shadow_comparitor->accept(this); 2015b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt coord_dst.writemask = WRITEMASK_Z; 2016b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, this->result); 2017b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt coord_dst.writemask = WRITEMASK_XYZW; 2018b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt } 2019b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt 2020d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt if (opcode == OPCODE_TXL || opcode == OPCODE_TXB) { 2021d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt /* Mesa IR stores lod or lod bias in the last channel of the coords. */ 2022d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_W; 2023d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, lod_info); 2024d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt coord_dst.writemask = WRITEMASK_XYZW; 2025d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt } 2026d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 2027d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt inst = ir_to_mesa_emit_op1(ir, opcode, result_dst, coord); 2028d3983ca03248092d92b5240fbc6a30c24f80d313Eric Anholt 2029b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt if (ir->shadow_comparitor) 2030b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt inst->tex_shadow = GL_TRUE; 2031b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt 2032aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt inst->sampler = get_sampler_uniform_value(ir->sampler); 2033c234d0b25f622a7bdd3c40bc72fdbd59d8494c7cEric Anholt 2034aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt const glsl_type *sampler_type = ir->sampler->type; 2035d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 2036c234d0b25f622a7bdd3c40bc72fdbd59d8494c7cEric Anholt switch (sampler_type->sampler_dimensionality) { 2037d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case GLSL_SAMPLER_DIM_1D: 2038c234d0b25f622a7bdd3c40bc72fdbd59d8494c7cEric Anholt inst->tex_target = (sampler_type->sampler_array) 20390a86d766ef0d98abd3373609a637bf137203e994Ian Romanick ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX; 2040d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 2041d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case GLSL_SAMPLER_DIM_2D: 2042c234d0b25f622a7bdd3c40bc72fdbd59d8494c7cEric Anholt inst->tex_target = (sampler_type->sampler_array) 20430a86d766ef0d98abd3373609a637bf137203e994Ian Romanick ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX; 2044d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 2045d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case GLSL_SAMPLER_DIM_3D: 2046d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt inst->tex_target = TEXTURE_3D_INDEX; 2047d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 2048d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt case GLSL_SAMPLER_DIM_CUBE: 2049d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt inst->tex_target = TEXTURE_CUBE_INDEX; 2050d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt break; 20510bf63733e54b47daf9f50c32a1fca4039c82def2Ian Romanick case GLSL_SAMPLER_DIM_RECT: 20520bf63733e54b47daf9f50c32a1fca4039c82def2Ian Romanick inst->tex_target = TEXTURE_RECT_INDEX; 20530bf63733e54b47daf9f50c32a1fca4039c82def2Ian Romanick break; 205468772031e6242aa78864dc9c7c1a607aec5ee7b9Ian Romanick case GLSL_SAMPLER_DIM_BUF: 205568772031e6242aa78864dc9c7c1a607aec5ee7b9Ian Romanick assert(!"FINISHME: Implement ARB_texture_buffer_object"); 205668772031e6242aa78864dc9c7c1a607aec5ee7b9Ian Romanick break; 2057d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt default: 205868772031e6242aa78864dc9c7c1a607aec5ee7b9Ian Romanick assert(!"Should not get here."); 2059d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 2060d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 2061d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt this->result = result_src; 206284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 206384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 206484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 206584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_return *ir) 206684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 20677b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (ir->get_value()) { 20687b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_dst_reg l; 20697b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt int i; 20707b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 207135220fc5981045331b4f048f0fc2e1371a0673edEric Anholt assert(current_function); 207235220fc5981045331b4f048f0fc2e1371a0673edEric Anholt 20737b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir->get_value()->accept(this); 20747b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_src_reg r = this->result; 207584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 20767b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l = ir_to_mesa_dst_reg_from_src(current_function->return_reg); 20777b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 20787b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt for (i = 0; i < type_size(current_function->sig->return_type); i++) { 20797b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r); 20807b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt l.index++; 20817b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt r.index++; 20827b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 20837b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 20847b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 20857b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt ir_to_mesa_emit_op0(ir, OPCODE_RET); 208684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 208784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 208816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkevoid 208916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeir_to_mesa_visitor::visit(ir_discard *ir) 209016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke{ 20919b075cb9fa9eb6a95d0816283ef01ae72dafa680Eric Anholt struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog; 20929b075cb9fa9eb6a95d0816283ef01ae72dafa680Eric Anholt 20935e4dd061d17563828bcce5525400a0ce363aa15dEric Anholt assert(ir->condition == NULL); /* FINISHME */ 209416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 2095021222c6a872ca2eef770ebadb8754f659775204Eric Anholt ir_to_mesa_emit_op0(ir, OPCODE_KIL_NV); 20969b075cb9fa9eb6a95d0816283ef01ae72dafa680Eric Anholt fp->UsesKill = GL_TRUE; 209716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke} 209884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 209984771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid 210084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_visitor::visit(ir_if *ir) 210184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 2102854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt ir_to_mesa_instruction *cond_inst, *if_inst, *else_inst = NULL; 2103cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt ir_to_mesa_instruction *prev_inst; 2104cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt 2105cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt prev_inst = (ir_to_mesa_instruction *)this->instructions.get_tail(); 2106c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2107c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt ir->condition->accept(this); 21080161515c395c44233529c8d51f823b60050bc7baEric Anholt assert(this->result.file != PROGRAM_UNDEFINED); 2109c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 21106d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri if (this->options->EmitCondCodes) { 2111854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt cond_inst = (ir_to_mesa_instruction *)this->instructions.get_tail(); 2112cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt 2113cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt /* See if we actually generated any instruction for generating 2114cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt * the condition. If not, then cook up a move to a temp so we 2115cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt * have something to set cond_update on. 2116cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt */ 2117cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt if (cond_inst == prev_inst) { 2118cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt ir_to_mesa_src_reg temp = get_temp(glsl_type::bool_type); 2119cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt cond_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_MOV, 2120cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt ir_to_mesa_dst_reg_from_src(temp), 2121cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt result); 2122cbe52c8012659abe5d81cf1180659820e704d290Eric Anholt } 2123854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt cond_inst->cond_update = GL_TRUE; 2124854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt 2125021222c6a872ca2eef770ebadb8754f659775204Eric Anholt if_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_IF); 2126854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt if_inst->dst_reg.cond_mask = COND_NE; 2127854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt } else { 2128854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt if_inst = ir_to_mesa_emit_op1(ir->condition, 2129854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt OPCODE_IF, ir_to_mesa_undef_dst, 2130854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt this->result); 2131854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt } 2132c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2133c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt this->instructions.push_tail(if_inst); 2134c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2135c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt visit_exec_list(&ir->then_instructions, this); 2136c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2137c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt if (!ir->else_instructions.is_empty()) { 2138021222c6a872ca2eef770ebadb8754f659775204Eric Anholt else_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_ELSE); 21390a52e8b691cecfeec27717c3289763226d5f1bdaEric Anholt visit_exec_list(&ir->else_instructions, this); 2140c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2141c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 21420161515c395c44233529c8d51f823b60050bc7baEric Anholt if_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_ENDIF, 21430161515c395c44233529c8d51f823b60050bc7baEric Anholt ir_to_mesa_undef_dst, ir_to_mesa_undef); 214484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 214584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 2146ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholtir_to_mesa_visitor::ir_to_mesa_visitor() 2147ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholt{ 21480161515c395c44233529c8d51f823b60050bc7baEric Anholt result.file = PROGRAM_UNDEFINED; 2149ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholt next_temp = 1; 21507b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt next_signature_id = 1; 21517b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt current_function = NULL; 2152abc6d7e0b4b04c75129d24c3cb6f021b92cd46f6Eric Anholt mem_ctx = talloc_new(NULL); 2153ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholt} 2154ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholt 2155fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholtir_to_mesa_visitor::~ir_to_mesa_visitor() 2156fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholt{ 2157abc6d7e0b4b04c75129d24c3cb6f021b92cd46f6Eric Anholt talloc_free(mem_ctx); 2158fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholt} 2159fe1918c71c3e387939cef9359d4b31ebc5c11a17Eric Anholt 216084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtstatic struct prog_src_register 216184771df82ed2ed8718013795089edd38cf5bd84dEric Anholtmesa_src_reg_from_ir_src_reg(ir_to_mesa_src_reg reg) 216284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 216384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt struct prog_src_register mesa_reg; 216484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 216584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_reg.File = reg.file; 2166aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholt assert(reg.index < (1 << INST_INDEX_BITS) - 1); 216784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_reg.Index = reg.index; 216834195832669f0eb7c4a80997cc524f8d10319307Eric Anholt mesa_reg.Swizzle = reg.swizzle; 2169f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt mesa_reg.RelAddr = reg.reladdr != NULL; 2170ea6b34cce4471d6239201101a3b24db17eaae870Eric Anholt mesa_reg.Negate = reg.negate; 2171285ff93819724b9a858984dc8c30858784a5ee5bEric Anholt mesa_reg.Abs = 0; 2172b10bb527eaf39378da25dd4ad21b1c68ceaa1e2dEric Anholt mesa_reg.HasIndex2 = GL_FALSE; 2173405546882a010885d342b0b40392de0da289374eVinson Lee mesa_reg.RelAddr2 = 0; 2174405546882a010885d342b0b40392de0da289374eVinson Lee mesa_reg.Index2 = 0; 217584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 217684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt return mesa_reg; 217784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} 217884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 2179c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholtstatic void 21807b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholtset_branchtargets(ir_to_mesa_visitor *v, 21817b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt struct prog_instruction *mesa_instructions, 2182c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt int num_instructions) 2183c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt{ 2184e2a358348b143a163c065d82c7375e6a94e98f2aKenneth Graunke int if_count = 0, loop_count = 0; 218564fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt int *if_stack, *loop_stack; 218664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt int if_stack_pos = 0, loop_stack_pos = 0; 218764fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt int i, j; 2188c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2189c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt for (i = 0; i < num_instructions; i++) { 219064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt switch (mesa_instructions[i].Opcode) { 219164fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_IF: 2192c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt if_count++; 219364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 219464fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_BGNLOOP: 219564fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt loop_count++; 219664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 219764fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_BRK: 219864fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_CONT: 219964fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[i].BranchTarget = -1; 220064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 220164fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt default: 220264fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 220364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt } 2204c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2205c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 22063ef83d270b2c24867a0d020b81bdc6c54cb1c9b0Eric Anholt if_stack = talloc_zero_array(v->mem_ctx, int, if_count); 22073ef83d270b2c24867a0d020b81bdc6c54cb1c9b0Eric Anholt loop_stack = talloc_zero_array(v->mem_ctx, int, loop_count); 2208c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2209c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt for (i = 0; i < num_instructions; i++) { 2210c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt switch (mesa_instructions[i].Opcode) { 2211c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt case OPCODE_IF: 221264fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt if_stack[if_stack_pos] = i; 2213c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt if_stack_pos++; 2214c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt break; 2215c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt case OPCODE_ELSE: 221664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i; 221764fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt if_stack[if_stack_pos - 1] = i; 2218c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt break; 2219c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt case OPCODE_ENDIF: 222064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i; 2221c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt if_stack_pos--; 2222c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt break; 222364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_BGNLOOP: 222464fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt loop_stack[loop_stack_pos] = i; 222564fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt loop_stack_pos++; 222664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt break; 222764fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt case OPCODE_ENDLOOP: 222864fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt loop_stack_pos--; 222964fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt /* Rewrite any breaks/conts at this nesting level (haven't 223064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt * already had a BranchTarget assigned) to point to the end 223164fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt * of the loop. 223264fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt */ 223364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt for (j = loop_stack[loop_stack_pos]; j < i; j++) { 223464fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt if (mesa_instructions[j].Opcode == OPCODE_BRK || 223564fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[j].Opcode == OPCODE_CONT) { 223664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt if (mesa_instructions[j].BranchTarget == -1) { 223764fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[j].BranchTarget = i; 223864fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt } 223964fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt } 224064fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt } 224164fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt /* The loop ends point at each other. */ 224264fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[i].BranchTarget = loop_stack[loop_stack_pos]; 224364fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt mesa_instructions[loop_stack[loop_stack_pos]].BranchTarget = i; 22447b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt break; 22457b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt case OPCODE_CAL: 22467b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, v->function_signatures) { 22477b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *entry = (function_entry *)iter.get(); 22487b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 22497b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (entry->sig_id == mesa_instructions[i].BranchTarget) { 22507b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt mesa_instructions[i].BranchTarget = entry->inst; 22517b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt break; 22527b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 22537b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 22547b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt break; 2255c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt default: 2256c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt break; 2257c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2258c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2259c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt} 2260c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2261c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholtstatic void 2262c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholtprint_program(struct prog_instruction *mesa_instructions, 2263c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt ir_instruction **mesa_instruction_annotation, 2264c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt int num_instructions) 2265c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt{ 2266c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt ir_instruction *last_ir = NULL; 2267c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt int i; 2268748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt int indent = 0; 2269c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2270c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt for (i = 0; i < num_instructions; i++) { 2271c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt struct prog_instruction *mesa_inst = mesa_instructions + i; 2272c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt ir_instruction *ir = mesa_instruction_annotation[i]; 2273c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2274748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt fprintf(stdout, "%3d: ", i); 2275748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt 227664fcbbca9ca8191b5131304af2026d0ed914b765Eric Anholt if (last_ir != ir && ir) { 2277748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt int j; 2278748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt 2279748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt for (j = 0; j < indent; j++) { 2280748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt fprintf(stdout, " "); 2281748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt } 2282748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt ir->print(); 2283c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt printf("\n"); 2284c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt last_ir = ir; 2285748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt 2286748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt fprintf(stdout, " "); /* line number spacing. */ 2287c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2288c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2289748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt indent = _mesa_fprint_instruction_opt(stdout, mesa_inst, indent, 2290748c343f8bdbbc8c5f00403b790ad7130424c35fEric Anholt PROG_PRINT_DEBUG, NULL); 2291c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt } 2292c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt} 2293c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2294ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholtstatic void 2295ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholtcount_resources(struct gl_program *prog) 2296ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt{ 2297d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt unsigned int i; 2298d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 2299d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt prog->SamplersUsed = 0; 2300ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt 2301ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt for (i = 0; i < prog->NumInstructions; i++) { 2302ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt struct prog_instruction *inst = &prog->Instructions[i]; 2303d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 2304d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt if (_mesa_is_tex_instruction(inst->Opcode)) { 2305d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt prog->SamplerTargets[inst->TexSrcUnit] = 2306d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt (gl_texture_index)inst->TexSrcTarget; 2307d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt prog->SamplersUsed |= 1 << inst->TexSrcUnit; 2308d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt if (inst->TexShadow) { 2309d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt prog->ShadowSamplers |= 1 << inst->TexSrcUnit; 2310d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 2311d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 2312ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt } 2313d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 2314d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt _mesa_update_shader_textures_used(prog); 2315ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt} 2316ffc845a50a69b48446f5e25e7b4485089231bbe7Eric Anholt 231799f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholtstruct uniform_sort { 231899f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt struct gl_uniform *u; 231999f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt int pos; 232099f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt}; 232199f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 232299f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt/* The shader_program->Uniforms list is almost sorted in increasing 232399f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt * uniform->{Frag,Vert}Pos locations, but not quite when there are 232499f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt * uniforms shared between targets. We need to add parameters in 232599f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt * increasing order for the targets. 232699f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt */ 232799f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholtstatic int 232899f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholtsort_uniforms(const void *a, const void *b) 232999f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt{ 233099f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt struct uniform_sort *u1 = (struct uniform_sort *)a; 233199f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt struct uniform_sort *u2 = (struct uniform_sort *)b; 233299f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 233399f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt return u1->pos - u2->pos; 233499f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt} 233599f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 23360924ba0c3496160a134d37cec800f902ae805b9cEric Anholt/* Add the uniforms to the parameters. The linker chose locations 23370924ba0c3496160a134d37cec800f902ae805b9cEric Anholt * in our parameters lists (which weren't created yet), which the 23380924ba0c3496160a134d37cec800f902ae805b9cEric Anholt * uniforms code will use to poke values into our parameters list 23390924ba0c3496160a134d37cec800f902ae805b9cEric Anholt * when uniforms are updated. 234085c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt */ 234185c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholtstatic void 23420924ba0c3496160a134d37cec800f902ae805b9cEric Anholtadd_uniforms_to_parameters_list(struct gl_shader_program *shader_program, 23430924ba0c3496160a134d37cec800f902ae805b9cEric Anholt struct gl_shader *shader, 23440924ba0c3496160a134d37cec800f902ae805b9cEric Anholt struct gl_program *prog) 234585c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt{ 234685c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt unsigned int i; 234799f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt unsigned int next_sampler = 0, num_uniforms = 0; 234899f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt struct uniform_sort *sorted_uniforms; 234999f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 235099f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt sorted_uniforms = talloc_array(NULL, struct uniform_sort, 235199f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt shader_program->Uniforms->NumUniforms); 235285c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt 23530924ba0c3496160a134d37cec800f902ae805b9cEric Anholt for (i = 0; i < shader_program->Uniforms->NumUniforms; i++) { 23540924ba0c3496160a134d37cec800f902ae805b9cEric Anholt struct gl_uniform *uniform = shader_program->Uniforms->Uniforms + i; 23550924ba0c3496160a134d37cec800f902ae805b9cEric Anholt int parameter_index = -1; 23560924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 23570924ba0c3496160a134d37cec800f902ae805b9cEric Anholt switch (shader->Type) { 23580924ba0c3496160a134d37cec800f902ae805b9cEric Anholt case GL_VERTEX_SHADER: 23590924ba0c3496160a134d37cec800f902ae805b9cEric Anholt parameter_index = uniform->VertPos; 23600924ba0c3496160a134d37cec800f902ae805b9cEric Anholt break; 23610924ba0c3496160a134d37cec800f902ae805b9cEric Anholt case GL_FRAGMENT_SHADER: 23620924ba0c3496160a134d37cec800f902ae805b9cEric Anholt parameter_index = uniform->FragPos; 23630924ba0c3496160a134d37cec800f902ae805b9cEric Anholt break; 23640924ba0c3496160a134d37cec800f902ae805b9cEric Anholt case GL_GEOMETRY_SHADER: 23650924ba0c3496160a134d37cec800f902ae805b9cEric Anholt parameter_index = uniform->GeomPos; 23660924ba0c3496160a134d37cec800f902ae805b9cEric Anholt break; 23670924ba0c3496160a134d37cec800f902ae805b9cEric Anholt } 23680924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 23690924ba0c3496160a134d37cec800f902ae805b9cEric Anholt /* Only add uniforms used in our target. */ 237099f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt if (parameter_index != -1) { 237199f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt sorted_uniforms[num_uniforms].pos = parameter_index; 237299f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt sorted_uniforms[num_uniforms].u = uniform; 237399f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt num_uniforms++; 237499f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt } 237599f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt } 237699f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 237799f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt qsort(sorted_uniforms, num_uniforms, sizeof(struct uniform_sort), 237899f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt sort_uniforms); 237999f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 238099f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt for (i = 0; i < num_uniforms; i++) { 238199f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt struct gl_uniform *uniform = sorted_uniforms[i].u; 238299f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt int parameter_index = sorted_uniforms[i].pos; 238399f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt const glsl_type *type = uniform->Type; 238499f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt unsigned int size; 23850924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 23860924ba0c3496160a134d37cec800f902ae805b9cEric Anholt if (type->is_vector() || 23870924ba0c3496160a134d37cec800f902ae805b9cEric Anholt type->is_scalar()) { 23880924ba0c3496160a134d37cec800f902ae805b9cEric Anholt size = type->vector_elements; 23890924ba0c3496160a134d37cec800f902ae805b9cEric Anholt } else { 23900924ba0c3496160a134d37cec800f902ae805b9cEric Anholt size = type_size(type) * 4; 23910924ba0c3496160a134d37cec800f902ae805b9cEric Anholt } 23920924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 2393aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt gl_register_file file; 23940924ba0c3496160a134d37cec800f902ae805b9cEric Anholt if (type->is_sampler() || 23950924ba0c3496160a134d37cec800f902ae805b9cEric Anholt (type->is_array() && type->fields.array->is_sampler())) { 2396aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt file = PROGRAM_SAMPLER; 2397aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } else { 2398aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt file = PROGRAM_UNIFORM; 2399aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 240085c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt 2401aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt GLint index = _mesa_lookup_parameter_index(prog->Parameters, -1, 2402aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt uniform->Name); 24030924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 2404aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (index < 0) { 2405aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt index = _mesa_add_parameter(prog->Parameters, file, 2406aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt uniform->Name, size, type->gl_type, 2407aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt NULL, NULL, 0x0); 2408aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 2409aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt /* Sampler uniform values are stored in prog->SamplerUnits, 2410aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * and the entry in that array is selected by this index we 2411aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * store in ParameterValues[]. 2412aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt */ 2413aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (file == PROGRAM_SAMPLER) { 2414aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt for (unsigned int j = 0; j < size / 4; j++) 2415aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt prog->Parameters->ParameterValues[index + j][0] = next_sampler++; 2416aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt } 2417aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt 2418aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt /* The location chosen in the Parameters list here (returned 2419aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt * from _mesa_add_uniform) has to match what the linker chose. 2420aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt */ 2421aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt if (index != parameter_index) { 2422500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt fail_link(shader_program, "Allocation of uniform `%s' to target " 2423500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt "failed (%d vs %d)\n", 2424500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt uniform->Name, index, parameter_index); 24250924ba0c3496160a134d37cec800f902ae805b9cEric Anholt } 242685c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt } 242785c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt } 242899f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt 242999f3c9caa39fbe9dfa7561c919202395720e9472Eric Anholt talloc_free(sorted_uniforms); 243085c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt} 243185c978f38c819003b6447e8e4feb8b90bb352eeaEric Anholt 24322f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtstatic void 24332f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtset_uniform_initializer(GLcontext *ctx, void *mem_ctx, 24342f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt struct gl_shader_program *shader_program, 24352f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt const char *name, const glsl_type *type, 24362f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt ir_constant *val) 24372f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt{ 24382f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (type->is_record()) { 24392f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt ir_constant *field_constant; 24402f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24412f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt field_constant = (ir_constant *)val->components.get_head(); 24422f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24432f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt for (unsigned int i = 0; i < type->length; i++) { 24442f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt const glsl_type *field_type = type->fields.structure[i].type; 24452f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt const char *field_name = talloc_asprintf(mem_ctx, "%s.%s", name, 24462f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt type->fields.structure[i].name); 24472f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt set_uniform_initializer(ctx, mem_ctx, shader_program, field_name, 24482f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt field_type, field_constant); 24492f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt field_constant = (ir_constant *)field_constant->next; 24502f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24512f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt return; 24522f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24532f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24542f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt int loc = _mesa_get_uniform_location(ctx, shader_program, name); 24552f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24562f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (loc == -1) { 2457500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt fail_link(shader_program, 2458500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt "Couldn't find uniform for initializer %s\n", name); 2459500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt return; 24602f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24612f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24622f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt for (unsigned int i = 0; i < (type->is_array() ? type->length : 1); i++) { 24632f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt ir_constant *element; 24642f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt const glsl_type *element_type; 24652f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (type->is_array()) { 24662f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element = val->array_elements[i]; 24672f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type = type->fields.array; 24682f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } else { 24692f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element = val; 24702f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type = type; 24712f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24722f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24732f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt void *values; 24742f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24752f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (element_type->base_type == GLSL_TYPE_BOOL) { 24762f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt int *conv = talloc_array(mem_ctx, int, element_type->components()); 24772f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt for (unsigned int j = 0; j < element_type->components(); j++) { 24782f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt conv[j] = element->value.b[j]; 24792f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24802f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt values = (void *)conv; 24812f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type = glsl_type::get_instance(GLSL_TYPE_INT, 24822f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type->vector_elements, 24832f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 1); 24842f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } else { 24852f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt values = &element->value; 24862f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24872f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 24882f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (element_type->is_matrix()) { 24892f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt _mesa_uniform_matrix(ctx, shader_program, 24902f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type->matrix_columns, 24912f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt element_type->vector_elements, 24922f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt loc, 1, GL_FALSE, (GLfloat *)values); 24932f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt loc += element_type->matrix_columns; 24942f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } else { 24952f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt _mesa_uniform(ctx, shader_program, loc, element_type->matrix_columns, 24962f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt values, element_type->gl_type); 24972f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt loc += type_size(element_type); 24982f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 24992f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 25002f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt} 25012f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25022f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtstatic void 25032f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtset_uniform_initializers(GLcontext *ctx, 25042f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt struct gl_shader_program *shader_program) 25052f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt{ 25062f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt void *mem_ctx = NULL; 25072f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25082f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt for (unsigned int i = 0; i < shader_program->_NumLinkedShaders; i++) { 25092f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt struct gl_shader *shader = shader_program->_LinkedShaders[i]; 25102f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt foreach_iter(exec_list_iterator, iter, *shader->ir) { 25112f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt ir_instruction *ir = (ir_instruction *)iter.get(); 25122f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt ir_variable *var = ir->as_variable(); 25132f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25142f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (!var || var->mode != ir_var_uniform || !var->constant_value) 25152f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt continue; 25162f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25172f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt if (!mem_ctx) 25182f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt mem_ctx = talloc_new(NULL); 25192f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25202f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt set_uniform_initializer(ctx, mem_ctx, shader_program, var->name, 25212f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt var->type, var->constant_value); 25222f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 25232f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt } 25242f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 25252f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt talloc_free(mem_ctx); 25262f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt} 25272f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 2528364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholtstruct gl_program * 252995c08920ea3d040360e5cc51d8a852d21a0329eeEric Anholtget_mesa_program(GLcontext *ctx, struct gl_shader_program *shader_program, 253095c08920ea3d040360e5cc51d8a852d21a0329eeEric Anholt struct gl_shader *shader) 253184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{ 253284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir_to_mesa_visitor v; 253384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt struct prog_instruction *mesa_instructions, *mesa_inst; 2534c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt ir_instruction **mesa_instruction_annotation; 2535c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt int i; 2536364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt struct gl_program *prog; 2537364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt GLenum target; 2538c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt const char *target_string; 25397b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt GLboolean progress; 25406d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri struct gl_shader_compiler_options *options = 25416d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)]; 2542364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2543364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt switch (shader->Type) { 2544c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt case GL_VERTEX_SHADER: 2545c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt target = GL_VERTEX_PROGRAM_ARB; 2546c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt target_string = "vertex"; 2547c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt break; 2548c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt case GL_FRAGMENT_SHADER: 2549c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt target = GL_FRAGMENT_PROGRAM_ARB; 2550c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt target_string = "fragment"; 2551c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt break; 2552c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt default: 2553c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt assert(!"should not be reached"); 25544841c0a15adcc722e67d7d246987cd686d3f7a17José Fonseca return NULL; 2555364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 255684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 25571124e5a3cbba839ffd968742bfa3295c8de5498cEric Anholt validate_ir_tree(shader->ir); 25581124e5a3cbba839ffd968742bfa3295c8de5498cEric Anholt 2559859fd56245c1d725cacab17a34793d41ea14e867Eric Anholt prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name); 2560364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt if (!prog) 2561364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt return NULL; 2562364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->Parameters = _mesa_new_parameter_list(); 2563364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->Varying = _mesa_new_parameter_list(); 2564364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->Attributes = _mesa_new_parameter_list(); 2565364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt v.ctx = ctx; 2566364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt v.prog = prog; 2567aa452e20bff9aea2ecb994c9f7b413b0726a04f3Eric Anholt v.shader_program = shader_program; 25686d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri v.options = options; 2569364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 25700924ba0c3496160a134d37cec800f902ae805b9cEric Anholt add_uniforms_to_parameters_list(shader_program, shader, prog); 25710924ba0c3496160a134d37cec800f902ae805b9cEric Anholt 25727b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Emit Mesa IR for main(). */ 257316b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt visit_exec_list(shader->ir, &v); 2574021222c6a872ca2eef770ebadb8754f659775204Eric Anholt v.ir_to_mesa_emit_op0(NULL, OPCODE_END); 257584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 25767b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt /* Now emit bodies for any functions that were used. */ 25777b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt do { 25787b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt progress = GL_FALSE; 25797b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 25807b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt foreach_iter(exec_list_iterator, iter, v.function_signatures) { 25817b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt function_entry *entry = (function_entry *)iter.get(); 25827b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 25837b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt if (!entry->bgn_inst) { 25847b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt v.current_function = entry; 25857b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 25867b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->bgn_inst = v.ir_to_mesa_emit_op0(NULL, OPCODE_BGNSUB); 25877b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt entry->bgn_inst->function = entry; 25887b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 25897b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt visit_exec_list(&entry->sig->body, &v); 25907b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 2591806cb9f9528e3c55c157d7e8bbb751b769b6fcb7Eric Anholt ir_to_mesa_instruction *last; 2592806cb9f9528e3c55c157d7e8bbb751b769b6fcb7Eric Anholt last = (ir_to_mesa_instruction *)v.instructions.get_tail(); 2593806cb9f9528e3c55c157d7e8bbb751b769b6fcb7Eric Anholt if (last->op != OPCODE_RET) 2594806cb9f9528e3c55c157d7e8bbb751b769b6fcb7Eric Anholt v.ir_to_mesa_emit_op0(NULL, OPCODE_RET); 2595806cb9f9528e3c55c157d7e8bbb751b769b6fcb7Eric Anholt 259640f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt ir_to_mesa_instruction *end; 259740f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt end = v.ir_to_mesa_emit_op0(NULL, OPCODE_ENDSUB); 259840f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt end->function = entry; 259940f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt 26007b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt progress = GL_TRUE; 26017b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 26027b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } 26037b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt } while (progress); 26047b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 2605364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->NumTemporaries = v.next_temp; 2606364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 260784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt int num_instructions = 0; 260884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt foreach_iter(exec_list_iterator, iter, v.instructions) { 260984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt num_instructions++; 261084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 261184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 261284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_instructions = 261384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt (struct prog_instruction *)calloc(num_instructions, 261484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt sizeof(*mesa_instructions)); 2615850c659044d081c53713800cacf8d518fae6cd70Eric Anholt mesa_instruction_annotation = talloc_array(v.mem_ctx, ir_instruction *, 2616364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt num_instructions); 261784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt 261884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst = mesa_instructions; 2619c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt i = 0; 262084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt foreach_iter(exec_list_iterator, iter, v.instructions) { 262184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt ir_to_mesa_instruction *inst = (ir_to_mesa_instruction *)iter.get(); 2622b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt 262384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->Opcode = inst->op; 2624854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt mesa_inst->CondUpdate = inst->cond_update; 262584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->DstReg.File = inst->dst_reg.file; 262684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->DstReg.Index = inst->dst_reg.index; 2627854fd66cbb569cb3d4768196f4c680eff489733eEric Anholt mesa_inst->DstReg.CondMask = inst->dst_reg.cond_mask; 262812f654c63bc42d353e258cde989d9114cdde26c6Eric Anholt mesa_inst->DstReg.WriteMask = inst->dst_reg.writemask; 2629f8a2b65bc9bf3dfb4a4aa6fe1c0ea65f78a01922Eric Anholt mesa_inst->DstReg.RelAddr = inst->dst_reg.reladdr != NULL; 263084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->SrcReg[0] = mesa_src_reg_from_ir_src_reg(inst->src_reg[0]); 263184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->SrcReg[1] = mesa_src_reg_from_ir_src_reg(inst->src_reg[1]); 263284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst->SrcReg[2] = mesa_src_reg_from_ir_src_reg(inst->src_reg[2]); 2633d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt mesa_inst->TexSrcUnit = inst->sampler; 2634d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt mesa_inst->TexSrcTarget = inst->tex_target; 2635b61f4241f314144d3290085cda5db1959d8960a2Eric Anholt mesa_inst->TexShadow = inst->tex_shadow; 2636c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt mesa_instruction_annotation[i] = inst->ir; 2637aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholt 26385755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák /* Set IndirectRegisterFiles. */ 26395755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák if (mesa_inst->DstReg.RelAddr) 26405755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák prog->IndirectRegisterFiles |= 1 << mesa_inst->DstReg.File; 26415755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák 26425755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák for (unsigned src = 0; src < 3; src++) 26435755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák if (mesa_inst->SrcReg[src].RelAddr) 26445755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák prog->IndirectRegisterFiles |= 1 << mesa_inst->SrcReg[src].File; 26455755d1d6a7ff68c7d690d67c4cd64ef8e01ec2edMarek Olšák 26466d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri if (options->EmitNoIfs && mesa_inst->Opcode == OPCODE_IF) { 2647500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt fail_link(shader_program, "Couldn't flatten if statement\n"); 264895c08920ea3d040360e5cc51d8a852d21a0329eeEric Anholt } 264995c08920ea3d040360e5cc51d8a852d21a0329eeEric Anholt 265040f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt switch (mesa_inst->Opcode) { 265140f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt case OPCODE_BGNSUB: 26527b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt inst->function->inst = i; 265340f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt mesa_inst->Comment = strdup(inst->function->sig->function_name()); 265440f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt break; 265540f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt case OPCODE_ENDSUB: 265640f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt mesa_inst->Comment = strdup(inst->function->sig->function_name()); 265740f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt break; 265840f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt case OPCODE_CAL: 26597b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt mesa_inst->BranchTarget = inst->function->sig_id; /* rewritten later */ 266040f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt break; 266140f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt case OPCODE_ARL: 2662d64343f1ae84979bd154475badf11af8a9bfc2ebEric Anholt prog->NumAddressRegs = 1; 266340f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt break; 266440f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt default: 266540f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt break; 266640f57c2becbb2cee7cfb6d6ed49dc1db57987e9aEric Anholt } 26677b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt 266884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt mesa_inst++; 2669c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt i++; 267084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt } 2671c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 26727b130149427019ac9ae6d39b6871c14fb6ba2dadEric Anholt set_branchtargets(&v, mesa_instructions, num_instructions); 2673925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 2674c8d0a9f0065c321308be635529c95735f3beb68fEric Anholt if (ctx->Shader.Flags & GLSL_DUMP) { 2675455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt printf("\n"); 2676455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt printf("GLSL IR for linked %s program %d:\n", target_string, 2677455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt shader_program->Name); 2678455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt _mesa_print_ir(shader->ir, NULL); 2679455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt printf("\n"); 2680455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt printf("\n"); 2681455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt printf("Mesa IR for linked %s program %d:\n", target_string, 2682455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt shader_program->Name); 2683364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt print_program(mesa_instructions, mesa_instruction_annotation, 2684364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt num_instructions); 2685364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 2686364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2687364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->Instructions = mesa_instructions; 2688364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->NumInstructions = num_instructions; 2689364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2690925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt do_set_program_inouts(shader->ir, prog); 2691925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt count_resources(prog); 2692925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 269316b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt _mesa_reference_program(ctx, &shader->Program, prog); 2694364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 269528faa12dc2413d93c7f4778327a5e7c4c8f57c85Eric Anholt if ((ctx->Shader.Flags & GLSL_NO_OPT) == 0) { 269628faa12dc2413d93c7f4778327a5e7c4c8f57c85Eric Anholt _mesa_optimize_program(ctx, prog); 269728faa12dc2413d93c7f4778327a5e7c4c8f57c85Eric Anholt } 269828faa12dc2413d93c7f4778327a5e7c4c8f57c85Eric Anholt 2699364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt return prog; 2700364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt} 2701364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 270216b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholtextern "C" { 2703d19eecef54384c163af27a470496ed885a5a271bEric AnholtGLboolean 2704d19eecef54384c163af27a470496ed885a5a271bEric Anholt_mesa_ir_compile_shader(GLcontext *ctx, struct gl_shader *shader) 2705d19eecef54384c163af27a470496ed885a5a271bEric Anholt{ 2706d19eecef54384c163af27a470496ed885a5a271bEric Anholt assert(shader->CompileStatus); 2707fc63e37b971b641dfdff000ba353c4810414c20eIan Romanick (void) ctx; 2708d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2709d19eecef54384c163af27a470496ed885a5a271bEric Anholt return GL_TRUE; 2710d19eecef54384c163af27a470496ed885a5a271bEric Anholt} 2711d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2712d19eecef54384c163af27a470496ed885a5a271bEric AnholtGLboolean 2713d19eecef54384c163af27a470496ed885a5a271bEric Anholt_mesa_ir_link_shader(GLcontext *ctx, struct gl_shader_program *prog) 2714d19eecef54384c163af27a470496ed885a5a271bEric Anholt{ 2715d19eecef54384c163af27a470496ed885a5a271bEric Anholt assert(prog->LinkStatus); 2716d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2717d19eecef54384c163af27a470496ed885a5a271bEric Anholt for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) { 2718d19eecef54384c163af27a470496ed885a5a271bEric Anholt bool progress; 2719d19eecef54384c163af27a470496ed885a5a271bEric Anholt exec_list *ir = prog->_LinkedShaders[i]->ir; 27206d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri struct gl_shader_compiler_options *options = 27216d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(prog->_LinkedShaders[i]->Type)]; 2722d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2723d19eecef54384c163af27a470496ed885a5a271bEric Anholt do { 2724d19eecef54384c163af27a470496ed885a5a271bEric Anholt progress = false; 2725d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2726d19eecef54384c163af27a470496ed885a5a271bEric Anholt /* Lowering */ 2727d19eecef54384c163af27a470496ed885a5a271bEric Anholt do_mat_op_to_vec(ir); 2728d19eecef54384c163af27a470496ed885a5a271bEric Anholt do_mod_to_fract(ir); 2729d19eecef54384c163af27a470496ed885a5a271bEric Anholt do_div_to_mul_rcp(ir); 2730d19eecef54384c163af27a470496ed885a5a271bEric Anholt do_explog_to_explog2(ir); 2731d19eecef54384c163af27a470496ed885a5a271bEric Anholt 273287708e8c90220cc1997cef9de9b394c04d952be9Luca Barbieri progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress; 273387708e8c90220cc1997cef9de9b394c04d952be9Luca Barbieri 2734e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri progress = do_common_optimization(ir, true, options->MaxUnrollIterations) || progress; 2735d19eecef54384c163af27a470496ed885a5a271bEric Anholt 27366d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri if (options->EmitNoIfs) 2737d19eecef54384c163af27a470496ed885a5a271bEric Anholt progress = do_if_to_cond_assign(ir) || progress; 2738d19eecef54384c163af27a470496ed885a5a271bEric Anholt 27392b70dbfe091af5ae7c788e16275e1af2cb1c284cIan Romanick if (options->EmitNoNoise) 27402b70dbfe091af5ae7c788e16275e1af2cb1c284cIan Romanick progress = lower_noise(ir) || progress; 27412b70dbfe091af5ae7c788e16275e1af2cb1c284cIan Romanick 2742d19eecef54384c163af27a470496ed885a5a271bEric Anholt progress = do_vec_index_to_cond_assign(ir) || progress; 2743d19eecef54384c163af27a470496ed885a5a271bEric Anholt } while (progress); 2744d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2745d19eecef54384c163af27a470496ed885a5a271bEric Anholt validate_ir_tree(ir); 2746d19eecef54384c163af27a470496ed885a5a271bEric Anholt } 2747d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2748d19eecef54384c163af27a470496ed885a5a271bEric Anholt for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) { 2749d19eecef54384c163af27a470496ed885a5a271bEric Anholt struct gl_program *linked_prog; 2750d19eecef54384c163af27a470496ed885a5a271bEric Anholt bool ok = true; 2751d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2752d19eecef54384c163af27a470496ed885a5a271bEric Anholt linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]); 2753d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2754d19eecef54384c163af27a470496ed885a5a271bEric Anholt switch (prog->_LinkedShaders[i]->Type) { 2755d19eecef54384c163af27a470496ed885a5a271bEric Anholt case GL_VERTEX_SHADER: 2756d19eecef54384c163af27a470496ed885a5a271bEric Anholt _mesa_reference_vertprog(ctx, &prog->VertexProgram, 2757d19eecef54384c163af27a470496ed885a5a271bEric Anholt (struct gl_vertex_program *)linked_prog); 2758d19eecef54384c163af27a470496ed885a5a271bEric Anholt ok = ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB, 2759d19eecef54384c163af27a470496ed885a5a271bEric Anholt linked_prog); 2760d19eecef54384c163af27a470496ed885a5a271bEric Anholt break; 2761d19eecef54384c163af27a470496ed885a5a271bEric Anholt case GL_FRAGMENT_SHADER: 2762d19eecef54384c163af27a470496ed885a5a271bEric Anholt _mesa_reference_fragprog(ctx, &prog->FragmentProgram, 2763d19eecef54384c163af27a470496ed885a5a271bEric Anholt (struct gl_fragment_program *)linked_prog); 2764d19eecef54384c163af27a470496ed885a5a271bEric Anholt ok = ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB, 2765d19eecef54384c163af27a470496ed885a5a271bEric Anholt linked_prog); 2766d19eecef54384c163af27a470496ed885a5a271bEric Anholt break; 2767d19eecef54384c163af27a470496ed885a5a271bEric Anholt } 2768d19eecef54384c163af27a470496ed885a5a271bEric Anholt if (!ok) { 2769d19eecef54384c163af27a470496ed885a5a271bEric Anholt return GL_FALSE; 2770d19eecef54384c163af27a470496ed885a5a271bEric Anholt } 27713cd233eb5714137dccb6218ad78005511bcc02bdEric Anholt _mesa_reference_program(ctx, &linked_prog, NULL); 2772d19eecef54384c163af27a470496ed885a5a271bEric Anholt } 2773d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2774d19eecef54384c163af27a470496ed885a5a271bEric Anholt return GL_TRUE; 2775d19eecef54384c163af27a470496ed885a5a271bEric Anholt} 277616b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt 277716b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholtvoid 277816b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt_mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader) 2779364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt{ 27802462a536ea5c98867296905e3da127eba7c7bdffIan Romanick struct _mesa_glsl_parse_state *state = 27812462a536ea5c98867296905e3da127eba7c7bdffIan Romanick new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); 27825e18b051c039564d1998818d08caf1bff3983630Ian Romanick 2783153eca98064252be4daad9cc27746f37c245b627Ian Romanick const char *source = shader->Source; 2784a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke /* Check if the user called glCompileShader without first calling 2785a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke * glShaderSource. This should fail to compile, but not raise a GL_ERROR. 2786a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke */ 2787a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke if (source == NULL) { 2788a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke shader->CompileStatus = GL_FALSE; 2789a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke return; 2790a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke } 2791a09a8ec12d76e1fb1583fa99cf9f48246c108d7bKenneth Graunke 279206143ea09411aa283ac3633bfbfa4326584cd952Ian Romanick state->error = preprocess(state, &source, &state->info_log, 27937dcfc44b72f00ba5a38cb02123c80113440f0de9Kenneth Graunke &ctx->Extensions, ctx->API); 2794153eca98064252be4daad9cc27746f37c245b627Ian Romanick 27951b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1Eric Anholt if (ctx->Shader.Flags & GLSL_DUMP) { 27961b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1Eric Anholt printf("GLSL source for shader %d:\n", shader->Name); 27971b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1Eric Anholt printf("%s\n", shader->Source); 27981b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1Eric Anholt } 27991b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1Eric Anholt 2800153eca98064252be4daad9cc27746f37c245b627Ian Romanick if (!state->error) { 2801153eca98064252be4daad9cc27746f37c245b627Ian Romanick _mesa_glsl_lexer_ctor(state, source); 2802153eca98064252be4daad9cc27746f37c245b627Ian Romanick _mesa_glsl_parse(state); 2803153eca98064252be4daad9cc27746f37c245b627Ian Romanick _mesa_glsl_lexer_dtor(state); 2804153eca98064252be4daad9cc27746f37c245b627Ian Romanick } 2805364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 28064a6a4316846ead3ec12759c96ecc4b61491aad65Eric Anholt talloc_free(shader->ir); 280716b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt shader->ir = new(shader) exec_list; 2808364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt if (!state->error && !state->translation_unit.is_empty()) 280916b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt _mesa_ast_to_hir(shader->ir, state); 2810364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 281116b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt if (!state->error && !shader->ir->is_empty()) { 2812ee7b2b3f44d09c2311887d3524e197b9738580a9Eric Anholt validate_ir_tree(shader->ir); 2813ee7b2b3f44d09c2311887d3524e197b9738580a9Eric Anholt 28142f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt /* Do some optimization at compile time to reduce shader IR size 28152f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt * and reduce later work if the same shader is linked multiple times 28162f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt */ 2817e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri while (do_common_optimization(shader->ir, false, 32)) 28182f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt ; 2819ee7b2b3f44d09c2311887d3524e197b9738580a9Eric Anholt 2820ee7b2b3f44d09c2311887d3524e197b9738580a9Eric Anholt validate_ir_tree(shader->ir); 2821364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 2822364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2823364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt shader->symbols = state->symbols; 2824364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2825364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt shader->CompileStatus = !state->error; 2826364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt shader->InfoLog = state->info_log; 282725f51d3b9b8c36c41cd23d2797b6a06f6e27ff86Ian Romanick shader->Version = state->language_version; 2828d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick memcpy(shader->builtins_to_link, state->builtins_to_link, 2829d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link); 2830d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick shader->num_builtins_to_link = state->num_builtins_to_link; 2831c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627bEric Anholt 2832b42519108dc7ab104cf9ade65a508f54a0294406Eric Anholt if (ctx->Shader.Flags & GLSL_LOG) { 2833b42519108dc7ab104cf9ade65a508f54a0294406Eric Anholt _mesa_write_shader_to_file(shader); 2834b42519108dc7ab104cf9ade65a508f54a0294406Eric Anholt } 2835b42519108dc7ab104cf9ade65a508f54a0294406Eric Anholt 28360df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt if (ctx->Shader.Flags & GLSL_DUMP) { 28370df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt if (shader->CompileStatus) { 28380df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("GLSL IR for shader %d:\n", shader->Name); 28390df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt _mesa_print_ir(shader->ir, NULL); 28400df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("\n\n"); 28410df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt } else { 28420df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("GLSL shader %d failed to compile.\n", shader->Name); 28430df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt } 28440df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt if (shader->InfoLog && shader->InfoLog[0] != 0) { 28450df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("GLSL shader %d info log:\n", shader->Name); 28460df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("%s\n", shader->InfoLog); 28470df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt } 2848455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt } 2849455290e4281bf53ce2fe248a2adf5163563c44c8Eric Anholt 2850116f1d4f95d8eb0a82b272016590549632c865b3Kenneth Graunke /* Retain any live IR, but trash the rest. */ 28514a6a4316846ead3ec12759c96ecc4b61491aad65Eric Anholt reparent_ir(shader->ir, shader->ir); 2852116f1d4f95d8eb0a82b272016590549632c865b3Kenneth Graunke 2853364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt talloc_free(state); 2854d19eecef54384c163af27a470496ed885a5a271bEric Anholt 2855d19eecef54384c163af27a470496ed885a5a271bEric Anholt if (shader->CompileStatus) { 2856d19eecef54384c163af27a470496ed885a5a271bEric Anholt if (!ctx->Driver.CompileShader(ctx, shader)) 2857d19eecef54384c163af27a470496ed885a5a271bEric Anholt shader->CompileStatus = GL_FALSE; 2858d19eecef54384c163af27a470496ed885a5a271bEric Anholt } 2859d19eecef54384c163af27a470496ed885a5a271bEric Anholt} 2860364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2861364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholtvoid 2862364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt_mesa_glsl_link_shader(GLcontext *ctx, struct gl_shader_program *prog) 2863364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt{ 2864364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt unsigned int i; 2865849e18153cd91d812f694b806a84008498860bc3Eric Anholt 2866364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt _mesa_clear_shader_program_data(ctx, prog); 2867364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2868849e18153cd91d812f694b806a84008498860bc3Eric Anholt prog->LinkStatus = GL_TRUE; 2869364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2870364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt for (i = 0; i < prog->NumShaders; i++) { 2871849e18153cd91d812f694b806a84008498860bc3Eric Anholt if (!prog->Shaders[i]->CompileStatus) { 2872500e7b75995460537b0e682e5bde4c32eb40b85cEric Anholt fail_link(prog, "linking with uncompiled shader"); 2873849e18153cd91d812f694b806a84008498860bc3Eric Anholt prog->LinkStatus = GL_FALSE; 2874364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 2875364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 2876364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2877364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt prog->Varying = _mesa_new_parameter_list(); 2878364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt _mesa_reference_vertprog(ctx, &prog->VertexProgram, NULL); 2879364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt _mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL); 2880364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2881849e18153cd91d812f694b806a84008498860bc3Eric Anholt if (prog->LinkStatus) { 28825d0f430e8ed01db29d11d22e4b6c3760d8c39f8fEric Anholt link_shaders(ctx, prog); 2883849e18153cd91d812f694b806a84008498860bc3Eric Anholt } 2884364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2885364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt if (prog->LinkStatus) { 28860df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt if (!ctx->Driver.LinkShader(ctx, prog)) { 2887d19eecef54384c163af27a470496ed885a5a271bEric Anholt prog->LinkStatus = GL_FALSE; 2888af2ef53a2701426d32382e861d8f238a449e9cd9Eric Anholt } 2889af2ef53a2701426d32382e861d8f238a449e9cd9Eric Anholt } 2890af2ef53a2701426d32382e861d8f238a449e9cd9Eric Anholt 28912f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt set_uniform_initializers(ctx, prog); 28922f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt 2893af2ef53a2701426d32382e861d8f238a449e9cd9Eric Anholt if (ctx->Shader.Flags & GLSL_DUMP) { 2894af2ef53a2701426d32382e861d8f238a449e9cd9Eric Anholt if (!prog->LinkStatus) { 28950df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("GLSL shader program %d failed to link\n", prog->Name); 28960df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt } 28970df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt 28980df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt if (prog->InfoLog && prog->InfoLog[0] != 0) { 28990df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("GLSL shader program %d info log:\n", prog->Name); 29000df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt printf("%s\n", prog->InfoLog); 29010df61bdb669d03d9c25e49d5698f193deca3cf6dEric Anholt } 2902364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt } 2903364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt} 2904364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt 2905364fcd8ee1af39e215338fba59306a14dd81c2b2Eric Anholt} /* extern "C" */ 2906