lp_state_fs.c revision 6b63e25b3d7a6ac0bd738c139ead0c7e7ad84368
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
373af91e938eb27b001404f11195fb06ff9b08903José Fonseca * Copyright 2009 VMware, Inc.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/**
305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file
315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Code generate the whole fragment pipeline.
325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * The fragment pipeline consists of the following stages:
345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * - early depth test
355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * - fragment shader
365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * - alpha test
37d84b8cb1a8e3ce846de9affe2f72457c6e698872Brian Paul * - depth/stencil test
385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * - blending
395811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
40272f399434ad6b33a8444c287c5126987a222864Brian Paul * This file has only the glue to assemble the fragment pipeline.  The actual
415811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * plumbing of converting Gallium state into LLVM IR is done elsewhere, in the
425811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * lp_bld_*.[ch] files, and in a complete generic and reusable way. Here we
435811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * muster the LLVM JIT execution engine to create a function that follows an
445811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * established binary interface and that can be called from C directly.
455811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
465811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * A big source of complexity here is that we often want to run different
475811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * stages with different precisions and data types and precisions. For example,
485811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * the fragment shader needs typically to be done in floats, but the
495811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * depth/stencil test and blending is better done in the type that most closely
505811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * matches the depth/stencil and color buffer respectively.
515811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
525811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Since the width of a SIMD vector register stays the same regardless of the
535811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * element type, different types imply different number of elements, so we must
545811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * code generate more instances of the stages with larger types to be able to
555811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * feed/consume the stages with smaller types.
565811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
575811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
585811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */
595811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
60f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul#include <limits.h>
61946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "pipe/p_defines.h"
6228486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h"
64f503b3dd9d6522abdabab1e25d0652c9d3079421José Fonseca#include "util/u_pointer.h"
65e3b38e5ec1ba93e3f1a1b3d5039c70ff7aa3ebe6José Fonseca#include "util/u_format.h"
66abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca#include "util/u_dump.h"
6781862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca#include "util/u_string.h"
6817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger#include "util/u_simple_list.h"
69a8270c7c29b141025f606c811812304a72e42d2eBrian Paul#include "os/os_time.h"
70946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "pipe/p_shader_tokens.h"
71946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "draw/draw_context.h"
72946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "tgsi/tgsi_dump.h"
73946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "tgsi/tgsi_scan.h"
74946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "tgsi/tgsi_parse.h"
75c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_type.h"
76c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_const.h"
77c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_conv.h"
78078eff659a7ef90691966d983f35ed9e4ce63901Vinson Lee#include "gallivm/lp_bld_init.h"
79c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_intr.h"
80c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_logic.h"
81c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_tgsi.h"
82c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_swizzle.h"
83c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_flow.h"
84c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_debug.h"
8539a12a73269b3eff46ba66fce03eff73dd5d54fbBrian Paul
8639a12a73269b3eff46ba66fce03eff73dd5d54fbBrian Paul#include "lp_bld_alpha.h"
8739a12a73269b3eff46ba66fce03eff73dd5d54fbBrian Paul#include "lp_bld_blend.h"
8839a12a73269b3eff46ba66fce03eff73dd5d54fbBrian Paul#include "lp_bld_depth.h"
8939a12a73269b3eff46ba66fce03eff73dd5d54fbBrian Paul#include "lp_bld_interp.h"
90e95ad2a2b521514eaec04f9b266ee030ecc639a3Brian Paul#include "lp_context.h"
91524ec6464d5c9d66b58c78c5e68c3bcb6a845f69José Fonseca#include "lp_debug.h"
92e95ad2a2b521514eaec04f9b266ee030ecc639a3Brian Paul#include "lp_perf.h"
9385999695829823e459e11822b4846ed1db5c055dJosé Fonseca#include "lp_setup.h"
9473af91e938eb27b001404f11195fb06ff9b08903José Fonseca#include "lp_state.h"
958be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca#include "lp_tex_sample.h"
9617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger#include "lp_flush.h"
97d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell#include "lp_state_fs.h"
9873af91e938eb27b001404f11195fb06ff9b08903José Fonseca
9973af91e938eb27b001404f11195fb06ff9b08903José Fonseca
100489af2a3ba467e4341cb8504a0e59cf5828864d4Brian Paul#include <llvm-c/Analysis.h>
1013d7479d70568c84354338d0da0b7bed4d296c169Brian Paul#include <llvm-c/BitWriter.h>
102489af2a3ba467e4341cb8504a0e59cf5828864d4Brian Paul
103489af2a3ba467e4341cb8504a0e59cf5828864d4Brian Paul
104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/** Fragment shader number (for debugging) */
10581862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonsecastatic unsigned fs_no = 0;
10681862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
10781862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
10898971802798354cdba45c421cc340ec938143e03José Fonseca/**
109d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Expand the relevent bits of mask_input to a 4-dword mask for the
110ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul * four pixels in a 2x2 quad.  This will set the four elements of the
111ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul * quad mask vector to 0 or ~0.
112d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell *
113d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * \param quad  which quad of the quad group to test, in [0,3]
114d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * \param mask_input  bitwise mask for the whole 4x4 stamp
115ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul */
116d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellstatic LLVMValueRef
117efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgenerate_quad_mask(struct gallivm_state *gallivm,
118d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                   struct lp_type fs_type,
119d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                   unsigned quad,
120d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                   LLVMValueRef mask_input) /* int32 */
121ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul{
122efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMBuilderRef builder = gallivm->builder;
123d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   struct lp_type mask_type;
124efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMTypeRef i32t = LLVMInt32TypeInContext(gallivm->context);
125d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   LLVMValueRef bits[4];
126d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   LLVMValueRef mask;
12767b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   int shift;
128ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul
129f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul   /*
130d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    * XXX: We'll need a different path for 16 x u8
131f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul    */
132d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   assert(fs_type.width == 32);
133d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   assert(fs_type.length == 4);
134d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   mask_type = lp_int_type(fs_type);
13546b5bd6cadd13f47c10aafe9194c90234db91a2aBrian Paul
136d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   /*
137d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    * mask_input >>= (quad * 4)
1389a10d14a441ca76c5c9ea8986a2eb4b5923a9b9fBrian Paul    */
13967b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   switch (quad) {
14067b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   case 0:
14167b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      shift = 0;
14267b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      break;
14367b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   case 1:
14467b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      shift = 2;
14567b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      break;
14667b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   case 2:
14767b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      shift = 8;
14867b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      break;
14967b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   case 3:
15067b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      shift = 10;
15167b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell      break;
152aeb83928fdc09d9310df0f94aaddf87d9635dc7eVinson Lee   default:
153aeb83928fdc09d9310df0f94aaddf87d9635dc7eVinson Lee      assert(0);
154aeb83928fdc09d9310df0f94aaddf87d9635dc7eVinson Lee      shift = 0;
15567b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   }
156ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul
157d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   mask_input = LLVMBuildLShr(builder,
158d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                              mask_input,
15967b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell                              LLVMConstInt(i32t, shift, 0),
160d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                              "");
161ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul
162d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   /*
163d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    * mask = { mask_input & (1 << i), for i in [0,3] }
164d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    */
165efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   mask = lp_build_broadcast(gallivm,
166efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                             lp_build_vec_type(gallivm, mask_type),
167efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                             mask_input);
1684461442849bfdb817334b38567136f7f9dabdf59Brian Paul
169d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   bits[0] = LLVMConstInt(i32t, 1 << 0, 0);
170d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   bits[1] = LLVMConstInt(i32t, 1 << 1, 0);
17167b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   bits[2] = LLVMConstInt(i32t, 1 << 4, 0);
17267b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell   bits[3] = LLVMConstInt(i32t, 1 << 5, 0);
17367b957781d8195b8f8867e994c03b68f8dc5c807Keith Whitwell
174d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   mask = LLVMBuildAnd(builder, mask, LLVMConstVector(bits, 4), "");
1754461442849bfdb817334b38567136f7f9dabdf59Brian Paul
176d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   /*
177d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    * mask = mask != 0 ? ~0 : 0
178d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell    */
179efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   mask = lp_build_compare(gallivm,
180d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                           mask_type, PIPE_FUNC_NOTEQUAL,
181d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                           mask,
182efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                           lp_build_const_int_vec(gallivm, mask_type, 0));
1834461442849bfdb817334b38567136f7f9dabdf59Brian Paul
184d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   return mask;
1852797f2bf57562c95a601a67edca3089641215cc4Brian Paul}
1862797f2bf57562c95a601a67edca3089641215cc4Brian Paul
1872797f2bf57562c95a601a67edca3089641215cc4Brian Paul
1885b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell#define EARLY_DEPTH_TEST  0x1
1895b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell#define LATE_DEPTH_TEST   0x2
1905b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell#define EARLY_DEPTH_WRITE 0x4
1915b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell#define LATE_DEPTH_WRITE  0x8
1925b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
1935b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwellstatic int
1945b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwellfind_output_by_semantic( const struct tgsi_shader_info *info,
1955b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell			 unsigned semantic,
1965b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell			 unsigned index )
1975b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell{
1985b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   int i;
1995b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2005b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   for (i = 0; i < info->num_outputs; i++)
2015b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      if (info->output_semantic_name[i] == semantic &&
2025b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell	  info->output_semantic_index[i] == index)
2035b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell	 return i;
2045b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2055b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   return -1;
2065b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell}
2075b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2082797f2bf57562c95a601a67edca3089641215cc4Brian Paul
209ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul/**
2105811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Generate the fragment shader, depth/stencil test, and alpha tests.
211ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul * \param i  which quad in the tile, in range [0,3]
212d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * \param partial_mask  if 1, do mask_input testing
21398971802798354cdba45c421cc340ec938143e03José Fonseca */
21498971802798354cdba45c421cc340ec938143e03José Fonsecastatic void
215efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgenerate_fs(struct gallivm_state *gallivm,
216efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul            struct lp_fragment_shader *shader,
21798971802798354cdba45c421cc340ec938143e03José Fonseca            const struct lp_fragment_shader_variant_key *key,
21898971802798354cdba45c421cc340ec938143e03José Fonseca            LLVMBuilderRef builder,
219b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca            struct lp_type type,
220635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca            LLVMValueRef context_ptr,
22198971802798354cdba45c421cc340ec938143e03José Fonseca            unsigned i,
2228009886b0092df2783472deaac1bcaad4a802c19Keith Whitwell            struct lp_build_interp_soa_context *interp,
2238be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca            struct lp_build_sampler_soa *sampler,
22498971802798354cdba45c421cc340ec938143e03José Fonseca            LLVMValueRef *pmask,
225c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell            LLVMValueRef (*color)[4],
226ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul            LLVMValueRef depth_ptr,
22722e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul            LLVMValueRef facing,
228d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell            unsigned partial_mask,
229d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell            LLVMValueRef mask_input,
23086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li            LLVMValueRef counter)
23173af91e938eb27b001404f11195fb06ff9b08903José Fonseca{
2325b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   const struct util_format_description *zs_format_desc = NULL;
23373af91e938eb27b001404f11195fb06ff9b08903José Fonseca   const struct tgsi_token *tokens = shader->base.tokens;
23473af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMTypeRef vec_type;
235635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   LLVMValueRef consts_ptr;
2366b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
2378009886b0092df2783472deaac1bcaad4a802c19Keith Whitwell   LLVMValueRef z;
2385b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   LLVMValueRef zs_value = NULL;
239521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   LLVMValueRef stencil_refs[2];
24098971802798354cdba45c421cc340ec938143e03José Fonseca   struct lp_build_mask_context mask;
241986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   boolean simple_shader = (shader->info.base.file_count[TGSI_FILE_SAMPLER] == 0 &&
242986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca                            shader->info.base.num_inputs < 3 &&
243986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca                            shader->info.base.num_instructions < 8);
24498971802798354cdba45c421cc340ec938143e03José Fonseca   unsigned attrib;
24598971802798354cdba45c421cc340ec938143e03José Fonseca   unsigned chan;
246c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   unsigned cbuf;
2475b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   unsigned depth_mode;
2485b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2495b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (key->depth.enabled ||
2505b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell       key->stencil[0].enabled ||
2515b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell       key->stencil[1].enabled) {
2525b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2535b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      zs_format_desc = util_format_description(key->zsbuf_format);
2545b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      assert(zs_format_desc);
2555b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
256986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca      if (!shader->info.base.writes_z) {
257986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca         if (key->alpha.enabled || shader->info.base.uses_kill)
2585b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell            /* With alpha test and kill, can do the depth test early
2595b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell             * and hopefully eliminate some quads.  But need to do a
2605b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell             * special deferred depth write once the final mask value
2615b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell             * is known.
2625b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell             */
2635b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell            depth_mode = EARLY_DEPTH_TEST | LATE_DEPTH_WRITE;
2645b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell         else
2655b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell            depth_mode = EARLY_DEPTH_TEST | EARLY_DEPTH_WRITE;
2665b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      }
2675b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      else {
2685b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell         depth_mode = LATE_DEPTH_TEST | LATE_DEPTH_WRITE;
2695b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      }
2705b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
2715b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      if (!(key->depth.enabled && key->depth.writemask) &&
2725b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell          !(key->stencil[0].enabled && key->stencil[0].writemask))
2735b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell         depth_mode &= ~(LATE_DEPTH_WRITE | EARLY_DEPTH_WRITE);
2745b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   }
2755b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   else {
2765b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      depth_mode = 0;
2775b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   }
27898971802798354cdba45c421cc340ec938143e03José Fonseca
279ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul   assert(i < 4);
28098971802798354cdba45c421cc340ec938143e03José Fonseca
281efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   stencil_refs[0] = lp_jit_context_stencil_ref_front_value(gallivm, context_ptr);
282efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   stencil_refs[1] = lp_jit_context_stencil_ref_back_value(gallivm, context_ptr);
28367b82fc395fc9972fc08233044057ab540c7ab59Brian Paul
284efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   vec_type = lp_build_vec_type(gallivm, type);
28598971802798354cdba45c421cc340ec938143e03José Fonseca
286efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   consts_ptr = lp_jit_context_constants(gallivm, context_ptr);
287635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
2888e6b925d2a963a2d5a403e106d7d25e3dcca0775José Fonseca   memset(outputs, 0, sizeof outputs);
2898e6b925d2a963a2d5a403e106d7d25e3dcca0775José Fonseca
2908e6b925d2a963a2d5a403e106d7d25e3dcca0775José Fonseca   /* Declare the color and z variables */
291c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   for(cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
2926b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard      for(chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) {
293efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul	 color[cbuf][chan] = lp_build_alloca(gallivm, vec_type, "color");
294c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      }
2958e6b925d2a963a2d5a403e106d7d25e3dcca0775José Fonseca   }
2968e6b925d2a963a2d5a403e106d7d25e3dcca0775José Fonseca
297ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul   /* do triangle edge testing */
298d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   if (partial_mask) {
299efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      *pmask = generate_quad_mask(gallivm, type,
300d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                                  i, mask_input);
3012797f2bf57562c95a601a67edca3089641215cc4Brian Paul   }
3022797f2bf57562c95a601a67edca3089641215cc4Brian Paul   else {
303efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      *pmask = lp_build_const_int_vec(gallivm, type, ~0);
3042797f2bf57562c95a601a67edca3089641215cc4Brian Paul   }
305ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul
3065771f3d483e882d9f5b6c5f3bdb3c39696623b66Brian Paul   /* 'mask' will control execution based on quad's pixel alive/killed state */
307efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_mask_begin(&mask, gallivm, type, *pmask);
308aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell
3095b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (!(depth_mode & EARLY_DEPTH_TEST) && !simple_shader)
310aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell      lp_build_mask_check(&mask);
311aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell
312efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_interp_soa_update_pos(interp, gallivm, i);
313aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell   z = interp->pos[2];
314aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell
3155b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (depth_mode & EARLY_DEPTH_TEST) {
316efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      lp_build_depth_stencil_test(gallivm,
3175b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &key->depth,
3185b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  key->stencil,
3195b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  type,
3205b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  zs_format_desc,
3215b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &mask,
3225b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  stencil_refs,
3235b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  z,
3245b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  depth_ptr, facing,
3255b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &zs_value,
3265b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  !simple_shader);
3275b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
32895c18abb03b035c6fa029cd0852f07fb39951279José Fonseca      if (depth_mode & EARLY_DEPTH_WRITE) {
32995c18abb03b035c6fa029cd0852f07fb39951279José Fonseca         lp_build_depth_write(builder, zs_format_desc, depth_ptr, zs_value);
33095c18abb03b035c6fa029cd0852f07fb39951279José Fonseca      }
3315b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   }
33298971802798354cdba45c421cc340ec938143e03José Fonseca
333efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_interp_soa_update_inputs(interp, gallivm, i);
3345b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
3355b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   /* Build the actual shader */
336efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_tgsi_soa(gallivm, tokens, type, &mask,
3371d6f3543a063ab9e740fd0c149dcce26c282d773Brian Paul                     consts_ptr, NULL, /* sys values array */
3381d6f3543a063ab9e740fd0c149dcce26c282d773Brian Paul                     interp->pos, interp->inputs,
339986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca                     outputs, sampler, &shader->info.base);
34098971802798354cdba45c421cc340ec938143e03José Fonseca
3415b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   /* Alpha test */
3425b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (key->alpha.enabled) {
343986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca      int color0 = find_output_by_semantic(&shader->info.base,
3445b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                           TGSI_SEMANTIC_COLOR,
3455b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                           0);
3465b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
347ffab84c9a27a229e6fa14c3de63868bb843c0f3eKeith Whitwell      if (color0 != -1 && outputs[color0][3]) {
3485b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell         LLVMValueRef alpha = LLVMBuildLoad(builder, outputs[color0][3], "alpha");
3495b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell         LLVMValueRef alpha_ref_value;
3505b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
351efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         alpha_ref_value = lp_jit_context_alpha_ref_value(gallivm, context_ptr);
352efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         alpha_ref_value = lp_build_broadcast(gallivm, vec_type, alpha_ref_value);
3535b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
354efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         lp_build_alpha_test(gallivm, key->alpha.func, type,
3555b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                             &mask, alpha, alpha_ref_value,
3565b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                             (depth_mode & LATE_DEPTH_TEST) != 0);
35798971802798354cdba45c421cc340ec938143e03José Fonseca      }
35898971802798354cdba45c421cc340ec938143e03José Fonseca   }
35998971802798354cdba45c421cc340ec938143e03José Fonseca
3605b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   /* Late Z test */
3615b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (depth_mode & LATE_DEPTH_TEST) {
362986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca      int pos0 = find_output_by_semantic(&shader->info.base,
3635b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                         TGSI_SEMANTIC_POSITION,
3645b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                         0);
3655b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell
366ffab84c9a27a229e6fa14c3de63868bb843c0f3eKeith Whitwell      if (pos0 != -1 && outputs[pos0][2]) {
367a0add0446ca9dce6d4a96014c42ba6cf3a73a44aJosé Fonseca         z = LLVMBuildLoad(builder, outputs[pos0][2], "output.z");
3685b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      }
3696a405b4a21ac1fa45a93da37ce6b95d98d17f0e2José Fonseca
370efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      lp_build_depth_stencil_test(gallivm,
3715b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &key->depth,
3725b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  key->stencil,
3735b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  type,
3745b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  zs_format_desc,
3755b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &mask,
3765b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  stencil_refs,
3775b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  z,
3785b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  depth_ptr, facing,
3795b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  &zs_value,
3805b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                  !simple_shader);
3815b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      /* Late Z write */
38295c18abb03b035c6fa029cd0852f07fb39951279José Fonseca      if (depth_mode & LATE_DEPTH_WRITE) {
38395c18abb03b035c6fa029cd0852f07fb39951279José Fonseca         lp_build_depth_write(builder, zs_format_desc, depth_ptr, zs_value);
38495c18abb03b035c6fa029cd0852f07fb39951279José Fonseca      }
3855b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   }
3865b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   else if ((depth_mode & EARLY_DEPTH_TEST) &&
3875b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell            (depth_mode & LATE_DEPTH_WRITE))
3885b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   {
3895b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      /* Need to apply a reduced mask to the depth write.  Reload the
3905b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell       * depth value, update from zs_value with the new mask value and
3915b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell       * write that out.
3925b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell       */
393efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      lp_build_deferred_depth_write(gallivm,
3945b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                    type,
3955b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                    zs_format_desc,
3965b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                    &mask,
3975b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                    depth_ptr,
3985b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell                                    zs_value);
3995b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   }
4006a405b4a21ac1fa45a93da37ce6b95d98d17f0e2José Fonseca
4016a405b4a21ac1fa45a93da37ce6b95d98d17f0e2José Fonseca
4025b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   /* Color write  */
403986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   for (attrib = 0; attrib < shader->info.base.num_outputs; ++attrib)
4045b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   {
405ac98519c4eed0daf770a9ba380056978e4420352Keith Whitwell      if (shader->info.base.output_semantic_name[attrib] == TGSI_SEMANTIC_COLOR &&
406ac98519c4eed0daf770a9ba380056978e4420352Keith Whitwell          shader->info.base.output_semantic_index[attrib] < key->nr_cbufs)
4075b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell      {
408986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca         unsigned cbuf = shader->info.base.output_semantic_index[attrib];
4096b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard         for(chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) {
410f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell            if(outputs[attrib][chan]) {
411f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell               /* XXX: just initialize outputs to point at colors[] and
412f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell                * skip this.
413f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell                */
414f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell               LLVMValueRef out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
415f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell               lp_build_name(out, "color%u.%u.%c", i, attrib, "rgba"[chan]);
416f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell               LLVMBuildStore(builder, out, color[cbuf][chan]);
417f0bd76f28d17da6eabf977a7e619e4ff943a70c7Keith Whitwell            }
41898971802798354cdba45c421cc340ec938143e03José Fonseca         }
41998971802798354cdba45c421cc340ec938143e03José Fonseca      }
42098971802798354cdba45c421cc340ec938143e03José Fonseca   }
42198971802798354cdba45c421cc340ec938143e03José Fonseca
4225b7eb868fde98388d80601d8dea39e679828f42fKeith Whitwell   if (counter)
423efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      lp_build_occlusion_count(gallivm, type,
424cc40abad519cc0f765c6d8f6fad4154bed8dd9c2José Fonseca                               lp_build_mask_value(&mask), counter);
42598971802798354cdba45c421cc340ec938143e03José Fonseca
426cc40abad519cc0f765c6d8f6fad4154bed8dd9c2José Fonseca   *pmask = lp_build_mask_end(&mask);
42798971802798354cdba45c421cc340ec938143e03José Fonseca}
42898971802798354cdba45c421cc340ec938143e03José Fonseca
42998971802798354cdba45c421cc340ec938143e03José Fonseca
43098971802798354cdba45c421cc340ec938143e03José Fonseca/**
4315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Generate color blending and color output.
432f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param rt  the render target index (to index blend, colormask state)
433f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param type  the pixel color type
434f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param context_ptr  pointer to the runtime JIT context
435f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param mask  execution mask (active fragment/pixel mask)
436f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param src  colors from the fragment shader
437f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul * \param dst_ptr  the destination color buffer pointer
43898971802798354cdba45c421cc340ec938143e03José Fonseca */
43998971802798354cdba45c421cc340ec938143e03José Fonsecastatic void
440efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgenerate_blend(struct gallivm_state *gallivm,
441efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul               const struct pipe_blend_state *blend,
442f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul               unsigned rt,
44398971802798354cdba45c421cc340ec938143e03José Fonseca               LLVMBuilderRef builder,
444b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca               struct lp_type type,
445635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca               LLVMValueRef context_ptr,
44698971802798354cdba45c421cc340ec938143e03José Fonseca               LLVMValueRef mask,
44798971802798354cdba45c421cc340ec938143e03José Fonseca               LLVMValueRef *src,
448aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell               LLVMValueRef dst_ptr,
449aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell               boolean do_branch)
45098971802798354cdba45c421cc340ec938143e03José Fonseca{
45198971802798354cdba45c421cc340ec938143e03José Fonseca   struct lp_build_context bld;
452c3c80c5c22f9ce7fabba90daa5d5142e5fb1c012José Fonseca   struct lp_build_mask_context mask_ctx;
45398971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMTypeRef vec_type;
454635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   LLVMValueRef const_ptr;
45598971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMValueRef con[4];
45698971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMValueRef dst[4];
45798971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMValueRef res[4];
45898971802798354cdba45c421cc340ec938143e03José Fonseca   unsigned chan;
45998971802798354cdba45c421cc340ec938143e03José Fonseca
460efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_context_init(&bld, gallivm, type);
461c3c80c5c22f9ce7fabba90daa5d5142e5fb1c012José Fonseca
462efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_mask_begin(&mask_ctx, gallivm, type, mask);
463aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell   if (do_branch)
464aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell      lp_build_mask_check(&mask_ctx);
465c3c80c5c22f9ce7fabba90daa5d5142e5fb1c012José Fonseca
466efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   vec_type = lp_build_vec_type(gallivm, type);
46798971802798354cdba45c421cc340ec938143e03José Fonseca
468efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   const_ptr = lp_jit_context_blend_color(gallivm, context_ptr);
469635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   const_ptr = LLVMBuildBitCast(builder, const_ptr,
470635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca                                LLVMPointerType(vec_type, 0), "");
471635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
472f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul   /* load constant blend color and colors from the dest color buffer */
47398971802798354cdba45c421cc340ec938143e03José Fonseca   for(chan = 0; chan < 4; ++chan) {
474efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      LLVMValueRef index = lp_build_const_int32(gallivm, chan);
475635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca      con[chan] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, const_ptr, &index, 1, ""), "");
47698971802798354cdba45c421cc340ec938143e03José Fonseca
47798971802798354cdba45c421cc340ec938143e03José Fonseca      dst[chan] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, dst_ptr, &index, 1, ""), "");
47898971802798354cdba45c421cc340ec938143e03José Fonseca
47998971802798354cdba45c421cc340ec938143e03José Fonseca      lp_build_name(con[chan], "con.%c", "rgba"[chan]);
48098971802798354cdba45c421cc340ec938143e03José Fonseca      lp_build_name(dst[chan], "dst.%c", "rgba"[chan]);
48198971802798354cdba45c421cc340ec938143e03José Fonseca   }
48298971802798354cdba45c421cc340ec938143e03José Fonseca
483f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul   /* do blend */
484efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_blend_soa(gallivm, blend, type, rt, src, dst, con, res);
48598971802798354cdba45c421cc340ec938143e03José Fonseca
486f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul   /* store results to color buffer */
48798971802798354cdba45c421cc340ec938143e03José Fonseca   for(chan = 0; chan < 4; ++chan) {
488f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul      if(blend->rt[rt].colormask & (1 << chan)) {
489efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         LLVMValueRef index = lp_build_const_int32(gallivm, chan);
4904c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca         lp_build_name(res[chan], "res.%c", "rgba"[chan]);
4914c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca         res[chan] = lp_build_select(&bld, mask, res[chan], dst[chan]);
4924c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca         LLVMBuildStore(builder, res[chan], LLVMBuildGEP(builder, dst_ptr, &index, 1, ""));
4934c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca      }
49498971802798354cdba45c421cc340ec938143e03José Fonseca   }
495c3c80c5c22f9ce7fabba90daa5d5142e5fb1c012José Fonseca
496c3c80c5c22f9ce7fabba90daa5d5142e5fb1c012José Fonseca   lp_build_mask_end(&mask_ctx);
49798971802798354cdba45c421cc340ec938143e03José Fonseca}
49898971802798354cdba45c421cc340ec938143e03José Fonseca
49998971802798354cdba45c421cc340ec938143e03José Fonseca
5005811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/**
5015811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Generate the runtime callable function for the whole fragment pipeline.
502866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul * Note that the function which we generate operates on a block of 16
503866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul * pixels at at time.  The block contains 2x2 quads.  Each quad contains
504866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul * 2x2 pixels.
5055811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */
5063b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paulstatic void
507efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgenerate_fragment(struct llvmpipe_context *lp,
50898971802798354cdba45c421cc340ec938143e03José Fonseca                  struct lp_fragment_shader *shader,
5092797f2bf57562c95a601a67edca3089641215cc4Brian Paul                  struct lp_fragment_shader_variant *variant,
510d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                  unsigned partial_mask)
51198971802798354cdba45c421cc340ec938143e03José Fonseca{
512efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   struct gallivm_state *gallivm = lp->gallivm;
5133b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul   const struct lp_fragment_shader_variant_key *key = &variant->key;
5145b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
51581862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   char func_name[256];
516b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   struct lp_type fs_type;
517b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   struct lp_type blend_type;
51898971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMTypeRef fs_elem_type;
51998971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMTypeRef blend_vec_type;
520d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   LLVMTypeRef arg_types[11];
52173af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMTypeRef func_type;
522efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
523efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMTypeRef int8_type = LLVMInt8TypeInContext(gallivm->context);
524c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca   LLVMValueRef context_ptr;
5257c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca   LLVMValueRef x;
5267c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca   LLVMValueRef y;
52773af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMValueRef a0_ptr;
52873af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMValueRef dadx_ptr;
52973af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMValueRef dady_ptr;
530c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   LLVMValueRef color_ptr_ptr;
53139352b34438affc36ce22852bb55359d304a522cJosé Fonseca   LLVMValueRef depth_ptr;
532d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   LLVMValueRef mask_input;
533d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   LLVMValueRef counter = NULL;
53473af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMBasicBlockRef block;
53573af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMBuilderRef builder;
5368be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
537f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   struct lp_build_interp_soa_context interp;
53898971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMValueRef fs_mask[LP_MAX_VECTOR_LENGTH];
5396b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   LLVMValueRef fs_out_color[PIPE_MAX_COLOR_BUFS][TGSI_NUM_CHANNELS][LP_MAX_VECTOR_LENGTH];
54098971802798354cdba45c421cc340ec938143e03José Fonseca   LLVMValueRef blend_mask;
5413b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   LLVMValueRef function;
54222e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   LLVMValueRef facing;
54395c18abb03b035c6fa029cd0852f07fb39951279José Fonseca   const struct util_format_description *zs_format_desc;
54498971802798354cdba45c421cc340ec938143e03José Fonseca   unsigned num_fs;
54539352b34438affc36ce22852bb55359d304a522cJosé Fonseca   unsigned i;
54639352b34438affc36ce22852bb55359d304a522cJosé Fonseca   unsigned chan;
547c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   unsigned cbuf;
5487e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul   boolean cbuf0_write_all;
54973af91e938eb27b001404f11195fb06ff9b08903José Fonseca
5505b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   /* Adjust color input interpolation according to flatshade state:
5515b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell    */
5520072acd447dc6be652e63752e50215c3105322c8Keith Whitwell   memcpy(inputs, shader->inputs, shader->info.base.num_inputs * sizeof inputs[0]);
5530072acd447dc6be652e63752e50215c3105322c8Keith Whitwell   for (i = 0; i < shader->info.base.num_inputs; i++) {
5545b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      if (inputs[i].interp == LP_INTERP_COLOR) {
5555b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 if (key->flatshade)
5565b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	    inputs[i].interp = LP_INTERP_CONSTANT;
5575b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 else
5585b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	    inputs[i].interp = LP_INTERP_LINEAR;
5595b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      }
5605b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   }
5615b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
5627e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul   /* check if writes to cbuf[0] are to be copied to all cbufs */
5637e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul   cbuf0_write_all = FALSE;
5647e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul   for (i = 0;i < shader->info.base.num_properties; i++) {
5657e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul      if (shader->info.base.properties[i].name ==
5667e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul          TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
5677e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul         cbuf0_write_all = TRUE;
5687e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul         break;
5697e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul      }
5707e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul   }
5719ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
5725811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca   /* TODO: actually pick these based on the fs and color buffer
5735811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    * characteristics. */
5745811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
575b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   memset(&fs_type, 0, sizeof fs_type);
57698971802798354cdba45c421cc340ec938143e03José Fonseca   fs_type.floating = TRUE; /* floating point values */
57798971802798354cdba45c421cc340ec938143e03José Fonseca   fs_type.sign = TRUE;     /* values are signed */
57898971802798354cdba45c421cc340ec938143e03José Fonseca   fs_type.norm = FALSE;    /* values are not limited to [0,1] or [-1,1] */
57998971802798354cdba45c421cc340ec938143e03José Fonseca   fs_type.width = 32;      /* 32-bit float */
580866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul   fs_type.length = 4;      /* 4 elements per vector */
581866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul   num_fs = 4;              /* number of quads per block */
58273af91e938eb27b001404f11195fb06ff9b08903José Fonseca
583b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   memset(&blend_type, 0, sizeof blend_type);
58498971802798354cdba45c421cc340ec938143e03José Fonseca   blend_type.floating = FALSE; /* values are integers */
58598971802798354cdba45c421cc340ec938143e03José Fonseca   blend_type.sign = FALSE;     /* values are unsigned */
58698971802798354cdba45c421cc340ec938143e03José Fonseca   blend_type.norm = TRUE;      /* values are in [0,1] or [-1,1] */
58798971802798354cdba45c421cc340ec938143e03José Fonseca   blend_type.width = 8;        /* 8-bit ubyte values */
58898971802798354cdba45c421cc340ec938143e03José Fonseca   blend_type.length = 16;      /* 16 elements per vector */
58998971802798354cdba45c421cc340ec938143e03José Fonseca
5905811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca   /*
5915811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    * Generate the function prototype. Any change here must be reflected in
59208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca    * lp_jit.h's lp_jit_frag_func function pointer type, and vice-versa.
5935811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    */
5945811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
595efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   fs_elem_type = lp_build_elem_type(gallivm, fs_type);
59698971802798354cdba45c421cc340ec938143e03José Fonseca
597efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   blend_vec_type = lp_build_vec_type(gallivm, blend_type);
59873af91e938eb27b001404f11195fb06ff9b08903José Fonseca
59981862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   util_snprintf(func_name, sizeof(func_name), "fs%u_variant%u_%s",
600d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell		 shader->no, variant->no, partial_mask ? "partial" : "whole");
60181862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
602efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[0] = lp_jit_get_context_type(lp);         /* context */
603efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[1] = int32_type;                          /* x */
604efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[2] = int32_type;                          /* y */
605efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[3] = int32_type;                          /* facing */
60622e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   arg_types[4] = LLVMPointerType(fs_elem_type, 0);    /* a0 */
60722e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   arg_types[5] = LLVMPointerType(fs_elem_type, 0);    /* dadx */
60822e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   arg_types[6] = LLVMPointerType(fs_elem_type, 0);    /* dady */
60922e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   arg_types[7] = LLVMPointerType(LLVMPointerType(blend_vec_type, 0), 0);  /* color */
610efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[8] = LLVMPointerType(int8_type, 0);       /* depth */
611efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[9] = int32_type;                          /* mask_input */
612efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   arg_types[10] = LLVMPointerType(int32_type, 0);     /* counter */
61373af91e938eb27b001404f11195fb06ff9b08903José Fonseca
614efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   func_type = LLVMFunctionType(LLVMVoidTypeInContext(gallivm->context),
615efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                                arg_types, Elements(arg_types), 0);
61673af91e938eb27b001404f11195fb06ff9b08903José Fonseca
617efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   function = LLVMAddFunction(gallivm->module, func_name, func_type);
6183b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   LLVMSetFunctionCallConv(function, LLVMCCallConv);
6193b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul
620d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   variant->function[partial_mask] = function;
6213b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul
622c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   /* XXX: need to propagate noalias down into color param now we are
623c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell    * passing a pointer-to-pointer?
624c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell    */
625a7f9b915aeade96d8ca58d70a1f1d42cd6a16e3dJosé Fonseca   for(i = 0; i < Elements(arg_types); ++i)
6267c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca      if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
6273b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul         LLVMAddAttribute(LLVMGetParam(function, i), LLVMNoAliasAttribute);
6283b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul
6293b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   context_ptr  = LLVMGetParam(function, 0);
6303b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   x            = LLVMGetParam(function, 1);
6313b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   y            = LLVMGetParam(function, 2);
63222e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   facing       = LLVMGetParam(function, 3);
63322e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   a0_ptr       = LLVMGetParam(function, 4);
63422e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   dadx_ptr     = LLVMGetParam(function, 5);
63522e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   dady_ptr     = LLVMGetParam(function, 6);
63622e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   color_ptr_ptr = LLVMGetParam(function, 7);
63722e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul   depth_ptr    = LLVMGetParam(function, 8);
638d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   mask_input   = LLVMGetParam(function, 9);
6397c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca
640c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca   lp_build_name(context_ptr, "context");
6417c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca   lp_build_name(x, "x");
6427c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca   lp_build_name(y, "y");
6435999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca   lp_build_name(a0_ptr, "a0");
6445999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca   lp_build_name(dadx_ptr, "dadx");
6455999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca   lp_build_name(dady_ptr, "dady");
646f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul   lp_build_name(color_ptr_ptr, "color_ptr_ptr");
64739352b34438affc36ce22852bb55359d304a522cJosé Fonseca   lp_build_name(depth_ptr, "depth");
648d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell   lp_build_name(mask_input, "mask_input");
64973af91e938eb27b001404f11195fb06ff9b08903José Fonseca
65086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li   if (key->occlusion_count) {
651d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell      counter = LLVMGetParam(function, 10);
65286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li      lp_build_name(counter, "counter");
65386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li   }
65486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
6555811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca   /*
6565811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    * Function body
6575811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    */
6585811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
659efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   block = LLVMAppendBasicBlockInContext(gallivm->context, function, "entry");
660efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   builder = gallivm->builder;
661efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   assert(builder);
66273af91e938eb27b001404f11195fb06ff9b08903José Fonseca   LLVMPositionBuilderAtEnd(builder, block);
66373af91e938eb27b001404f11195fb06ff9b08903José Fonseca
6646ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca   /*
6656ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca    * The shader input interpolation info is not explicitely baked in the
6666ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca    * shader key, but everything it derives from (TGSI, and flatshade) is
6676ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca    * already included in the shader key.
6686ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca    */
66986f450060debebd66dd5fb72f83800d7634efeaaKeith Whitwell   lp_build_interp_soa_init(&interp,
670efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                            gallivm,
6710072acd447dc6be652e63752e50215c3105322c8Keith Whitwell                            shader->info.base.num_inputs,
6725b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell                            inputs,
67386f450060debebd66dd5fb72f83800d7634efeaaKeith Whitwell                            builder, fs_type,
674f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                            a0_ptr, dadx_ptr, dady_ptr,
675147dc2354c21f098a2a63a085c21ec10252cab24José Fonseca                            x, y);
676f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
677e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   /* code generated texture sampling */
678e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler = lp_llvm_sampler_soa_create(key->sampler, context_ptr);
679c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
680866e6856d39efe9b1ec739587f420a640ad8618eBrian Paul   /* loop over quads in the block */
68195c18abb03b035c6fa029cd0852f07fb39951279José Fonseca   zs_format_desc = util_format_description(key->zsbuf_format);
68295c18abb03b035c6fa029cd0852f07fb39951279José Fonseca
68398971802798354cdba45c421cc340ec938143e03José Fonseca   for(i = 0; i < num_fs; ++i) {
684efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      LLVMValueRef depth_offset = LLVMConstInt(int32_type,
68595c18abb03b035c6fa029cd0852f07fb39951279José Fonseca                                               i*fs_type.length*zs_format_desc->block.bits/8,
68695c18abb03b035c6fa029cd0852f07fb39951279José Fonseca                                               0);
6876b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard      LLVMValueRef out_color[PIPE_MAX_COLOR_BUFS][TGSI_NUM_CHANNELS];
68898971802798354cdba45c421cc340ec938143e03José Fonseca      LLVMValueRef depth_ptr_i;
68998971802798354cdba45c421cc340ec938143e03José Fonseca
69095c18abb03b035c6fa029cd0852f07fb39951279José Fonseca      depth_ptr_i = LLVMBuildGEP(builder, depth_ptr, &depth_offset, 1, "");
69198971802798354cdba45c421cc340ec938143e03José Fonseca
692efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      generate_fs(gallivm,
693efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                  shader, key,
69498971802798354cdba45c421cc340ec938143e03José Fonseca                  builder,
69598971802798354cdba45c421cc340ec938143e03José Fonseca                  fs_type,
696635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca                  context_ptr,
69798971802798354cdba45c421cc340ec938143e03José Fonseca                  i,
698f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  &interp,
6998be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                  sampler,
700ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul                  &fs_mask[i], /* output */
70198971802798354cdba45c421cc340ec938143e03José Fonseca                  out_color,
702ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul                  depth_ptr_i,
70322e6dc387039e79f6d1435ae8b7422a6514d5d10Brian Paul                  facing,
704d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                  partial_mask,
705d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                  mask_input,
706d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                  counter);
70798971802798354cdba45c421cc340ec938143e03José Fonseca
7087e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul      for (cbuf = 0; cbuf < key->nr_cbufs; cbuf++)
7096b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard         for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan)
7107e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul            fs_out_color[cbuf][chan][i] =
7117e86d9bd8c48626c9f2dbd8b96da055e329d5bc1Brian Paul               out_color[cbuf * !cbuf0_write_all][chan];
71298971802798354cdba45c421cc340ec938143e03José Fonseca   }
71339352b34438affc36ce22852bb55359d304a522cJosé Fonseca
7148be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   sampler->destroy(sampler);
7158be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca
716c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   /* Loop over color outputs / color buffers to do blending.
7175811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca    */
718c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   for(cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
719c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      LLVMValueRef color_ptr;
720efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      LLVMValueRef index = lp_build_const_int32(gallivm, cbuf);
7216b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard      LLVMValueRef blend_in_color[TGSI_NUM_CHANNELS];
722f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul      unsigned rt;
7235811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
724c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      /*
725c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell       * Convert the fs's output color and mask to fit to the blending type.
726c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell       */
7276b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard      for(chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) {
72840d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell         LLVMValueRef fs_color_vals[LP_MAX_VECTOR_LENGTH];
72940d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell
73040d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell         for (i = 0; i < num_fs; i++) {
73140d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell            fs_color_vals[i] =
73240d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell               LLVMBuildLoad(builder, fs_out_color[cbuf][chan][i], "fs_color_vals");
73340d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell         }
73440d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell
735efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul	 lp_build_conv(gallivm, fs_type, blend_type,
73640d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell                       fs_color_vals,
73740d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell                       num_fs,
738c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell		       &blend_in_color[chan], 1);
73940d7be52619fbff2479dcdf56929e3e0c5b12e72Keith Whitwell
740c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell	 lp_build_name(blend_in_color[chan], "color%d.%c", cbuf, "rgba"[chan]);
741c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      }
742635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
743d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell      if (partial_mask || !variant->opaque) {
744efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         lp_build_conv_mask(lp->gallivm, fs_type, blend_type,
745d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                            fs_mask, num_fs,
746d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                            &blend_mask, 1);
747d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell      } else {
748efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         blend_mask = lp_build_const_int_vec(lp->gallivm, blend_type, ~0);
749d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell      }
750c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell
751c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      color_ptr = LLVMBuildLoad(builder,
752c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell				LLVMBuildGEP(builder, color_ptr_ptr, &index, 1, ""),
753c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell				"");
754c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      lp_build_name(color_ptr, "color_ptr%d", cbuf);
755c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell
756f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul      /* which blend/colormask state to use */
757f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul      rt = key->blend.independent_blend_enable ? cbuf : 0;
758f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul
759c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell      /*
760c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell       * Blending.
761c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell       */
762aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell      {
763aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell         /* Could the 4x4 have been killed?
764aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell          */
765aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell         boolean do_branch = ((key->depth.enabled || key->stencil[0].enabled) &&
766aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                              !key->alpha.enabled &&
767986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca                              !shader->info.base.uses_kill);
768aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell
769efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         generate_blend(lp->gallivm,
770efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                        &key->blend,
771aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        rt,
772aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        builder,
773aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        blend_type,
774aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        context_ptr,
775aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        blend_mask,
776aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        blend_in_color,
777aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        color_ptr,
778aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell                        do_branch);
779aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell      }
78073af91e938eb27b001404f11195fb06ff9b08903José Fonseca   }
78173af91e938eb27b001404f11195fb06ff9b08903José Fonseca
7825811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca   LLVMBuildRetVoid(builder);
78373af91e938eb27b001404f11195fb06ff9b08903José Fonseca
784f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul   /* Verify the LLVM IR.  If invalid, dump and abort */
7854ae3e88dc9856f2f32c37dd04a3321765ed61e07José Fonseca#ifdef DEBUG
7863b1920a34903dfb753bc2a0461fef204d39846c6Brian Paul   if(LLVMVerifyFunction(function, LLVMPrintMessageAction)) {
787f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul      if (1)
7888ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca         lp_debug_dump_value(function);
789f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul      abort();
790a02ecdf8c2fc5783a4bc82e8cd9d36f0dec7ccecJosé Fonseca   }
7914ae3e88dc9856f2f32c37dd04a3321765ed61e07José Fonseca#endif
792a02ecdf8c2fc5783a4bc82e8cd9d36f0dec7ccecJosé Fonseca
793f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul   /* Apply optimizations to LLVM IR */
794efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMRunFunctionPassManager(gallivm->passmgr, function);
79573af91e938eb27b001404f11195fb06ff9b08903José Fonseca
796954965366fee3fa2eec8a11b6663d4cf218e1d5dKeith Whitwell   if ((gallivm_debug & GALLIVM_DEBUG_IR) || (LP_DEBUG & DEBUG_FS)) {
797f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul      /* Print the LLVM IR to stderr */
7988ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca      lp_debug_dump_value(function);
7992584c5bd253e53ba052356360a33b5ec976e9716José Fonseca      debug_printf("\n");
8002584c5bd253e53ba052356360a33b5ec976e9716José Fonseca   }
80173af91e938eb27b001404f11195fb06ff9b08903José Fonseca
8023d7479d70568c84354338d0da0b7bed4d296c169Brian Paul   /* Dump byte code to a file */
8033d7479d70568c84354338d0da0b7bed4d296c169Brian Paul   if (0) {
804efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      LLVMWriteBitcodeToFile(gallivm->module, "llvmpipe.bc");
8053d7479d70568c84354338d0da0b7bed4d296c169Brian Paul   }
8063d7479d70568c84354338d0da0b7bed4d296c169Brian Paul
8076cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   variant->nr_instrs += lp_build_count_instructions(function);
808f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul   /*
809f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul    * Translate the LLVM IR into machine code.
810f4321fbd961a0a891c7f40b16efc61aa791e03a9Brian Paul    */
8118dc8c3f5b11d5f158b0027d1501555c898e0451eBrian Paul   {
812efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      void *f = LLVMGetPointerToGlobal(gallivm->engine, function);
8138dc8c3f5b11d5f158b0027d1501555c898e0451eBrian Paul
814d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell      variant->jit_function[partial_mask] = (lp_jit_frag_func)pointer_to_func(f);
81573af91e938eb27b001404f11195fb06ff9b08903José Fonseca
816954965366fee3fa2eec8a11b6663d4cf218e1d5dKeith Whitwell      if ((gallivm_debug & GALLIVM_DEBUG_ASM) || (LP_DEBUG & DEBUG_FS)) {
8178dc8c3f5b11d5f158b0027d1501555c898e0451eBrian Paul         lp_disassemble(f);
8188a3bcba12c19049eb91cb8ce865212d75be5c859José Fonseca      }
819042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin      lp_func_delete_body(function);
8208dc8c3f5b11d5f158b0027d1501555c898e0451eBrian Paul   }
8213b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul}
8223b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul
8233b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul
824c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paulstatic void
825c2a036d4efeca80263e4d212532e46dfc525b9daBrian Pauldump_fs_variant_key(const struct lp_fragment_shader_variant_key *key)
826c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul{
827c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   unsigned i;
828c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
829d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul   debug_printf("fs variant %p:\n", (void *) key);
830d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul
831446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca   if (key->flatshade) {
832446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca      debug_printf("flatshade = 1\n");
833446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca   }
83400989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   for (i = 0; i < key->nr_cbufs; ++i) {
83500989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      debug_printf("cbuf_format[%u] = %s\n", i, util_format_name(key->cbuf_format[i]));
83600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   }
837c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   if (key->depth.enabled) {
838c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      debug_printf("depth.format = %s\n", util_format_name(key->zsbuf_format));
839c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      debug_printf("depth.func = %s\n", util_dump_func(key->depth.func, TRUE));
840c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      debug_printf("depth.writemask = %u\n", key->depth.writemask);
841c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
842c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
843c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   for (i = 0; i < 2; ++i) {
844c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      if (key->stencil[i].enabled) {
845c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].func = %s\n", i, util_dump_func(key->stencil[i].func, TRUE));
846c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].fail_op = %s\n", i, util_dump_stencil_op(key->stencil[i].fail_op, TRUE));
847c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].zpass_op = %s\n", i, util_dump_stencil_op(key->stencil[i].zpass_op, TRUE));
848c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].zfail_op = %s\n", i, util_dump_stencil_op(key->stencil[i].zfail_op, TRUE));
849c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].valuemask = 0x%x\n", i, key->stencil[i].valuemask);
850c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul         debug_printf("stencil[%u].writemask = 0x%x\n", i, key->stencil[i].writemask);
851c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      }
852c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
853c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
854c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   if (key->alpha.enabled) {
855c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      debug_printf("alpha.func = %s\n", util_dump_func(key->alpha.func, TRUE));
856c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
857c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
858446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca   if (key->occlusion_count) {
859446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca      debug_printf("occlusion_count = 1\n");
860446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca   }
861446dbb921762710d678486f3f5a6dfdf318fe34cJosé Fonseca
862c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   if (key->blend.logicop_enable) {
86375189ef960d2f7001d2b24e7c1939d0a647c0cf1Brian Paul      debug_printf("blend.logicop_func = %s\n", util_dump_logicop(key->blend.logicop_func, TRUE));
864c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
865c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   else if (key->blend.rt[0].blend_enable) {
866c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul      debug_printf("blend.rgb_func = %s\n",   util_dump_blend_func  (key->blend.rt[0].rgb_func, TRUE));
867d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul      debug_printf("blend.rgb_src_factor = %s\n",   util_dump_blend_factor(key->blend.rt[0].rgb_src_factor, TRUE));
868d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul      debug_printf("blend.rgb_dst_factor = %s\n",   util_dump_blend_factor(key->blend.rt[0].rgb_dst_factor, TRUE));
869d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul      debug_printf("blend.alpha_func = %s\n",       util_dump_blend_func  (key->blend.rt[0].alpha_func, TRUE));
870d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul      debug_printf("blend.alpha_src_factor = %s\n", util_dump_blend_factor(key->blend.rt[0].alpha_src_factor, TRUE));
871d574ffbb4d3a5e15a0e309686d3888c3112fcf21Brian Paul      debug_printf("blend.alpha_dst_factor = %s\n", util_dump_blend_factor(key->blend.rt[0].alpha_dst_factor, TRUE));
872c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
873c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   debug_printf("blend.colormask = 0x%x\n", key->blend.rt[0].colormask);
874591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell   for (i = 0; i < key->nr_samplers; ++i) {
875591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("sampler[%u] = \n", i);
876591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .format = %s\n",
877591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_format_name(key->sampler[i].format));
878591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .target = %s\n",
879591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_target(key->sampler[i].target, TRUE));
880591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .pot = %u %u %u\n",
881591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   key->sampler[i].pot_width,
882591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   key->sampler[i].pot_height,
883591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   key->sampler[i].pot_depth);
884591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .wrap = %s %s %s\n",
885591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_wrap(key->sampler[i].wrap_s, TRUE),
886591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_wrap(key->sampler[i].wrap_t, TRUE),
887591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_wrap(key->sampler[i].wrap_r, TRUE));
888591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .min_img_filter = %s\n",
889591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_filter(key->sampler[i].min_img_filter, TRUE));
890591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .min_mip_filter = %s\n",
891591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_mipfilter(key->sampler[i].min_mip_filter, TRUE));
892591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .mag_img_filter = %s\n",
893591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell                   util_dump_tex_filter(key->sampler[i].mag_img_filter, TRUE));
894591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      if (key->sampler[i].compare_mode != PIPE_TEX_COMPARE_NONE)
895591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell         debug_printf("  .compare_func = %s\n", util_dump_func(key->sampler[i].compare_func, TRUE));
896591e1bc34f5a5dd065614deae41b59682f59ac08Keith Whitwell      debug_printf("  .normalized_coords = %u\n", key->sampler[i].normalized_coords);
8971c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca      debug_printf("  .min_max_lod_equal = %u\n", key->sampler[i].min_max_lod_equal);
8981c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca      debug_printf("  .lod_bias_non_zero = %u\n", key->sampler[i].lod_bias_non_zero);
8991c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca      debug_printf("  .apply_min_lod = %u\n", key->sampler[i].apply_min_lod);
9001c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca      debug_printf("  .apply_max_lod = %u\n", key->sampler[i].apply_max_lod);
901c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul   }
902c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul}
903c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
904c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
90571e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwellvoid
90671e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwelllp_debug_fs_variant(const struct lp_fragment_shader_variant *variant)
90771e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell{
90871e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell   debug_printf("llvmpipe: Fragment shader #%u variant #%u:\n",
90971e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell                variant->shader->no, variant->no);
91071e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell   tgsi_dump(variant->shader->base.tokens, 0);
91171e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell   dump_fs_variant_key(&variant->key);
91271e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell   debug_printf("variant->opaque = %u\n", variant->opaque);
91371e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell   debug_printf("\n");
91471e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell}
915c2a036d4efeca80263e4d212532e46dfc525b9daBrian Paul
916efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
917efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/**
918efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Generate a new fragment shader variant from the shader code and
919efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * other state indicated by the key.
920efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul */
9213b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paulstatic struct lp_fragment_shader_variant *
922efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgenerate_variant(struct llvmpipe_context *lp,
9233b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul                 struct lp_fragment_shader *shader,
9243b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul                 const struct lp_fragment_shader_variant_key *key)
9253b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul{
9263b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul   struct lp_fragment_shader_variant *variant;
92700989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   boolean fullcolormask;
9283b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul
9293b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul   variant = CALLOC_STRUCT(lp_fragment_shader_variant);
9303b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul   if(!variant)
9313b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul      return NULL;
9323b5d84926847cf2008da4e2dc146090d0c1b5402Brian Paul
933197636814e4e523b98d3e25d918d589ef61b8acaJosé Fonseca   variant->shader = shader;
93417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   variant->list_item_global.base = variant;
93517c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   variant->list_item_local.base = variant;
93617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   variant->no = shader->variants_created++;
93781862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
9383d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   memcpy(&variant->key, key, shader->variant_key_size);
939818d444e12bb57568fbf3bf5f06ee24c6c73a61aJosé Fonseca
94000989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   /*
94100989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca    * Determine whether we are touching all channels in the color buffer.
94200989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca    */
94300989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   fullcolormask = FALSE;
94400989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   if (key->nr_cbufs == 1) {
94500989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      const struct util_format_description *format_desc;
94600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      format_desc = util_format_description(key->cbuf_format[0]);
94700989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      if ((~key->blend.rt[0].colormask &
94800989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca           util_format_colormask(format_desc)) == 0) {
94900989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca         fullcolormask = TRUE;
95000989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      }
95100989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   }
95200989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca
95310fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca   variant->opaque =
95410fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         !key->blend.logicop_enable &&
95510fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         !key->blend.rt[0].blend_enable &&
95600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca         fullcolormask &&
95710fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         !key->stencil[0].enabled &&
95810fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         !key->alpha.enabled &&
95910fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         !key->depth.enabled &&
960986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca         !shader->info.base.uses_kill
96110fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca         ? TRUE : FALSE;
96210fdbb9298489e9dfb2ecec0662abe29da5b6239José Fonseca
9639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
96409863554259aeb7b0522b130837b6a1f12ffaebeKeith Whitwell   if ((LP_DEBUG & DEBUG_FS) || (gallivm_debug & GALLIVM_DEBUG_IR)) {
9659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_debug_fs_variant(variant);
9669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   }
9679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
968efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   generate_fragment(lp, shader, variant, RAST_EDGE_TEST);
9699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
970853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca   if (variant->opaque) {
971853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca      /* Specialized shader, which doesn't need to read the color buffer. */
972efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      generate_fragment(lp, shader, variant, RAST_WHOLE);
973853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca   } else {
974853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca      variant->jit_function[RAST_WHOLE] = variant->jit_function[RAST_EDGE_TEST];
975853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca   }
976853953dc3c5bd2ef9cca904c9cabc4a0ef037b16José Fonseca
9779ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   return variant;
9789ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca}
9799ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
9809ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
9819523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulstatic void *
9829ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonsecallvmpipe_create_fs_state(struct pipe_context *pipe,
9839ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca                         const struct pipe_shader_state *templ)
9849ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca{
985955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
9869ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   struct lp_fragment_shader *shader;
9873d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   int nr_samplers;
9885b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   int i;
9899ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
9909ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   shader = CALLOC_STRUCT(lp_fragment_shader);
9919ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   if (!shader)
9929ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca      return NULL;
9939ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
99481862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   shader->no = fs_no++;
99517c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   make_empty_list(&shader->variants);
99681862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
9979ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   /* get/save the summary info for this shader */
998986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   lp_build_tgsi_info(templ->tokens, &shader->info);
9999ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
10009ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   /* we need to keep a local copy of the tokens */
10019ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   shader->base.tokens = tgsi_dup_tokens(templ->tokens);
10029ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1003955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   shader->draw_data = draw_create_fragment_shader(llvmpipe->draw, templ);
1004955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   if (shader->draw_data == NULL) {
1005955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul      FREE((void *) shader->base.tokens);
1006b556bb7c44236a9fae54f58cc03e1d05eaa2124fJosé Fonseca      FREE(shader);
1007955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul      return NULL;
1008955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   }
1009955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul
1010986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   nr_samplers = shader->info.base.file_max[TGSI_FILE_SAMPLER] + 1;
10113d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell
10123d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   shader->variant_key_size = Offset(struct lp_fragment_shader_variant_key,
10133d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell				     sampler[nr_samplers]);
10143d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell
10150072acd447dc6be652e63752e50215c3105322c8Keith Whitwell   for (i = 0; i < shader->info.base.num_inputs; i++) {
10160072acd447dc6be652e63752e50215c3105322c8Keith Whitwell      shader->inputs[i].usage_mask = shader->info.base.input_usage_mask[i];
10175b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
10180072acd447dc6be652e63752e50215c3105322c8Keith Whitwell      switch (shader->info.base.input_interpolate[i]) {
10195b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      case TGSI_INTERPOLATE_CONSTANT:
10205b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].interp = LP_INTERP_CONSTANT;
10215b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 break;
10225b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      case TGSI_INTERPOLATE_LINEAR:
10235b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].interp = LP_INTERP_LINEAR;
10245b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 break;
10255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      case TGSI_INTERPOLATE_PERSPECTIVE:
10265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].interp = LP_INTERP_PERSPECTIVE;
10275b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 break;
1028ec4d691474bcf84bb69161cda25494962a08172cJosé Fonseca      case TGSI_INTERPOLATE_COLOR:
1029ec4d691474bcf84bb69161cda25494962a08172cJosé Fonseca	 shader->inputs[i].interp = LP_INTERP_COLOR;
1030ec4d691474bcf84bb69161cda25494962a08172cJosé Fonseca	 break;
10315b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      default:
10325b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 assert(0);
10335b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 break;
10345b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      }
10355b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
10360072acd447dc6be652e63752e50215c3105322c8Keith Whitwell      switch (shader->info.base.input_semantic_name[i]) {
10375b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      case TGSI_SEMANTIC_FACE:
10385b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].interp = LP_INTERP_FACING;
10395b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 break;
10405b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      case TGSI_SEMANTIC_POSITION:
10415b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 /* Position was already emitted above
10425b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	  */
10435b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].interp = LP_INTERP_POSITION;
10445b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 shader->inputs[i].src_index = 0;
10455b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	 continue;
10465b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      }
10475b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
10485b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      shader->inputs[i].src_index = i+1;
10495b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   }
10505b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
1051524ec6464d5c9d66b58c78c5e68c3bcb6a845f69José Fonseca   if (LP_DEBUG & DEBUG_TGSI) {
1052149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca      unsigned attrib;
1053efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      debug_printf("llvmpipe: Create fragment shader #%u %p:\n",
1054efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   shader->no, (void *) shader);
1055ac6725b8f9c331cacd08d95eb22d0c81b0bc9821Brian Paul      tgsi_dump(templ->tokens, 0);
1056149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca      debug_printf("usage masks:\n");
1057986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca      for (attrib = 0; attrib < shader->info.base.num_inputs; ++attrib) {
1058986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca         unsigned usage_mask = shader->info.base.input_usage_mask[attrib];
1059149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca         debug_printf("  IN[%u].%s%s%s%s\n",
1060149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca                      attrib,
1061149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca                      usage_mask & TGSI_WRITEMASK_X ? "x" : "",
1062149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca                      usage_mask & TGSI_WRITEMASK_Y ? "y" : "",
1063149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca                      usage_mask & TGSI_WRITEMASK_Z ? "z" : "",
1064149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca                      usage_mask & TGSI_WRITEMASK_W ? "w" : "");
1065149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca      }
1066149cb7682e37ce719d693f120e68dde60ba73bdfJosé Fonseca      debug_printf("\n");
1067ac6725b8f9c331cacd08d95eb22d0c81b0bc9821Brian Paul   }
1068ac6725b8f9c331cacd08d95eb22d0c81b0bc9821Brian Paul
106973af91e938eb27b001404f11195fb06ff9b08903José Fonseca   return shader;
1070946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1071946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1072946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10739523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulstatic void
1074946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
1075946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1076946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1077946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1078080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   if (llvmpipe->fs == fs)
1079080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca      return;
1080080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
1081080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   draw_flush(llvmpipe->draw);
1082080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
10832996ce72b142c774101f8df8bd6050d4755ccdccBrian Paul   llvmpipe->fs = (struct lp_fragment_shader *) fs;
10849fbf744389cc13e96324086a1a94afbac933e6eaBrian Paul
1085955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   draw_bind_fragment_shader(llvmpipe->draw,
1086955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul                             (llvmpipe->fs ? llvmpipe->fs->draw_data : NULL));
1087955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul
1088c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca   llvmpipe->dirty |= LP_NEW_FS;
1089946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1090946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1091efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1092efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/**
1093efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Remove shader variant from two lists: the shader's variant list
1094efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * and the context's variant list.
1095efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul */
1096efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid
1097efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulllvmpipe_remove_shader_variant(struct llvmpipe_context *lp,
1098efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                               struct lp_fragment_shader_variant *variant)
109917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger{
110017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   unsigned i;
110117c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger
110217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   if (gallivm_debug & GALLIVM_DEBUG_IR) {
1103efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      debug_printf("llvmpipe: del fs #%u var #%u v created #%u v cached"
1104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   " #%u v total cached #%u\n",
1105efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   variant->shader->no,
1106efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   variant->no,
1107efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   variant->shader->variants_created,
1108efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   variant->shader->variants_cached,
1109efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                   lp->nr_fs_variants);
111017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   }
1111efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1112efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* free all the variant's JIT'd functions */
111317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   for (i = 0; i < Elements(variant->function); i++) {
111417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      if (variant->function[i]) {
111517c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         if (variant->jit_function[i])
1116efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul            LLVMFreeMachineCodeForFunction(lp->gallivm->engine,
111717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger                                           variant->function[i]);
111817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         LLVMDeleteFunction(variant->function[i]);
111917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      }
112017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   }
1121efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1122efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* remove from shader's list */
112317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   remove_from_list(&variant->list_item_local);
1124197636814e4e523b98d3e25d918d589ef61b8acaJosé Fonseca   variant->shader->variants_cached--;
1125efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1126efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* remove from context's list */
112717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   remove_from_list(&variant->list_item_global);
112817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   lp->nr_fs_variants--;
11296cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   lp->nr_fs_instrs -= variant->nr_instrs;
1130efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
113117c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   FREE(variant);
113217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger}
1133946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1134efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
11359523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulstatic void
1136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
1137946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1138e3b38e5ec1ba93e3f1a1b3d5039c70ff7aa3ebe6José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
113973af91e938eb27b001404f11195fb06ff9b08903José Fonseca   struct lp_fragment_shader *shader = fs;
114017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item *li;
1141946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1142e3b38e5ec1ba93e3f1a1b3d5039c70ff7aa3ebe6José Fonseca   assert(fs != llvmpipe->fs);
11439ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
11444d5dd82558fcf1f6fcfdb95b225a4e3f842a9133José Fonseca   /*
11454d5dd82558fcf1f6fcfdb95b225a4e3f842a9133José Fonseca    * XXX: we need to flush the context until we have some sort of reference
11464d5dd82558fcf1f6fcfdb95b225a4e3f842a9133José Fonseca    * counting in fragment shaders as they may still be binned
114717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger    * Flushing alone might not sufficient we need to wait on it too.
11484d5dd82558fcf1f6fcfdb95b225a4e3f842a9133José Fonseca    */
1149b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell   llvmpipe_finish(pipe, __FUNCTION__);
11509ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1151efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* Delete all the variants */
115217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   li = first_elem(&shader->variants);
115317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   while(!at_end(&shader->variants, li)) {
1154d7f4250333f3649d170d71bfdc5f2faba4e8c5f8José Fonseca      struct lp_fs_variant_list_item *next = next_elem(li);
1155efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      llvmpipe_remove_shader_variant(llvmpipe, li->base);
1156d7f4250333f3649d170d71bfdc5f2faba4e8c5f8José Fonseca      li = next;
115773af91e938eb27b001404f11195fb06ff9b08903José Fonseca   }
115873af91e938eb27b001404f11195fb06ff9b08903José Fonseca
1159efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* Delete draw module's data */
1160955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   draw_delete_fragment_shader(llvmpipe->draw, shader->draw_data);
1161955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul
116217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   assert(shader->variants_cached == 0);
116373af91e938eb27b001404f11195fb06ff9b08903José Fonseca   FREE((void *) shader->base.tokens);
116473af91e938eb27b001404f11195fb06ff9b08903José Fonseca   FREE(shader);
1165946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1166946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1167946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1168946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
11699523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulstatic void
1170946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_set_constant_buffer(struct pipe_context *pipe,
1171946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca                             uint shader, uint index,
1172287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                             struct pipe_resource *constants)
1173946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1174946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1175287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   unsigned size = constants ? constants->width0 : 0;
11760639765b2850739af1678f10fc0c5706d5827776Brian Paul   const void *data = constants ? llvmpipe_resource_data(constants) : NULL;
1177946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1178946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   assert(shader < PIPE_SHADER_TYPES);
1179a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   assert(index < PIPE_MAX_CONSTANT_BUFFERS);
1180946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1181a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   if(llvmpipe->constants[shader][index] == constants)
1182d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      return;
1183d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
1184080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   draw_flush(llvmpipe->draw);
118569588d7ed59a019a5272a9cc391e30c47d006aeeJosé Fonseca
1186946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /* note: reference counting */
1187a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   pipe_resource_reference(&llvmpipe->constants[shader][index], constants);
118869588d7ed59a019a5272a9cc391e30c47d006aeeJosé Fonseca
1189b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin   if(shader == PIPE_SHADER_VERTEX ||
1190b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      shader == PIPE_SHADER_GEOMETRY) {
1191b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      draw_set_mapped_constant_buffer(llvmpipe->draw, shader,
1192b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin                                      index, data, size);
119369588d7ed59a019a5272a9cc391e30c47d006aeeJosé Fonseca   }
1194946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1195c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca   llvmpipe->dirty |= LP_NEW_CONSTANTS;
1196946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
11979ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
11989ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1199635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca/**
120059253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca * Return the blend factor equivalent to a destination alpha of one.
120159253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca */
120259253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonsecastatic INLINE unsigned
120387267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonsecaforce_dst_alpha_one(unsigned factor)
120459253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca{
120559253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   switch(factor) {
120659253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   case PIPE_BLENDFACTOR_DST_ALPHA:
120759253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      return PIPE_BLENDFACTOR_ONE;
120859253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
120959253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      return PIPE_BLENDFACTOR_ZERO;
121059253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
121159253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      return PIPE_BLENDFACTOR_ZERO;
121259253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   }
121359253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca
121459253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca   return factor;
121559253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca}
121659253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca
121759253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca
121859253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca/**
1219635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca * We need to generate several variants of the fragment pipeline to match
1220635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca * all the combinations of the contributing state atoms.
1221635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca *
1222635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca * TODO: there is actually no reason to tie this to context state -- the
1223635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca * generated code could be cached globally in the screen.
1224635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca */
1225635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonsecastatic void
1226635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonsecamake_variant_key(struct llvmpipe_context *lp,
1227e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                 struct lp_fragment_shader *shader,
1228635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca                 struct lp_fragment_shader_variant_key *key)
1229635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca{
1230e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   unsigned i;
1231e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
12323d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   memset(key, 0, shader->variant_key_size);
1233635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
123467b82fc395fc9972fc08233044057ab540c7ab59Brian Paul   if (lp->framebuffer.zsbuf) {
123567b82fc395fc9972fc08233044057ab540c7ab59Brian Paul      if (lp->depth_stencil->depth.enabled) {
123667b82fc395fc9972fc08233044057ab540c7ab59Brian Paul         key->zsbuf_format = lp->framebuffer.zsbuf->format;
123767b82fc395fc9972fc08233044057ab540c7ab59Brian Paul         memcpy(&key->depth, &lp->depth_stencil->depth, sizeof key->depth);
123867b82fc395fc9972fc08233044057ab540c7ab59Brian Paul      }
123967b82fc395fc9972fc08233044057ab540c7ab59Brian Paul      if (lp->depth_stencil->stencil[0].enabled) {
124067b82fc395fc9972fc08233044057ab540c7ab59Brian Paul         key->zsbuf_format = lp->framebuffer.zsbuf->format;
124167b82fc395fc9972fc08233044057ab540c7ab59Brian Paul         memcpy(&key->stencil, &lp->depth_stencil->stencil, sizeof key->stencil);
124267b82fc395fc9972fc08233044057ab540c7ab59Brian Paul      }
1243cdbbcdf3bdb114d79cf7b9474436c3d26b135592José Fonseca   }
1244635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
1245635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   key->alpha.enabled = lp->depth_stencil->alpha.enabled;
1246635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   if(key->alpha.enabled)
1247635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca      key->alpha.func = lp->depth_stencil->alpha.func;
1248635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   /* alpha.ref_value is passed in jit_context */
1249635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
125086f450060debebd66dd5fb72f83800d7634efeaaKeith Whitwell   key->flatshade = lp->rasterizer->flatshade;
125186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li   if (lp->active_query_count) {
125286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li      key->occlusion_count = TRUE;
125386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li   }
12544c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca
1255c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   if (lp->framebuffer.nr_cbufs) {
12564c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca      memcpy(&key->blend, lp->blend, sizeof key->blend);
1257c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   }
12584c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca
1259c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   key->nr_cbufs = lp->framebuffer.nr_cbufs;
1260c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell   for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
126100989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      enum pipe_format format = lp->framebuffer.cbufs[i]->format;
126259253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      struct pipe_rt_blend_state *blend_rt = &key->blend.rt[i];
12634c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca      const struct util_format_description *format_desc;
12644c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca
126500989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      key->cbuf_format[i] = format;
126600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca
126700989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      format_desc = util_format_description(format);
12686ae9975ea08b64d7f4e7a2c6c535c14280bef843José Fonseca      assert(format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
12696ae9975ea08b64d7f4e7a2c6c535c14280bef843José Fonseca             format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
12704c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca
127159253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      blend_rt->colormask = lp->blend->rt[i].colormask;
1272862d014ba91f0b959465a48005e94f530f0374a5Brian Paul
127300989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      /*
127400989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca       * Mask out color channels not present in the color buffer.
1275c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell       */
127600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca      blend_rt->colormask &= util_format_colormask(format_desc);
127759253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca
127859253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca      /*
127959253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * Our swizzled render tiles always have an alpha channel, but the linear
128059253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * render target format often does not, so force here the dst alpha to be
128159253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * one.
128259253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       *
128359253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * This is not a mere optimization. Wrong results will be produced if the
128459253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * dst alpha is used, the dst format does not have alpha, and the previous
128559253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * rendering was not flushed from the swizzled to linear buffer. For
128659253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * example, NonPowTwo DCT.
128759253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       *
128859253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * TODO: This should be generalized to all channels for better
128959253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       * performance, but only alpha causes correctness issues.
129087267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca       *
129187267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca       * Also, force rgb/alpha func/factors match, to make AoS blending easier.
129259253a79d823a4cfd1d65466c0a165d6d4c43a92José Fonseca       */
129324668a38d176607dec5eee9ae351076487b57542Dave Airlie      if (format_desc->swizzle[3] > UTIL_FORMAT_SWIZZLE_W ||
129424668a38d176607dec5eee9ae351076487b57542Dave Airlie	  format_desc->swizzle[3] == format_desc->swizzle[0]) {
129587267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca         blend_rt->rgb_src_factor   = force_dst_alpha_one(blend_rt->rgb_src_factor);
129687267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca         blend_rt->rgb_dst_factor   = force_dst_alpha_one(blend_rt->rgb_dst_factor);
129787267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca         blend_rt->alpha_func       = blend_rt->rgb_func;
129887267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca         blend_rt->alpha_src_factor = blend_rt->rgb_src_factor;
129987267c71f67d02fcdd59a899fd0eea6d64e523b5José Fonseca         blend_rt->alpha_dst_factor = blend_rt->rgb_dst_factor;
13004c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca      }
13014c3a48ad0cb36e6d8601535b91f83caed0d07570José Fonseca   }
1302e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
13033d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   /* This value will be the same for all the variants of a given shader:
13043d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell    */
1305986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   key->nr_samplers = shader->info.base.file_max[TGSI_FILE_SAMPLER] + 1;
13063d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell
13073d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   for(i = 0; i < key->nr_samplers; ++i) {
1308986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca      if(shader->info.base.file_mask[TGSI_FILE_SAMPLER] & (1 << i)) {
13093d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell         lp_sampler_static_state(&key->sampler[i],
13103d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell				 lp->fragment_sampler_views[i],
13113d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell				 lp->sampler[i]);
13123d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell      }
13133d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   }
1314635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca}
1315635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
1316efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1317efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
13184769328fe1ddaa1882dddbaad21239d5fdcddf19Brian Paul/**
1319efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Update fragment shader state.  This is called just prior to drawing
13204769328fe1ddaa1882dddbaad21239d5fdcddf19Brian Paul * something when some fragment-related state has changed.
13214769328fe1ddaa1882dddbaad21239d5fdcddf19Brian Paul */
13225811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonsecavoid
13235811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonsecallvmpipe_update_fs(struct llvmpipe_context *lp)
13249ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca{
13259ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   struct lp_fragment_shader *shader = lp->fs;
1326e3b38e5ec1ba93e3f1a1b3d5039c70ff7aa3ebe6José Fonseca   struct lp_fragment_shader_variant_key key;
132717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fragment_shader_variant *variant = NULL;
132817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item *li;
13299ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1330e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   make_variant_key(lp, shader, &key);
1331e3b38e5ec1ba93e3f1a1b3d5039c70ff7aa3ebe6José Fonseca
1332efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* Search the variants for one which matches the key */
133317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   li = first_elem(&shader->variants);
133417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   while(!at_end(&shader->variants, li)) {
13353d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell      if(memcmp(&li->base->key, &key, shader->variant_key_size) == 0) {
133617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         variant = li->base;
13379ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca         break;
133817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      }
133917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      li = next_elem(li);
13409ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca   }
13419ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
134217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   if (variant) {
1343efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      /* Move this variant to the head of the list to implement LRU
1344efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       * deletion of shader's when we have too many.
1345efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       */
134617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      move_to_head(&lp->fs_variants_list, &variant->list_item_global);
134717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   }
134817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   else {
1349efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      /* variant not found, create it now */
1350efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      int64_t t0, t1, dt;
135117c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      unsigned i;
13526cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca      unsigned variants_to_cull;
13536cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca
13546cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca      if (0) {
13556cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca         debug_printf("%u variants,\t%u instrs,\t%u instrs/variant\n",
13566cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca                      lp->nr_fs_variants,
13576cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca                      lp->nr_fs_instrs,
13586cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca                      lp->nr_fs_variants ? lp->nr_fs_instrs / lp->nr_fs_variants : 0);
13596cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca      }
1360efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1361efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      /* First, check if we've exceeded the max number of shader variants.
1362efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       * If so, free 25% of them (the least recently used ones).
1363efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       */
13646cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca      variants_to_cull = lp->nr_fs_variants >= LP_MAX_SHADER_VARIANTS ? LP_MAX_SHADER_VARIANTS / 4 : 0;
13656cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca
13666cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca      if (variants_to_cull ||
13676cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca          lp->nr_fs_instrs >= LP_MAX_SHADER_INSTRUCTIONS) {
136817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         struct pipe_context *pipe = &lp->pipe;
136917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger
137017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         /*
1371efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul          * XXX: we need to flush the context until we have some sort of
1372efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul          * reference counting in fragment shaders as they may still be binned
137317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger          * Flushing alone might not be sufficient we need to wait on it too.
137417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger          */
1375b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell         llvmpipe_finish(pipe, __FUNCTION__);
137617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger
1377b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca         /*
1378b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca          * We need to re-check lp->nr_fs_variants because an arbitrarliy large
1379b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca          * number of shader variants (potentially all of them) could be
1380b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca          * pending for destruction on flush.
1381b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca          */
1382b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca
13836cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca         for (i = 0; i < variants_to_cull || lp->nr_fs_instrs >= LP_MAX_SHADER_INSTRUCTIONS; i++) {
13846cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            struct lp_fs_variant_list_item *item;
13856cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            if (is_empty_list(&lp->fs_variants_list)) {
13866cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca               break;
1387b8d1242c0bb29ef6866cbfdd75cb18eec9ba8068José Fonseca            }
13886cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            item = last_elem(&lp->fs_variants_list);
13896cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            assert(item);
13906cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            assert(item->base);
13916cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca            llvmpipe_remove_shader_variant(lp, item->base);
139217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         }
139317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      }
13949ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1395efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      /*
1396efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       * Generate the new variant.
1397efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul       */
1398efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      t0 = os_time_get();
1399efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      variant = generate_variant(lp, shader, &key);
1400a8270c7c29b141025f606c811812304a72e42d2eBrian Paul      t1 = os_time_get();
1401a8270c7c29b141025f606c811812304a72e42d2eBrian Paul      dt = t1 - t0;
1402e95ad2a2b521514eaec04f9b266ee030ecc639a3Brian Paul      LP_COUNT_ADD(llvm_compile_time, dt);
1403e95ad2a2b521514eaec04f9b266ee030ecc639a3Brian Paul      LP_COUNT_ADD(nr_llvm_compiles, 2);  /* emit vs. omit in/out test */
140417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger
1405efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      llvmpipe_variant_count++;
1406efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1407efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      /* Put the new variant into the list */
140817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      if (variant) {
140917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         insert_at_head(&shader->variants, &variant->list_item_local);
141017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         insert_at_head(&lp->fs_variants_list, &variant->list_item_global);
141117c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         lp->nr_fs_variants++;
14126cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca         lp->nr_fs_instrs += variant->nr_instrs;
141317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger         shader->variants_cached++;
141417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger      }
1415e95ad2a2b521514eaec04f9b266ee030ecc639a3Brian Paul   }
14169ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca
1417efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /* Bind this variant */
141818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   lp_setup_set_fs_variant(lp->setup, variant);
14199ae47069b4a2b67e381b02d805f1ca74f31ea7b8José Fonseca}
14209523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul
14219523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul
14229523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul
14235b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
14245b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
14255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
14265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
14279523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulvoid
14289523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paulllvmpipe_init_fs_funcs(struct llvmpipe_context *llvmpipe)
14299523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul{
14309523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul   llvmpipe->pipe.create_fs_state = llvmpipe_create_fs_state;
14319523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul   llvmpipe->pipe.bind_fs_state   = llvmpipe_bind_fs_state;
14329523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul   llvmpipe->pipe.delete_fs_state = llvmpipe_delete_fs_state;
14339523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul
14349523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul   llvmpipe->pipe.set_constant_buffer = llvmpipe_set_constant_buffer;
14359523d78dde7f2e819275ecb39cdeafe50eb65f13Brian Paul}
1436