Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / drivers / llvmpipe / lp_state_fs.c
1 /**************************************************************************
2  * 
3  * Copyright 2009 VMware, Inc.
4  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
5  * All Rights Reserved.
6  * 
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  * 
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  * 
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  * 
27  **************************************************************************/
28
29 /**
30  * @file
31  * Code generate the whole fragment pipeline.
32  *
33  * The fragment pipeline consists of the following stages:
34  * - early depth test
35  * - fragment shader
36  * - alpha test
37  * - depth/stencil test
38  * - blending
39  *
40  * This file has only the glue to assemble the fragment pipeline.  The actual
41  * plumbing of converting Gallium state into LLVM IR is done elsewhere, in the
42  * lp_bld_*.[ch] files, and in a complete generic and reusable way. Here we
43  * muster the LLVM JIT execution engine to create a function that follows an
44  * established binary interface and that can be called from C directly.
45  *
46  * A big source of complexity here is that we often want to run different
47  * stages with different precisions and data types and precisions. For example,
48  * the fragment shader needs typically to be done in floats, but the
49  * depth/stencil test and blending is better done in the type that most closely
50  * matches the depth/stencil and color buffer respectively.
51  *
52  * Since the width of a SIMD vector register stays the same regardless of the
53  * element type, different types imply different number of elements, so we must
54  * code generate more instances of the stages with larger types to be able to
55  * feed/consume the stages with smaller types.
56  *
57  * @author Jose Fonseca <jfonseca@vmware.com>
58  */
59
60 #include <limits.h>
61 #include "pipe/p_defines.h"
62 #include "util/u_inlines.h"
63 #include "util/u_memory.h"
64 #include "util/u_pointer.h"
65 #include "util/u_format.h"
66 #include "util/u_dump.h"
67 #include "util/u_string.h"
68 #include "util/u_simple_list.h"
69 #include "os/os_time.h"
70 #include "pipe/p_shader_tokens.h"
71 #include "draw/draw_context.h"
72 #include "tgsi/tgsi_dump.h"
73 #include "tgsi/tgsi_scan.h"
74 #include "tgsi/tgsi_parse.h"
75 #include "gallivm/lp_bld_type.h"
76 #include "gallivm/lp_bld_const.h"
77 #include "gallivm/lp_bld_conv.h"
78 #include "gallivm/lp_bld_init.h"
79 #include "gallivm/lp_bld_intr.h"
80 #include "gallivm/lp_bld_logic.h"
81 #include "gallivm/lp_bld_tgsi.h"
82 #include "gallivm/lp_bld_swizzle.h"
83 #include "gallivm/lp_bld_flow.h"
84 #include "gallivm/lp_bld_debug.h"
85
86 #include "lp_bld_alpha.h"
87 #include "lp_bld_blend.h"
88 #include "lp_bld_depth.h"
89 #include "lp_bld_interp.h"
90 #include "lp_context.h"
91 #include "lp_debug.h"
92 #include "lp_perf.h"
93 #include "lp_setup.h"
94 #include "lp_state.h"
95 #include "lp_tex_sample.h"
96 #include "lp_flush.h"
97 #include "lp_state_fs.h"
98
99
100 #include <llvm-c/Analysis.h>
101 #include <llvm-c/BitWriter.h>
102
103
104 /** Fragment shader number (for debugging) */
105 static unsigned fs_no = 0;
106
107
108 /**
109  * Expand the relevent bits of mask_input to a 4-dword mask for the 
110  * four pixels in a 2x2 quad.  This will set the four elements of the
111  * quad mask vector to 0 or ~0.
112  *
113  * \param quad  which quad of the quad group to test, in [0,3]
114  * \param mask_input  bitwise mask for the whole 4x4 stamp
115  */
116 static LLVMValueRef
117 generate_quad_mask(struct gallivm_state *gallivm,
118                    struct lp_type fs_type,
119                    unsigned quad,
120                    LLVMValueRef mask_input) /* int32 */
121 {
122    LLVMBuilderRef builder = gallivm->builder;
123    struct lp_type mask_type;
124    LLVMTypeRef i32t = LLVMInt32TypeInContext(gallivm->context);
125    LLVMValueRef bits[4];
126    LLVMValueRef mask;
127    int shift;
128
129    /*
130     * XXX: We'll need a different path for 16 x u8
131     */
132    assert(fs_type.width == 32);
133    assert(fs_type.length == 4);
134    mask_type = lp_int_type(fs_type);
135
136    /*
137     * mask_input >>= (quad * 4)
138     */
139    switch (quad) {
140    case 0:
141       shift = 0;
142       break;
143    case 1:
144       shift = 2;
145       break;
146    case 2:
147       shift = 8;
148       break;
149    case 3:
150       shift = 10;
151       break;
152    default:
153       assert(0);
154       shift = 0;
155    }
156
157    mask_input = LLVMBuildLShr(builder,
158                               mask_input,
159                               LLVMConstInt(i32t, shift, 0),
160                               "");
161
162    /*
163     * mask = { mask_input & (1 << i), for i in [0,3] }
164     */
165    mask = lp_build_broadcast(gallivm,
166                              lp_build_vec_type(gallivm, mask_type),
167                              mask_input);
168
169    bits[0] = LLVMConstInt(i32t, 1 << 0, 0);
170    bits[1] = LLVMConstInt(i32t, 1 << 1, 0);
171    bits[2] = LLVMConstInt(i32t, 1 << 4, 0);
172    bits[3] = LLVMConstInt(i32t, 1 << 5, 0);
173    
174    mask = LLVMBuildAnd(builder, mask, LLVMConstVector(bits, 4), "");
175
176    /*
177     * mask = mask != 0 ? ~0 : 0
178     */
179    mask = lp_build_compare(gallivm,
180                            mask_type, PIPE_FUNC_NOTEQUAL,
181                            mask,
182                            lp_build_const_int_vec(gallivm, mask_type, 0));
183
184    return mask;
185 }
186
187
188 #define EARLY_DEPTH_TEST  0x1
189 #define LATE_DEPTH_TEST   0x2
190 #define EARLY_DEPTH_WRITE 0x4
191 #define LATE_DEPTH_WRITE  0x8
192
193 static int
194 find_output_by_semantic( const struct tgsi_shader_info *info,
195                          unsigned semantic,
196                          unsigned index )
197 {
198    int i;
199
200    for (i = 0; i < info->num_outputs; i++)
201       if (info->output_semantic_name[i] == semantic &&
202           info->output_semantic_index[i] == index)
203          return i;
204
205    return -1;
206 }
207
208
209 /**
210  * Generate the fragment shader, depth/stencil test, and alpha tests.
211  * \param i  which quad in the tile, in range [0,3]
212  * \param partial_mask  if 1, do mask_input testing
213  */
214 static void
215 generate_fs(struct gallivm_state *gallivm,
216             struct lp_fragment_shader *shader,
217             const struct lp_fragment_shader_variant_key *key,
218             LLVMBuilderRef builder,
219             struct lp_type type,
220             LLVMValueRef context_ptr,
221             unsigned i,
222             struct lp_build_interp_soa_context *interp,
223             struct lp_build_sampler_soa *sampler,
224             LLVMValueRef *pmask,
225             LLVMValueRef (*color)[4],
226             LLVMValueRef depth_ptr,
227             LLVMValueRef facing,
228             unsigned partial_mask,
229             LLVMValueRef mask_input,
230             LLVMValueRef counter)
231 {
232    const struct util_format_description *zs_format_desc = NULL;
233    const struct tgsi_token *tokens = shader->base.tokens;
234    LLVMTypeRef vec_type;
235    LLVMValueRef consts_ptr;
236    LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][NUM_CHANNELS];
237    LLVMValueRef z;
238    LLVMValueRef zs_value = NULL;
239    LLVMValueRef stencil_refs[2];
240    struct lp_build_mask_context mask;
241    boolean simple_shader = (shader->info.base.file_count[TGSI_FILE_SAMPLER] == 0 &&
242                             shader->info.base.num_inputs < 3 &&
243                             shader->info.base.num_instructions < 8);
244    unsigned attrib;
245    unsigned chan;
246    unsigned cbuf;
247    unsigned depth_mode;
248
249    if (key->depth.enabled ||
250        key->stencil[0].enabled ||
251        key->stencil[1].enabled) {
252
253       zs_format_desc = util_format_description(key->zsbuf_format);
254       assert(zs_format_desc);
255
256       if (!shader->info.base.writes_z) {
257          if (key->alpha.enabled || shader->info.base.uses_kill)
258             /* With alpha test and kill, can do the depth test early
259              * and hopefully eliminate some quads.  But need to do a
260              * special deferred depth write once the final mask value
261              * is known.
262              */
263             depth_mode = EARLY_DEPTH_TEST | LATE_DEPTH_WRITE;
264          else
265             depth_mode = EARLY_DEPTH_TEST | EARLY_DEPTH_WRITE;
266       }
267       else {
268          depth_mode = LATE_DEPTH_TEST | LATE_DEPTH_WRITE;
269       }
270
271       if (!(key->depth.enabled && key->depth.writemask) &&
272           !(key->stencil[0].enabled && key->stencil[0].writemask))
273          depth_mode &= ~(LATE_DEPTH_WRITE | EARLY_DEPTH_WRITE);
274    }
275    else {
276       depth_mode = 0;
277    }
278
279    assert(i < 4);
280
281    stencil_refs[0] = lp_jit_context_stencil_ref_front_value(gallivm, context_ptr);
282    stencil_refs[1] = lp_jit_context_stencil_ref_back_value(gallivm, context_ptr);
283
284    vec_type = lp_build_vec_type(gallivm, type);
285
286    consts_ptr = lp_jit_context_constants(gallivm, context_ptr);
287
288    memset(outputs, 0, sizeof outputs);
289
290    /* Declare the color and z variables */
291    for(cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
292       for(chan = 0; chan < NUM_CHANNELS; ++chan) {
293          color[cbuf][chan] = lp_build_alloca(gallivm, vec_type, "color");
294       }
295    }
296
297    /* do triangle edge testing */
298    if (partial_mask) {
299       *pmask = generate_quad_mask(gallivm, type,
300                                   i, mask_input);
301    }
302    else {
303       *pmask = lp_build_const_int_vec(gallivm, type, ~0);
304    }
305
306    /* 'mask' will control execution based on quad's pixel alive/killed state */
307    lp_build_mask_begin(&mask, gallivm, type, *pmask);
308
309    if (!(depth_mode & EARLY_DEPTH_TEST) && !simple_shader)
310       lp_build_mask_check(&mask);
311
312    lp_build_interp_soa_update_pos(interp, gallivm, i);
313    z = interp->pos[2];
314
315    if (depth_mode & EARLY_DEPTH_TEST) {
316       lp_build_depth_stencil_test(gallivm,
317                                   &key->depth,
318                                   key->stencil,
319                                   type,
320                                   zs_format_desc,
321                                   &mask,
322                                   stencil_refs,
323                                   z,
324                                   depth_ptr, facing,
325                                   &zs_value,
326                                   !simple_shader);
327
328       if (depth_mode & EARLY_DEPTH_WRITE) {
329          lp_build_depth_write(builder, zs_format_desc, depth_ptr, zs_value);
330       }
331    }
332
333    lp_build_interp_soa_update_inputs(interp, gallivm, i);
334    
335    /* Build the actual shader */
336    lp_build_tgsi_soa(gallivm, tokens, type, &mask,
337                      consts_ptr, NULL, /* sys values array */
338                      interp->pos, interp->inputs,
339                      outputs, sampler, &shader->info.base);
340
341    /* Alpha test */
342    if (key->alpha.enabled) {
343       int color0 = find_output_by_semantic(&shader->info.base,
344                                            TGSI_SEMANTIC_COLOR,
345                                            0);
346
347       if (color0 != -1 && outputs[color0][3]) {
348          LLVMValueRef alpha = LLVMBuildLoad(builder, outputs[color0][3], "alpha");
349          LLVMValueRef alpha_ref_value;
350
351          alpha_ref_value = lp_jit_context_alpha_ref_value(gallivm, context_ptr);
352          alpha_ref_value = lp_build_broadcast(gallivm, vec_type, alpha_ref_value);
353
354          lp_build_alpha_test(gallivm, key->alpha.func, type,
355                              &mask, alpha, alpha_ref_value,
356                              (depth_mode & LATE_DEPTH_TEST) != 0);
357       }
358    }
359
360    /* Late Z test */
361    if (depth_mode & LATE_DEPTH_TEST) { 
362       int pos0 = find_output_by_semantic(&shader->info.base,
363                                          TGSI_SEMANTIC_POSITION,
364                                          0);
365          
366       if (pos0 != -1 && outputs[pos0][2]) {
367          z = LLVMBuildLoad(builder, outputs[pos0][2], "output.z");
368       }
369
370       lp_build_depth_stencil_test(gallivm,
371                                   &key->depth,
372                                   key->stencil,
373                                   type,
374                                   zs_format_desc,
375                                   &mask,
376                                   stencil_refs,
377                                   z,
378                                   depth_ptr, facing,
379                                   &zs_value,
380                                   !simple_shader);
381       /* Late Z write */
382       if (depth_mode & LATE_DEPTH_WRITE) {
383          lp_build_depth_write(builder, zs_format_desc, depth_ptr, zs_value);
384       }
385    }
386    else if ((depth_mode & EARLY_DEPTH_TEST) &&
387             (depth_mode & LATE_DEPTH_WRITE))
388    {
389       /* Need to apply a reduced mask to the depth write.  Reload the
390        * depth value, update from zs_value with the new mask value and
391        * write that out.
392        */
393       lp_build_deferred_depth_write(gallivm,
394                                     type,
395                                     zs_format_desc,
396                                     &mask,
397                                     depth_ptr,
398                                     zs_value);
399    }
400
401
402    /* Color write  */
403    for (attrib = 0; attrib < shader->info.base.num_outputs; ++attrib)
404    {
405       if (shader->info.base.output_semantic_name[attrib] == TGSI_SEMANTIC_COLOR &&
406           shader->info.base.output_semantic_index[attrib] < key->nr_cbufs)
407       {
408          unsigned cbuf = shader->info.base.output_semantic_index[attrib];
409          for(chan = 0; chan < NUM_CHANNELS; ++chan) {
410             if(outputs[attrib][chan]) {
411                /* XXX: just initialize outputs to point at colors[] and
412                 * skip this.
413                 */
414                LLVMValueRef out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
415                lp_build_name(out, "color%u.%u.%c", i, attrib, "rgba"[chan]);
416                LLVMBuildStore(builder, out, color[cbuf][chan]);
417             }
418          }
419       }
420    }
421
422    if (counter)
423       lp_build_occlusion_count(gallivm, type,
424                                lp_build_mask_value(&mask), counter);
425
426    *pmask = lp_build_mask_end(&mask);
427 }
428
429
430 /**
431  * Generate color blending and color output.
432  * \param rt  the render target index (to index blend, colormask state)
433  * \param type  the pixel color type
434  * \param context_ptr  pointer to the runtime JIT context
435  * \param mask  execution mask (active fragment/pixel mask)
436  * \param src  colors from the fragment shader
437  * \param dst_ptr  the destination color buffer pointer
438  */
439 static void
440 generate_blend(struct gallivm_state *gallivm,
441                const struct pipe_blend_state *blend,
442                unsigned rt,
443                LLVMBuilderRef builder,
444                struct lp_type type,
445                LLVMValueRef context_ptr,
446                LLVMValueRef mask,
447                LLVMValueRef *src,
448                LLVMValueRef dst_ptr,
449                boolean do_branch)
450 {
451    struct lp_build_context bld;
452    struct lp_build_mask_context mask_ctx;
453    LLVMTypeRef vec_type;
454    LLVMValueRef const_ptr;
455    LLVMValueRef con[4];
456    LLVMValueRef dst[4];
457    LLVMValueRef res[4];
458    unsigned chan;
459
460    lp_build_context_init(&bld, gallivm, type);
461
462    lp_build_mask_begin(&mask_ctx, gallivm, type, mask);
463    if (do_branch)
464       lp_build_mask_check(&mask_ctx);
465
466    vec_type = lp_build_vec_type(gallivm, type);
467
468    const_ptr = lp_jit_context_blend_color(gallivm, context_ptr);
469    const_ptr = LLVMBuildBitCast(builder, const_ptr,
470                                 LLVMPointerType(vec_type, 0), "");
471
472    /* load constant blend color and colors from the dest color buffer */
473    for(chan = 0; chan < 4; ++chan) {
474       LLVMValueRef index = lp_build_const_int32(gallivm, chan);
475       con[chan] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, const_ptr, &index, 1, ""), "");
476
477       dst[chan] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, dst_ptr, &index, 1, ""), "");
478
479       lp_build_name(con[chan], "con.%c", "rgba"[chan]);
480       lp_build_name(dst[chan], "dst.%c", "rgba"[chan]);
481    }
482
483    /* do blend */
484    lp_build_blend_soa(gallivm, blend, type, rt, src, dst, con, res);
485
486    /* store results to color buffer */
487    for(chan = 0; chan < 4; ++chan) {
488       if(blend->rt[rt].colormask & (1 << chan)) {
489          LLVMValueRef index = lp_build_const_int32(gallivm, chan);
490          lp_build_name(res[chan], "res.%c", "rgba"[chan]);
491          res[chan] = lp_build_select(&bld, mask, res[chan], dst[chan]);
492          LLVMBuildStore(builder, res[chan], LLVMBuildGEP(builder, dst_ptr, &index, 1, ""));
493       }
494    }
495
496    lp_build_mask_end(&mask_ctx);
497 }
498
499
500 /**
501  * Generate the runtime callable function for the whole fragment pipeline.
502  * Note that the function which we generate operates on a block of 16
503  * pixels at at time.  The block contains 2x2 quads.  Each quad contains
504  * 2x2 pixels.
505  */
506 static void
507 generate_fragment(struct llvmpipe_context *lp,
508                   struct lp_fragment_shader *shader,
509                   struct lp_fragment_shader_variant *variant,
510                   unsigned partial_mask)
511 {
512    struct gallivm_state *gallivm = lp->gallivm;
513    const struct lp_fragment_shader_variant_key *key = &variant->key;
514    struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
515    char func_name[256];
516    struct lp_type fs_type;
517    struct lp_type blend_type;
518    LLVMTypeRef fs_elem_type;
519    LLVMTypeRef fs_int_vec_type;
520    LLVMTypeRef blend_vec_type;
521    LLVMTypeRef arg_types[11];
522    LLVMTypeRef func_type;
523    LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
524    LLVMTypeRef int8_type = LLVMInt8TypeInContext(gallivm->context);
525    LLVMValueRef context_ptr;
526    LLVMValueRef x;
527    LLVMValueRef y;
528    LLVMValueRef a0_ptr;
529    LLVMValueRef dadx_ptr;
530    LLVMValueRef dady_ptr;
531    LLVMValueRef color_ptr_ptr;
532    LLVMValueRef depth_ptr;
533    LLVMValueRef mask_input;
534    LLVMValueRef counter = NULL;
535    LLVMBasicBlockRef block;
536    LLVMBuilderRef builder;
537    struct lp_build_sampler_soa *sampler;
538    struct lp_build_interp_soa_context interp;
539    LLVMValueRef fs_mask[LP_MAX_VECTOR_LENGTH];
540    LLVMValueRef fs_out_color[PIPE_MAX_COLOR_BUFS][NUM_CHANNELS][LP_MAX_VECTOR_LENGTH];
541    LLVMValueRef blend_mask;
542    LLVMValueRef function;
543    LLVMValueRef facing;
544    const struct util_format_description *zs_format_desc;
545    unsigned num_fs;
546    unsigned i;
547    unsigned chan;
548    unsigned cbuf;
549    boolean cbuf0_write_all;
550
551    /* Adjust color input interpolation according to flatshade state:
552     */
553    memcpy(inputs, shader->inputs, shader->info.base.num_inputs * sizeof inputs[0]);
554    for (i = 0; i < shader->info.base.num_inputs; i++) {
555       if (inputs[i].interp == LP_INTERP_COLOR) {
556          if (key->flatshade)
557             inputs[i].interp = LP_INTERP_CONSTANT;
558          else
559             inputs[i].interp = LP_INTERP_LINEAR;
560       }
561    }
562
563    /* check if writes to cbuf[0] are to be copied to all cbufs */
564    cbuf0_write_all = FALSE;
565    for (i = 0;i < shader->info.base.num_properties; i++) {
566       if (shader->info.base.properties[i].name ==
567           TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
568          cbuf0_write_all = TRUE;
569          break;
570       }
571    }
572
573    /* TODO: actually pick these based on the fs and color buffer
574     * characteristics. */
575
576    memset(&fs_type, 0, sizeof fs_type);
577    fs_type.floating = TRUE; /* floating point values */
578    fs_type.sign = TRUE;     /* values are signed */
579    fs_type.norm = FALSE;    /* values are not limited to [0,1] or [-1,1] */
580    fs_type.width = 32;      /* 32-bit float */
581    fs_type.length = 4;      /* 4 elements per vector */
582    num_fs = 4;              /* number of quads per block */
583
584    memset(&blend_type, 0, sizeof blend_type);
585    blend_type.floating = FALSE; /* values are integers */
586    blend_type.sign = FALSE;     /* values are unsigned */
587    blend_type.norm = TRUE;      /* values are in [0,1] or [-1,1] */
588    blend_type.width = 8;        /* 8-bit ubyte values */
589    blend_type.length = 16;      /* 16 elements per vector */
590
591    /* 
592     * Generate the function prototype. Any change here must be reflected in
593     * lp_jit.h's lp_jit_frag_func function pointer type, and vice-versa.
594     */
595
596    fs_elem_type = lp_build_elem_type(gallivm, fs_type);
597    fs_int_vec_type = lp_build_int_vec_type(gallivm, fs_type);
598
599    blend_vec_type = lp_build_vec_type(gallivm, blend_type);
600
601    util_snprintf(func_name, sizeof(func_name), "fs%u_variant%u_%s", 
602                  shader->no, variant->no, partial_mask ? "partial" : "whole");
603
604    arg_types[0] = lp_jit_get_context_type(lp);         /* context */
605    arg_types[1] = int32_type;                          /* x */
606    arg_types[2] = int32_type;                          /* y */
607    arg_types[3] = int32_type;                          /* facing */
608    arg_types[4] = LLVMPointerType(fs_elem_type, 0);    /* a0 */
609    arg_types[5] = LLVMPointerType(fs_elem_type, 0);    /* dadx */
610    arg_types[6] = LLVMPointerType(fs_elem_type, 0);    /* dady */
611    arg_types[7] = LLVMPointerType(LLVMPointerType(blend_vec_type, 0), 0);  /* color */
612    arg_types[8] = LLVMPointerType(int8_type, 0);       /* depth */
613    arg_types[9] = int32_type;                          /* mask_input */
614    arg_types[10] = LLVMPointerType(int32_type, 0);     /* counter */
615
616    func_type = LLVMFunctionType(LLVMVoidTypeInContext(gallivm->context),
617                                 arg_types, Elements(arg_types), 0);
618
619    function = LLVMAddFunction(gallivm->module, func_name, func_type);
620    LLVMSetFunctionCallConv(function, LLVMCCallConv);
621
622    variant->function[partial_mask] = function;
623
624    /* XXX: need to propagate noalias down into color param now we are
625     * passing a pointer-to-pointer?
626     */
627    for(i = 0; i < Elements(arg_types); ++i)
628       if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
629          LLVMAddAttribute(LLVMGetParam(function, i), LLVMNoAliasAttribute);
630
631    context_ptr  = LLVMGetParam(function, 0);
632    x            = LLVMGetParam(function, 1);
633    y            = LLVMGetParam(function, 2);
634    facing       = LLVMGetParam(function, 3);
635    a0_ptr       = LLVMGetParam(function, 4);
636    dadx_ptr     = LLVMGetParam(function, 5);
637    dady_ptr     = LLVMGetParam(function, 6);
638    color_ptr_ptr = LLVMGetParam(function, 7);
639    depth_ptr    = LLVMGetParam(function, 8);
640    mask_input   = LLVMGetParam(function, 9);
641
642    lp_build_name(context_ptr, "context");
643    lp_build_name(x, "x");
644    lp_build_name(y, "y");
645    lp_build_name(a0_ptr, "a0");
646    lp_build_name(dadx_ptr, "dadx");
647    lp_build_name(dady_ptr, "dady");
648    lp_build_name(color_ptr_ptr, "color_ptr_ptr");
649    lp_build_name(depth_ptr, "depth");
650    lp_build_name(mask_input, "mask_input");
651
652    if (key->occlusion_count) {
653       counter = LLVMGetParam(function, 10);
654       lp_build_name(counter, "counter");
655    }
656
657    /*
658     * Function body
659     */
660
661    block = LLVMAppendBasicBlockInContext(gallivm->context, function, "entry");
662    builder = gallivm->builder;
663    assert(builder);
664    LLVMPositionBuilderAtEnd(builder, block);
665
666    /*
667     * The shader input interpolation info is not explicitely baked in the
668     * shader key, but everything it derives from (TGSI, and flatshade) is
669     * already included in the shader key.
670     */
671    lp_build_interp_soa_init(&interp, 
672                             gallivm,
673                             shader->info.base.num_inputs,
674                             inputs,
675                             builder, fs_type,
676                             a0_ptr, dadx_ptr, dady_ptr,
677                             x, y);
678
679    /* code generated texture sampling */
680    sampler = lp_llvm_sampler_soa_create(key->sampler, context_ptr);
681
682    /* loop over quads in the block */
683    zs_format_desc = util_format_description(key->zsbuf_format);
684
685    for(i = 0; i < num_fs; ++i) {
686       LLVMValueRef depth_offset = LLVMConstInt(int32_type,
687                                                i*fs_type.length*zs_format_desc->block.bits/8,
688                                                0);
689       LLVMValueRef out_color[PIPE_MAX_COLOR_BUFS][NUM_CHANNELS];
690       LLVMValueRef depth_ptr_i;
691
692       depth_ptr_i = LLVMBuildGEP(builder, depth_ptr, &depth_offset, 1, "");
693
694       generate_fs(gallivm,
695                   shader, key,
696                   builder,
697                   fs_type,
698                   context_ptr,
699                   i,
700                   &interp,
701                   sampler,
702                   &fs_mask[i], /* output */
703                   out_color,
704                   depth_ptr_i,
705                   facing,
706                   partial_mask,
707                   mask_input,
708                   counter);
709
710       for (cbuf = 0; cbuf < key->nr_cbufs; cbuf++)
711          for (chan = 0; chan < NUM_CHANNELS; ++chan)
712             fs_out_color[cbuf][chan][i] =
713                out_color[cbuf * !cbuf0_write_all][chan];
714    }
715
716    sampler->destroy(sampler);
717
718    /* Loop over color outputs / color buffers to do blending.
719     */
720    for(cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
721       LLVMValueRef color_ptr;
722       LLVMValueRef index = lp_build_const_int32(gallivm, cbuf);
723       LLVMValueRef blend_in_color[NUM_CHANNELS];
724       unsigned rt;
725
726       /* 
727        * Convert the fs's output color and mask to fit to the blending type. 
728        */
729       for(chan = 0; chan < NUM_CHANNELS; ++chan) {
730          LLVMValueRef fs_color_vals[LP_MAX_VECTOR_LENGTH];
731          
732          for (i = 0; i < num_fs; i++) {
733             fs_color_vals[i] =
734                LLVMBuildLoad(builder, fs_out_color[cbuf][chan][i], "fs_color_vals");
735          }
736
737          lp_build_conv(gallivm, fs_type, blend_type,
738                        fs_color_vals,
739                        num_fs,
740                        &blend_in_color[chan], 1);
741
742          lp_build_name(blend_in_color[chan], "color%d.%c", cbuf, "rgba"[chan]);
743       }
744
745       if (partial_mask || !variant->opaque) {
746          lp_build_conv_mask(lp->gallivm, fs_type, blend_type,
747                             fs_mask, num_fs,
748                             &blend_mask, 1);
749       } else {
750          blend_mask = lp_build_const_int_vec(lp->gallivm, blend_type, ~0);
751       }
752
753       color_ptr = LLVMBuildLoad(builder, 
754                                 LLVMBuildGEP(builder, color_ptr_ptr, &index, 1, ""),
755                                 "");
756       lp_build_name(color_ptr, "color_ptr%d", cbuf);
757
758       /* which blend/colormask state to use */
759       rt = key->blend.independent_blend_enable ? cbuf : 0;
760
761       /*
762        * Blending.
763        */
764       {
765          /* Could the 4x4 have been killed?
766           */
767          boolean do_branch = ((key->depth.enabled || key->stencil[0].enabled) &&
768                               !key->alpha.enabled &&
769                               !shader->info.base.uses_kill);
770
771          generate_blend(lp->gallivm,
772                         &key->blend,
773                         rt,
774                         builder,
775                         blend_type,
776                         context_ptr,
777                         blend_mask,
778                         blend_in_color,
779                         color_ptr,
780                         do_branch);
781       }
782    }
783
784    LLVMBuildRetVoid(builder);
785
786    /* Verify the LLVM IR.  If invalid, dump and abort */
787 #ifdef DEBUG
788    if(LLVMVerifyFunction(function, LLVMPrintMessageAction)) {
789       if (1)
790          lp_debug_dump_value(function);
791       abort();
792    }
793 #endif
794
795    /* Apply optimizations to LLVM IR */
796    LLVMRunFunctionPassManager(gallivm->passmgr, function);
797
798    if ((gallivm_debug & GALLIVM_DEBUG_IR) || (LP_DEBUG & DEBUG_FS)) {
799       /* Print the LLVM IR to stderr */
800       lp_debug_dump_value(function);
801       debug_printf("\n");
802    }
803
804    /* Dump byte code to a file */
805    if (0) {
806       LLVMWriteBitcodeToFile(gallivm->module, "llvmpipe.bc");
807    }
808
809    /*
810     * Translate the LLVM IR into machine code.
811     */
812    {
813       void *f = LLVMGetPointerToGlobal(gallivm->engine, function);
814
815       variant->jit_function[partial_mask] = (lp_jit_frag_func)pointer_to_func(f);
816
817       if ((gallivm_debug & GALLIVM_DEBUG_ASM) || (LP_DEBUG & DEBUG_FS)) {
818          lp_disassemble(f);
819       }
820       lp_func_delete_body(function);
821    }
822 }
823
824
825 static void
826 dump_fs_variant_key(const struct lp_fragment_shader_variant_key *key)
827 {
828    unsigned i;
829
830    debug_printf("fs variant %p:\n", (void *) key);
831
832    if (key->flatshade) {
833       debug_printf("flatshade = 1\n");
834    }
835    for (i = 0; i < key->nr_cbufs; ++i) {
836       debug_printf("cbuf_format[%u] = %s\n", i, util_format_name(key->cbuf_format[i]));
837    }
838    if (key->depth.enabled) {
839       debug_printf("depth.format = %s\n", util_format_name(key->zsbuf_format));
840       debug_printf("depth.func = %s\n", util_dump_func(key->depth.func, TRUE));
841       debug_printf("depth.writemask = %u\n", key->depth.writemask);
842    }
843
844    for (i = 0; i < 2; ++i) {
845       if (key->stencil[i].enabled) {
846          debug_printf("stencil[%u].func = %s\n", i, util_dump_func(key->stencil[i].func, TRUE));
847          debug_printf("stencil[%u].fail_op = %s\n", i, util_dump_stencil_op(key->stencil[i].fail_op, TRUE));
848          debug_printf("stencil[%u].zpass_op = %s\n", i, util_dump_stencil_op(key->stencil[i].zpass_op, TRUE));
849          debug_printf("stencil[%u].zfail_op = %s\n", i, util_dump_stencil_op(key->stencil[i].zfail_op, TRUE));
850          debug_printf("stencil[%u].valuemask = 0x%x\n", i, key->stencil[i].valuemask);
851          debug_printf("stencil[%u].writemask = 0x%x\n", i, key->stencil[i].writemask);
852       }
853    }
854
855    if (key->alpha.enabled) {
856       debug_printf("alpha.func = %s\n", util_dump_func(key->alpha.func, TRUE));
857    }
858
859    if (key->occlusion_count) {
860       debug_printf("occlusion_count = 1\n");
861    }
862
863    if (key->blend.logicop_enable) {
864       debug_printf("blend.logicop_func = %s\n", util_dump_logicop(key->blend.logicop_func, TRUE));
865    }
866    else if (key->blend.rt[0].blend_enable) {
867       debug_printf("blend.rgb_func = %s\n",   util_dump_blend_func  (key->blend.rt[0].rgb_func, TRUE));
868       debug_printf("blend.rgb_src_factor = %s\n",   util_dump_blend_factor(key->blend.rt[0].rgb_src_factor, TRUE));
869       debug_printf("blend.rgb_dst_factor = %s\n",   util_dump_blend_factor(key->blend.rt[0].rgb_dst_factor, TRUE));
870       debug_printf("blend.alpha_func = %s\n",       util_dump_blend_func  (key->blend.rt[0].alpha_func, TRUE));
871       debug_printf("blend.alpha_src_factor = %s\n", util_dump_blend_factor(key->blend.rt[0].alpha_src_factor, TRUE));
872       debug_printf("blend.alpha_dst_factor = %s\n", util_dump_blend_factor(key->blend.rt[0].alpha_dst_factor, TRUE));
873    }
874    debug_printf("blend.colormask = 0x%x\n", key->blend.rt[0].colormask);
875    for (i = 0; i < key->nr_samplers; ++i) {
876       debug_printf("sampler[%u] = \n", i);
877       debug_printf("  .format = %s\n",
878                    util_format_name(key->sampler[i].format));
879       debug_printf("  .target = %s\n",
880                    util_dump_tex_target(key->sampler[i].target, TRUE));
881       debug_printf("  .pot = %u %u %u\n",
882                    key->sampler[i].pot_width,
883                    key->sampler[i].pot_height,
884                    key->sampler[i].pot_depth);
885       debug_printf("  .wrap = %s %s %s\n",
886                    util_dump_tex_wrap(key->sampler[i].wrap_s, TRUE),
887                    util_dump_tex_wrap(key->sampler[i].wrap_t, TRUE),
888                    util_dump_tex_wrap(key->sampler[i].wrap_r, TRUE));
889       debug_printf("  .min_img_filter = %s\n",
890                    util_dump_tex_filter(key->sampler[i].min_img_filter, TRUE));
891       debug_printf("  .min_mip_filter = %s\n",
892                    util_dump_tex_mipfilter(key->sampler[i].min_mip_filter, TRUE));
893       debug_printf("  .mag_img_filter = %s\n",
894                    util_dump_tex_filter(key->sampler[i].mag_img_filter, TRUE));
895       if (key->sampler[i].compare_mode != PIPE_TEX_COMPARE_NONE)
896          debug_printf("  .compare_func = %s\n", util_dump_func(key->sampler[i].compare_func, TRUE));
897       debug_printf("  .normalized_coords = %u\n", key->sampler[i].normalized_coords);
898       debug_printf("  .min_max_lod_equal = %u\n", key->sampler[i].min_max_lod_equal);
899       debug_printf("  .lod_bias_non_zero = %u\n", key->sampler[i].lod_bias_non_zero);
900       debug_printf("  .apply_min_lod = %u\n", key->sampler[i].apply_min_lod);
901       debug_printf("  .apply_max_lod = %u\n", key->sampler[i].apply_max_lod);
902    }
903 }
904
905
906 void
907 lp_debug_fs_variant(const struct lp_fragment_shader_variant *variant)
908 {
909    debug_printf("llvmpipe: Fragment shader #%u variant #%u:\n", 
910                 variant->shader->no, variant->no);
911    tgsi_dump(variant->shader->base.tokens, 0);
912    dump_fs_variant_key(&variant->key);
913    debug_printf("variant->opaque = %u\n", variant->opaque);
914    debug_printf("\n");
915 }
916
917
918 /**
919  * Generate a new fragment shader variant from the shader code and
920  * other state indicated by the key.
921  */
922 static struct lp_fragment_shader_variant *
923 generate_variant(struct llvmpipe_context *lp,
924                  struct lp_fragment_shader *shader,
925                  const struct lp_fragment_shader_variant_key *key)
926 {
927    struct lp_fragment_shader_variant *variant;
928    boolean fullcolormask;
929
930    variant = CALLOC_STRUCT(lp_fragment_shader_variant);
931    if(!variant)
932       return NULL;
933
934    variant->shader = shader;
935    variant->list_item_global.base = variant;
936    variant->list_item_local.base = variant;
937    variant->no = shader->variants_created++;
938
939    memcpy(&variant->key, key, shader->variant_key_size);
940
941    /*
942     * Determine whether we are touching all channels in the color buffer.
943     */
944    fullcolormask = FALSE;
945    if (key->nr_cbufs == 1) {
946       const struct util_format_description *format_desc;
947       format_desc = util_format_description(key->cbuf_format[0]);
948       if ((~key->blend.rt[0].colormask &
949            util_format_colormask(format_desc)) == 0) {
950          fullcolormask = TRUE;
951       }
952    }
953
954    variant->opaque =
955          !key->blend.logicop_enable &&
956          !key->blend.rt[0].blend_enable &&
957          fullcolormask &&
958          !key->stencil[0].enabled &&
959          !key->alpha.enabled &&
960          !key->depth.enabled &&
961          !shader->info.base.uses_kill
962          ? TRUE : FALSE;
963
964
965    if ((LP_DEBUG & DEBUG_FS) || (gallivm_debug & GALLIVM_DEBUG_IR)) {
966       lp_debug_fs_variant(variant);
967    }
968
969    generate_fragment(lp, shader, variant, RAST_EDGE_TEST);
970
971    if (variant->opaque) {
972       /* Specialized shader, which doesn't need to read the color buffer. */
973       generate_fragment(lp, shader, variant, RAST_WHOLE);
974    } else {
975       variant->jit_function[RAST_WHOLE] = variant->jit_function[RAST_EDGE_TEST];
976    }
977
978    return variant;
979 }
980
981
982 static void *
983 llvmpipe_create_fs_state(struct pipe_context *pipe,
984                          const struct pipe_shader_state *templ)
985 {
986    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
987    struct lp_fragment_shader *shader;
988    int nr_samplers;
989    int i;
990
991    shader = CALLOC_STRUCT(lp_fragment_shader);
992    if (!shader)
993       return NULL;
994
995    shader->no = fs_no++;
996    make_empty_list(&shader->variants);
997
998    /* get/save the summary info for this shader */
999    lp_build_tgsi_info(templ->tokens, &shader->info);
1000
1001    /* we need to keep a local copy of the tokens */
1002    shader->base.tokens = tgsi_dup_tokens(templ->tokens);
1003
1004    shader->draw_data = draw_create_fragment_shader(llvmpipe->draw, templ);
1005    if (shader->draw_data == NULL) {
1006       FREE((void *) shader->base.tokens);
1007       FREE(shader);
1008       return NULL;
1009    }
1010
1011    nr_samplers = shader->info.base.file_max[TGSI_FILE_SAMPLER] + 1;
1012
1013    shader->variant_key_size = Offset(struct lp_fragment_shader_variant_key,
1014                                      sampler[nr_samplers]);
1015
1016    for (i = 0; i < shader->info.base.num_inputs; i++) {
1017       shader->inputs[i].usage_mask = shader->info.base.input_usage_mask[i];
1018
1019       switch (shader->info.base.input_interpolate[i]) {
1020       case TGSI_INTERPOLATE_CONSTANT:
1021          shader->inputs[i].interp = LP_INTERP_CONSTANT;
1022          break;
1023       case TGSI_INTERPOLATE_LINEAR:
1024          shader->inputs[i].interp = LP_INTERP_LINEAR;
1025          break;
1026       case TGSI_INTERPOLATE_PERSPECTIVE:
1027          shader->inputs[i].interp = LP_INTERP_PERSPECTIVE;
1028          break;
1029       default:
1030          assert(0);
1031          break;
1032       }
1033
1034       switch (shader->info.base.input_semantic_name[i]) {
1035       case TGSI_SEMANTIC_COLOR:
1036          /* Colors may be either linearly or constant interpolated in
1037           * the fragment shader, but that information isn't available
1038           * here.  Mark color inputs and fix them up later.
1039           */
1040          shader->inputs[i].interp = LP_INTERP_COLOR;
1041          break;
1042       case TGSI_SEMANTIC_FACE:
1043          shader->inputs[i].interp = LP_INTERP_FACING;
1044          break;
1045       case TGSI_SEMANTIC_POSITION:
1046          /* Position was already emitted above
1047           */
1048          shader->inputs[i].interp = LP_INTERP_POSITION;
1049          shader->inputs[i].src_index = 0;
1050          continue;
1051       }
1052
1053       shader->inputs[i].src_index = i+1;
1054    }
1055
1056    if (LP_DEBUG & DEBUG_TGSI) {
1057       unsigned attrib;
1058       debug_printf("llvmpipe: Create fragment shader #%u %p:\n",
1059                    shader->no, (void *) shader);
1060       tgsi_dump(templ->tokens, 0);
1061       debug_printf("usage masks:\n");
1062       for (attrib = 0; attrib < shader->info.base.num_inputs; ++attrib) {
1063          unsigned usage_mask = shader->info.base.input_usage_mask[attrib];
1064          debug_printf("  IN[%u].%s%s%s%s\n",
1065                       attrib,
1066                       usage_mask & TGSI_WRITEMASK_X ? "x" : "",
1067                       usage_mask & TGSI_WRITEMASK_Y ? "y" : "",
1068                       usage_mask & TGSI_WRITEMASK_Z ? "z" : "",
1069                       usage_mask & TGSI_WRITEMASK_W ? "w" : "");
1070       }
1071       debug_printf("\n");
1072    }
1073
1074    return shader;
1075 }
1076
1077
1078 static void
1079 llvmpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
1080 {
1081    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1082
1083    if (llvmpipe->fs == fs)
1084       return;
1085
1086    draw_flush(llvmpipe->draw);
1087
1088    llvmpipe->fs = (struct lp_fragment_shader *) fs;
1089
1090    draw_bind_fragment_shader(llvmpipe->draw,
1091                              (llvmpipe->fs ? llvmpipe->fs->draw_data : NULL));
1092
1093    llvmpipe->dirty |= LP_NEW_FS;
1094 }
1095
1096
1097 /**
1098  * Remove shader variant from two lists: the shader's variant list
1099  * and the context's variant list.
1100  */
1101 void
1102 llvmpipe_remove_shader_variant(struct llvmpipe_context *lp,
1103                                struct lp_fragment_shader_variant *variant)
1104 {
1105    unsigned i;
1106
1107    if (gallivm_debug & GALLIVM_DEBUG_IR) {
1108       debug_printf("llvmpipe: del fs #%u var #%u v created #%u v cached"
1109                    " #%u v total cached #%u\n",
1110                    variant->shader->no,
1111                    variant->no,
1112                    variant->shader->variants_created,
1113                    variant->shader->variants_cached,
1114                    lp->nr_fs_variants);
1115    }
1116
1117    /* free all the variant's JIT'd functions */
1118    for (i = 0; i < Elements(variant->function); i++) {
1119       if (variant->function[i]) {
1120          if (variant->jit_function[i])
1121             LLVMFreeMachineCodeForFunction(lp->gallivm->engine,
1122                                            variant->function[i]);
1123          LLVMDeleteFunction(variant->function[i]);
1124       }
1125    }
1126
1127    /* remove from shader's list */
1128    remove_from_list(&variant->list_item_local);
1129    variant->shader->variants_cached--;
1130
1131    /* remove from context's list */
1132    remove_from_list(&variant->list_item_global);
1133    lp->nr_fs_variants--;
1134
1135    FREE(variant);
1136 }
1137
1138
1139 static void
1140 llvmpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
1141 {
1142    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1143    struct lp_fragment_shader *shader = fs;
1144    struct lp_fs_variant_list_item *li;
1145
1146    assert(fs != llvmpipe->fs);
1147
1148    /*
1149     * XXX: we need to flush the context until we have some sort of reference
1150     * counting in fragment shaders as they may still be binned
1151     * Flushing alone might not sufficient we need to wait on it too.
1152     */
1153    llvmpipe_finish(pipe, __FUNCTION__);
1154
1155    /* Delete all the variants */
1156    li = first_elem(&shader->variants);
1157    while(!at_end(&shader->variants, li)) {
1158       struct lp_fs_variant_list_item *next = next_elem(li);
1159       llvmpipe_remove_shader_variant(llvmpipe, li->base);
1160       li = next;
1161    }
1162
1163    /* Delete draw module's data */
1164    draw_delete_fragment_shader(llvmpipe->draw, shader->draw_data);
1165
1166    assert(shader->variants_cached == 0);
1167    FREE((void *) shader->base.tokens);
1168    FREE(shader);
1169 }
1170
1171
1172
1173 static void
1174 llvmpipe_set_constant_buffer(struct pipe_context *pipe,
1175                              uint shader, uint index,
1176                              struct pipe_resource *constants)
1177 {
1178    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1179    unsigned size = constants ? constants->width0 : 0;
1180    const void *data = constants ? llvmpipe_resource_data(constants) : NULL;
1181
1182    assert(shader < PIPE_SHADER_TYPES);
1183    assert(index < PIPE_MAX_CONSTANT_BUFFERS);
1184
1185    if(llvmpipe->constants[shader][index] == constants)
1186       return;
1187
1188    draw_flush(llvmpipe->draw);
1189
1190    /* note: reference counting */
1191    pipe_resource_reference(&llvmpipe->constants[shader][index], constants);
1192
1193    if(shader == PIPE_SHADER_VERTEX ||
1194       shader == PIPE_SHADER_GEOMETRY) {
1195       draw_set_mapped_constant_buffer(llvmpipe->draw, shader,
1196                                       index, data, size);
1197    }
1198
1199    llvmpipe->dirty |= LP_NEW_CONSTANTS;
1200 }
1201
1202
1203 /**
1204  * Return the blend factor equivalent to a destination alpha of one.
1205  */
1206 static INLINE unsigned
1207 force_dst_alpha_one(unsigned factor)
1208 {
1209    switch(factor) {
1210    case PIPE_BLENDFACTOR_DST_ALPHA:
1211       return PIPE_BLENDFACTOR_ONE;
1212    case PIPE_BLENDFACTOR_INV_DST_ALPHA:
1213       return PIPE_BLENDFACTOR_ZERO;
1214    case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
1215       return PIPE_BLENDFACTOR_ZERO;
1216    }
1217
1218    return factor;
1219 }
1220
1221
1222 /**
1223  * We need to generate several variants of the fragment pipeline to match
1224  * all the combinations of the contributing state atoms.
1225  *
1226  * TODO: there is actually no reason to tie this to context state -- the
1227  * generated code could be cached globally in the screen.
1228  */
1229 static void
1230 make_variant_key(struct llvmpipe_context *lp,
1231                  struct lp_fragment_shader *shader,
1232                  struct lp_fragment_shader_variant_key *key)
1233 {
1234    unsigned i;
1235
1236    memset(key, 0, shader->variant_key_size);
1237
1238    if (lp->framebuffer.zsbuf) {
1239       if (lp->depth_stencil->depth.enabled) {
1240          key->zsbuf_format = lp->framebuffer.zsbuf->format;
1241          memcpy(&key->depth, &lp->depth_stencil->depth, sizeof key->depth);
1242       }
1243       if (lp->depth_stencil->stencil[0].enabled) {
1244          key->zsbuf_format = lp->framebuffer.zsbuf->format;
1245          memcpy(&key->stencil, &lp->depth_stencil->stencil, sizeof key->stencil);
1246       }
1247    }
1248
1249    key->alpha.enabled = lp->depth_stencil->alpha.enabled;
1250    if(key->alpha.enabled)
1251       key->alpha.func = lp->depth_stencil->alpha.func;
1252    /* alpha.ref_value is passed in jit_context */
1253
1254    key->flatshade = lp->rasterizer->flatshade;
1255    if (lp->active_query_count) {
1256       key->occlusion_count = TRUE;
1257    }
1258
1259    if (lp->framebuffer.nr_cbufs) {
1260       memcpy(&key->blend, lp->blend, sizeof key->blend);
1261    }
1262
1263    key->nr_cbufs = lp->framebuffer.nr_cbufs;
1264    for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
1265       enum pipe_format format = lp->framebuffer.cbufs[i]->format;
1266       struct pipe_rt_blend_state *blend_rt = &key->blend.rt[i];
1267       const struct util_format_description *format_desc;
1268
1269       key->cbuf_format[i] = format;
1270
1271       format_desc = util_format_description(format);
1272       assert(format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
1273              format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
1274
1275       blend_rt->colormask = lp->blend->rt[i].colormask;
1276
1277       /*
1278        * Mask out color channels not present in the color buffer.
1279        */
1280       blend_rt->colormask &= util_format_colormask(format_desc);
1281
1282       /*
1283        * Our swizzled render tiles always have an alpha channel, but the linear
1284        * render target format often does not, so force here the dst alpha to be
1285        * one.
1286        *
1287        * This is not a mere optimization. Wrong results will be produced if the
1288        * dst alpha is used, the dst format does not have alpha, and the previous
1289        * rendering was not flushed from the swizzled to linear buffer. For
1290        * example, NonPowTwo DCT.
1291        *
1292        * TODO: This should be generalized to all channels for better
1293        * performance, but only alpha causes correctness issues.
1294        *
1295        * Also, force rgb/alpha func/factors match, to make AoS blending easier.
1296        */
1297       if (format_desc->swizzle[3] > UTIL_FORMAT_SWIZZLE_W) {
1298          blend_rt->rgb_src_factor   = force_dst_alpha_one(blend_rt->rgb_src_factor);
1299          blend_rt->rgb_dst_factor   = force_dst_alpha_one(blend_rt->rgb_dst_factor);
1300          blend_rt->alpha_func       = blend_rt->rgb_func;
1301          blend_rt->alpha_src_factor = blend_rt->rgb_src_factor;
1302          blend_rt->alpha_dst_factor = blend_rt->rgb_dst_factor;
1303       }
1304    }
1305
1306    /* This value will be the same for all the variants of a given shader:
1307     */
1308    key->nr_samplers = shader->info.base.file_max[TGSI_FILE_SAMPLER] + 1;
1309
1310    for(i = 0; i < key->nr_samplers; ++i) {
1311       if(shader->info.base.file_mask[TGSI_FILE_SAMPLER] & (1 << i)) {
1312          lp_sampler_static_state(&key->sampler[i],
1313                                  lp->fragment_sampler_views[i],
1314                                  lp->sampler[i]);
1315       }
1316    }
1317 }
1318
1319
1320
1321 /**
1322  * Update fragment shader state.  This is called just prior to drawing
1323  * something when some fragment-related state has changed.
1324  */
1325 void 
1326 llvmpipe_update_fs(struct llvmpipe_context *lp)
1327 {
1328    struct lp_fragment_shader *shader = lp->fs;
1329    struct lp_fragment_shader_variant_key key;
1330    struct lp_fragment_shader_variant *variant = NULL;
1331    struct lp_fs_variant_list_item *li;
1332
1333    make_variant_key(lp, shader, &key);
1334
1335    /* Search the variants for one which matches the key */
1336    li = first_elem(&shader->variants);
1337    while(!at_end(&shader->variants, li)) {
1338       if(memcmp(&li->base->key, &key, shader->variant_key_size) == 0) {
1339          variant = li->base;
1340          break;
1341       }
1342       li = next_elem(li);
1343    }
1344
1345    if (variant) {
1346       /* Move this variant to the head of the list to implement LRU
1347        * deletion of shader's when we have too many.
1348        */
1349       move_to_head(&lp->fs_variants_list, &variant->list_item_global);
1350    }
1351    else {
1352       /* variant not found, create it now */
1353       int64_t t0, t1, dt;
1354       unsigned i;
1355
1356       /* First, check if we've exceeded the max number of shader variants.
1357        * If so, free 25% of them (the least recently used ones).
1358        */
1359       if (lp->nr_fs_variants >= LP_MAX_SHADER_VARIANTS) {
1360          struct pipe_context *pipe = &lp->pipe;
1361
1362          /*
1363           * XXX: we need to flush the context until we have some sort of
1364           * reference counting in fragment shaders as they may still be binned
1365           * Flushing alone might not be sufficient we need to wait on it too.
1366           */
1367          llvmpipe_finish(pipe, __FUNCTION__);
1368
1369          for (i = 0; i < LP_MAX_SHADER_VARIANTS / 4; i++) {
1370             struct lp_fs_variant_list_item *item;
1371             item = last_elem(&lp->fs_variants_list);
1372             llvmpipe_remove_shader_variant(lp, item->base);
1373          }
1374       }
1375
1376       /*
1377        * Generate the new variant.
1378        */
1379       t0 = os_time_get();
1380       variant = generate_variant(lp, shader, &key);
1381       t1 = os_time_get();
1382       dt = t1 - t0;
1383       LP_COUNT_ADD(llvm_compile_time, dt);
1384       LP_COUNT_ADD(nr_llvm_compiles, 2);  /* emit vs. omit in/out test */
1385
1386       llvmpipe_variant_count++;
1387
1388       /* Put the new variant into the list */
1389       if (variant) {
1390          insert_at_head(&shader->variants, &variant->list_item_local);
1391          insert_at_head(&lp->fs_variants_list, &variant->list_item_global);
1392          lp->nr_fs_variants++;
1393          shader->variants_cached++;
1394       }
1395    }
1396
1397    /* Bind this variant */
1398    lp_setup_set_fs_variant(lp->setup, variant);
1399 }
1400
1401
1402
1403
1404
1405
1406
1407 void
1408 llvmpipe_init_fs_funcs(struct llvmpipe_context *llvmpipe)
1409 {
1410    llvmpipe->pipe.create_fs_state = llvmpipe_create_fs_state;
1411    llvmpipe->pipe.bind_fs_state   = llvmpipe_bind_fs_state;
1412    llvmpipe->pipe.delete_fs_state = llvmpipe_delete_fs_state;
1413
1414    llvmpipe->pipe.set_constant_buffer = llvmpipe_set_constant_buffer;
1415 }