118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca/**************************************************************************
218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca *
318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * Copyright 2010 VMware, Inc.
418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * All Rights Reserved.
518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca *
618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * copy of this software and associated documentation files (the
818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * "Software"), to deal in the Software without restriction, including
918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
1218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * the following conditions:
1318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca *
1418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
1818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
1918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE.
2118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca *
2218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * The above copyright notice and this permission notice (including the
2318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
2418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca * of the Software.
2518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca *
2618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca **************************************************************************/
2718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
2818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
2918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#ifndef LP_STATE_FS_H_
3018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#define LP_STATE_FS_H_
3118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
3218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
3318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#include "pipe/p_compiler.h"
3418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#include "pipe/p_state.h"
3518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#include "tgsi/tgsi_scan.h" /* for tgsi_shader_info */
3618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
37986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca#include "gallivm/lp_bld_tgsi.h" /* for lp_tgsi_info */
385b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell#include "lp_bld_interp.h" /* for struct lp_shader_input */
3918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
4018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
4118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecastruct tgsi_token;
4218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecastruct lp_fragment_shader;
4318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
4418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
4518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca/** Indexes into jit_function[] array */
4618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#define RAST_WHOLE 0
4718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#define RAST_EDGE_TEST 1
4818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
4918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
5018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecastruct lp_fragment_shader_variant_key
5118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca{
5218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct pipe_depth_state depth;
5318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct pipe_stencil_state stencil[2];
5418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct pipe_blend_state blend;
5500989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca
56277d768d10d8a98a7cae8b709ff78bb8d1f695f1José Fonseca   struct {
57277d768d10d8a98a7cae8b709ff78bb8d1f695f1José Fonseca      unsigned enabled:1;
58277d768d10d8a98a7cae8b709ff78bb8d1f695f1José Fonseca      unsigned func:3;
59277d768d10d8a98a7cae8b709ff78bb8d1f695f1José Fonseca   } alpha;
60277d768d10d8a98a7cae8b709ff78bb8d1f695f1José Fonseca
6118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   unsigned nr_cbufs:8;
623d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   unsigned nr_samplers:8;	/* actually derivable from just the shader */
6318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   unsigned flatshade:1;
6418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   unsigned occlusion_count:1;
6518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
6600989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   enum pipe_format zsbuf_format;
6700989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca   enum pipe_format cbuf_format[PIPE_MAX_COLOR_BUFS];
6800989d5bfc29f632886066d048a366ff4d2d03bcJosé Fonseca
6918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS];
7018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca};
7118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
72efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
73efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/** doubly-linked list item */
7417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheideggerstruct lp_fs_variant_list_item
7517c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger{
7617c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fragment_shader_variant *base;
7717c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item *next, *prev;
7817c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger};
7918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
80efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
8118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecastruct lp_fragment_shader_variant
8218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca{
8318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct lp_fragment_shader_variant_key key;
8418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
8518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   boolean opaque;
8618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
873469715a8a171512cf9b528702e70393f01c6041José Fonseca   struct gallivm_state *gallivm;
883469715a8a171512cf9b528702e70393f01c6041José Fonseca
893469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef jit_context_ptr_type;
903469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef jit_thread_data_ptr_type;
913469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef jit_linear_context_ptr_type;
923469715a8a171512cf9b528702e70393f01c6041José Fonseca
9318fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   LLVMValueRef function[2];
9418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
9518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   lp_jit_frag_func jit_function[2];
9618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
976cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   /* Total number of LLVM instructions generated */
986cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   unsigned nr_instrs;
996cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca
10017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item list_item_global, list_item_local;
101197636814e4e523b98d3e25d918d589ef61b8acaJosé Fonseca   struct lp_fragment_shader *shader;
10281862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
10381862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   /* For debugging/profiling purposes */
10481862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   unsigned no;
10518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca};
10618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
10718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
10818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca/** Subclass of pipe_shader_state */
10918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecastruct lp_fragment_shader
11018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca{
11118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   struct pipe_shader_state base;
11218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
113986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca   struct lp_tgsi_info info;
11418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
11517c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item variants;
11681862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca
117955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul   struct draw_fragment_shader *draw_data;
118955d76c3d2004c058c326d68eddc5a06d1611a41Brian Paul
11981862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   /* For debugging/profiling purposes */
1203d4b60f1f7be3dc54951c9c414601062e73ca674Keith Whitwell   unsigned variant_key_size;
12181862bbbc82341b1271fc4bc7b803d409826aebaJosé Fonseca   unsigned no;
12217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   unsigned variants_created;
12317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   unsigned variants_cached;
1245b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
1255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   /** Fragment shader input interpolation info */
1265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
12718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca};
12818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
12918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca
13071e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwellvoid
13171e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwelllp_debug_fs_variant(const struct lp_fragment_shader_variant *variant);
13271e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell
133efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid
134efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulllvmpipe_remove_shader_variant(struct llvmpipe_context *lp,
135efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                               struct lp_fragment_shader_variant *variant);
136efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
13771e27ef21c4a24aeadadb85f60774ec48a7e3cffKeith Whitwell
13818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca#endif /* LP_STATE_FS_H_ */
139