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