lp_state.h revision c61bf363937f40624a5632745630d4f2b9907082
1/************************************************************************** 2 * 3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28/* Authors: Keith Whitwell <keith@tungstengraphics.com> 29 */ 30 31#ifndef LP_STATE_H 32#define LP_STATE_H 33 34#include <llvm-c/Core.h> 35 36#include "pipe/p_state.h" 37#include "tgsi/tgsi_scan.h" 38#include "lp_jit.h" 39#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */ 40 41 42#define LP_NEW_VIEWPORT 0x1 43#define LP_NEW_RASTERIZER 0x2 44#define LP_NEW_FS 0x4 45#define LP_NEW_BLEND 0x8 46#define LP_NEW_CLIP 0x10 47#define LP_NEW_SCISSOR 0x20 48#define LP_NEW_STIPPLE 0x40 49#define LP_NEW_FRAMEBUFFER 0x80 50#define LP_NEW_DEPTH_STENCIL_ALPHA 0x100 51#define LP_NEW_CONSTANTS 0x200 52#define LP_NEW_SAMPLER 0x400 53#define LP_NEW_TEXTURE 0x800 54#define LP_NEW_VERTEX 0x1000 55#define LP_NEW_VS 0x2000 56#define LP_NEW_QUERY 0x4000 57#define LP_NEW_BLEND_COLOR 0x8000 58 59 60struct vertex_info; 61struct pipe_context; 62struct llvmpipe_context; 63 64struct lp_fragment_shader; 65 66 67struct lp_fragment_shader_variant_key 68{ 69 struct pipe_depth_state depth; 70 struct pipe_alpha_state alpha; 71 struct pipe_blend_state blend; 72 enum pipe_format zsbuf_format; 73 unsigned nr_cbufs:8; 74 unsigned flatshade:1; 75 unsigned scissor:1; 76 77 struct { 78 ubyte colormask; 79 } cbuf_blend[PIPE_MAX_COLOR_BUFS]; 80 81 struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS]; 82}; 83 84 85struct lp_fragment_shader_variant 86{ 87 struct lp_fragment_shader *shader; 88 89 struct lp_fragment_shader_variant_key key; 90 91 LLVMValueRef function[2]; 92 93 lp_jit_frag_func jit_function[2]; 94 95 struct lp_fragment_shader_variant *next; 96}; 97 98 99/** 100 * Subclass of pipe_shader_state (though it doesn't really need to be). 101 * 102 * This is starting to look an awful lot like a quad pipeline stage... 103 */ 104struct lp_fragment_shader 105{ 106 struct pipe_shader_state base; 107 108 struct tgsi_shader_info info; 109 110 struct lp_fragment_shader_variant *variants; 111 112 struct lp_fragment_shader_variant *current; 113}; 114 115 116/** Subclass of pipe_shader_state */ 117struct lp_vertex_shader { 118 struct pipe_shader_state shader; 119 struct draw_vertex_shader *draw_data; 120}; 121 122 123 124void * 125llvmpipe_create_blend_state(struct pipe_context *, 126 const struct pipe_blend_state *); 127void llvmpipe_bind_blend_state(struct pipe_context *, 128 void *); 129void llvmpipe_delete_blend_state(struct pipe_context *, 130 void *); 131 132void * 133llvmpipe_create_sampler_state(struct pipe_context *, 134 const struct pipe_sampler_state *); 135void llvmpipe_bind_sampler_states(struct pipe_context *, unsigned, void **); 136void 137llvmpipe_bind_vertex_sampler_states(struct pipe_context *, 138 unsigned num_samplers, 139 void **samplers); 140void llvmpipe_delete_sampler_state(struct pipe_context *, void *); 141 142void * 143llvmpipe_create_depth_stencil_state(struct pipe_context *, 144 const struct pipe_depth_stencil_alpha_state *); 145void llvmpipe_bind_depth_stencil_state(struct pipe_context *, void *); 146void llvmpipe_delete_depth_stencil_state(struct pipe_context *, void *); 147 148void * 149llvmpipe_create_rasterizer_state(struct pipe_context *, 150 const struct pipe_rasterizer_state *); 151void llvmpipe_bind_rasterizer_state(struct pipe_context *, void *); 152void llvmpipe_delete_rasterizer_state(struct pipe_context *, void *); 153 154void llvmpipe_set_framebuffer_state( struct pipe_context *, 155 const struct pipe_framebuffer_state * ); 156 157void llvmpipe_set_blend_color( struct pipe_context *pipe, 158 const struct pipe_blend_color *blend_color ); 159 160void llvmpipe_set_clip_state( struct pipe_context *, 161 const struct pipe_clip_state * ); 162 163void llvmpipe_set_constant_buffer(struct pipe_context *, 164 uint shader, uint index, 165 struct pipe_buffer *buf); 166 167void *llvmpipe_create_fs_state(struct pipe_context *, 168 const struct pipe_shader_state *); 169void llvmpipe_bind_fs_state(struct pipe_context *, void *); 170void llvmpipe_delete_fs_state(struct pipe_context *, void *); 171void *llvmpipe_create_vs_state(struct pipe_context *, 172 const struct pipe_shader_state *); 173void llvmpipe_bind_vs_state(struct pipe_context *, void *); 174void llvmpipe_delete_vs_state(struct pipe_context *, void *); 175 176void llvmpipe_set_polygon_stipple( struct pipe_context *, 177 const struct pipe_poly_stipple * ); 178 179void llvmpipe_set_scissor_state( struct pipe_context *, 180 const struct pipe_scissor_state * ); 181 182void llvmpipe_set_sampler_textures( struct pipe_context *, 183 unsigned num, 184 struct pipe_texture ** ); 185 186void 187llvmpipe_set_vertex_sampler_textures(struct pipe_context *, 188 unsigned num_textures, 189 struct pipe_texture **); 190 191void llvmpipe_set_viewport_state( struct pipe_context *, 192 const struct pipe_viewport_state * ); 193 194void llvmpipe_set_vertex_elements(struct pipe_context *, 195 unsigned count, 196 const struct pipe_vertex_element *); 197 198void llvmpipe_set_vertex_buffers(struct pipe_context *, 199 unsigned count, 200 const struct pipe_vertex_buffer *); 201 202void llvmpipe_update_fs(struct llvmpipe_context *lp); 203 204void llvmpipe_update_derived( struct llvmpipe_context *llvmpipe ); 205 206 207void llvmpipe_draw_arrays(struct pipe_context *pipe, unsigned mode, 208 unsigned start, unsigned count); 209 210void llvmpipe_draw_elements(struct pipe_context *pipe, 211 struct pipe_buffer *indexBuffer, 212 unsigned indexSize, 213 unsigned mode, unsigned start, unsigned count); 214void 215llvmpipe_draw_range_elements(struct pipe_context *pipe, 216 struct pipe_buffer *indexBuffer, 217 unsigned indexSize, 218 unsigned min_index, 219 unsigned max_index, 220 unsigned mode, unsigned start, unsigned count); 221 222void 223llvmpipe_map_texture_surfaces(struct llvmpipe_context *lp); 224 225void 226llvmpipe_unmap_texture_surfaces(struct llvmpipe_context *lp); 227 228 229#endif 230