Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
/**************************************************************************
2
 *
3
 * Copyright 2010 VMware, Inc.
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 SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
21
 *
22
 * The above copyright notice and this permission notice (including the
23
 * next paragraph) shall be included in all copies or substantial portions
24
 * of the Software.
25
 *
26
 **************************************************************************/
27
 
28
 
29
#ifndef LP_STATE_FS_H_
30
#define LP_STATE_FS_H_
31
 
32
 
33
#include "pipe/p_compiler.h"
34
#include "pipe/p_state.h"
35
#include "tgsi/tgsi_scan.h" /* for tgsi_shader_info */
36
#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
37
#include "gallivm/lp_bld_tgsi.h" /* for lp_tgsi_info */
38
#include "lp_bld_interp.h" /* for struct lp_shader_input */
39
 
40
 
41
struct tgsi_token;
42
struct lp_fragment_shader;
43
 
44
 
45
/** Indexes into jit_function[] array */
46
#define RAST_WHOLE 0
47
#define RAST_EDGE_TEST 1
48
 
49
 
50
struct lp_sampler_static_state
51
{
52
   /*
53
    * These attributes are effectively interleaved for more sane key handling.
54
    * However, there might be lots of null space if the amount of samplers and
55
    * textures isn't the same.
56
    */
57
   struct lp_static_sampler_state sampler_state;
58
   struct lp_static_texture_state texture_state;
59
};
60
 
61
 
62
struct lp_fragment_shader_variant_key
63
{
64
   struct pipe_depth_state depth;
65
   struct pipe_stencil_state stencil[2];
66
   struct pipe_blend_state blend;
67
 
68
   struct {
69
      unsigned enabled:1;
70
      unsigned func:3;
71
   } alpha;
72
 
73
   unsigned nr_cbufs:8;
74
   unsigned nr_samplers:8;      /* actually derivable from just the shader */
75
   unsigned nr_sampler_views:8; /* actually derivable from just the shader */
76
   unsigned flatshade:1;
77
   unsigned occlusion_count:1;
78
   unsigned resource_1d:1;
79
   unsigned depth_clamp:1;
80
 
81
   enum pipe_format zsbuf_format;
82
   enum pipe_format cbuf_format[PIPE_MAX_COLOR_BUFS];
83
 
84
   struct lp_sampler_static_state state[PIPE_MAX_SHADER_SAMPLER_VIEWS];
85
};
86
 
87
 
88
/** doubly-linked list item */
89
struct lp_fs_variant_list_item
90
{
91
   struct lp_fragment_shader_variant *base;
92
   struct lp_fs_variant_list_item *next, *prev;
93
};
94
 
95
 
96
struct lp_fragment_shader_variant
97
{
98
   struct lp_fragment_shader_variant_key key;
99
 
100
   boolean opaque;
101
   uint8_t ps_inv_multiplier;
102
 
103
   struct gallivm_state *gallivm;
104
 
105
   LLVMTypeRef jit_context_ptr_type;
106
   LLVMTypeRef jit_thread_data_ptr_type;
107
   LLVMTypeRef jit_linear_context_ptr_type;
108
 
109
   LLVMValueRef function[2];
110
 
111
   lp_jit_frag_func jit_function[2];
112
 
113
   /* Total number of LLVM instructions generated */
114
   unsigned nr_instrs;
115
 
116
   struct lp_fs_variant_list_item list_item_global, list_item_local;
117
   struct lp_fragment_shader *shader;
118
 
119
   /* For debugging/profiling purposes */
120
   unsigned no;
121
};
122
 
123
 
124
/** Subclass of pipe_shader_state */
125
struct lp_fragment_shader
126
{
127
   struct pipe_shader_state base;
128
 
129
   struct lp_tgsi_info info;
130
 
131
   struct lp_fs_variant_list_item variants;
132
 
133
   struct draw_fragment_shader *draw_data;
134
 
135
   /* For debugging/profiling purposes */
136
   unsigned variant_key_size;
137
   unsigned no;
138
   unsigned variants_created;
139
   unsigned variants_cached;
140
 
141
   /** Fragment shader input interpolation info */
142
   struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
143
};
144
 
145
 
146
void
147
lp_debug_fs_variant(const struct lp_fragment_shader_variant *variant);
148
 
149
void
150
llvmpipe_remove_shader_variant(struct llvmpipe_context *lp,
151
                               struct lp_fragment_shader_variant *variant);
152
 
153
boolean
154
llvmpipe_rasterization_disabled(struct llvmpipe_context *lp);
155
 
156
 
157
#endif /* LP_STATE_FS_H_ */