Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/llvmpipe/lp_bld_interp.h
4570 views
1
/**************************************************************************
2
*
3
* Copyright 2009 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 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 VMWARE 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
/**
29
* @file
30
* Position and shader input interpolation.
31
*
32
* Special attention is given to the interpolation of side by side quads.
33
* Multiplications are made only for the first quad. Interpolation of
34
* inputs for posterior quads are done exclusively with additions, and
35
* perspective divide if necessary.
36
*
37
* @author Jose Fonseca <[email protected]>
38
*/
39
40
#ifndef LP_BLD_INTERP_H
41
#define LP_BLD_INTERP_H
42
43
44
#include "gallivm/lp_bld.h"
45
#include "gallivm/lp_bld_type.h"
46
47
#include "tgsi/tgsi_exec.h"
48
49
/**
50
* Describes how to compute the interpolation coefficients (a0, dadx, dady)
51
* from the vertices passed into our triangle/line/point functions by the
52
* draw module.
53
*
54
* Vertices are treated as an array of float[4] values, indexed by
55
* src_index.
56
*
57
* LP_INTERP_COLOR is translated to either LP_INTERP_CONSTANT or
58
* PERSPECTIVE depending on flatshade state.
59
*/
60
enum lp_interp {
61
LP_INTERP_CONSTANT,
62
LP_INTERP_COLOR,
63
LP_INTERP_LINEAR,
64
LP_INTERP_PERSPECTIVE,
65
LP_INTERP_POSITION,
66
LP_INTERP_FACING
67
};
68
69
struct lp_shader_input {
70
uint interp:4; /* enum lp_interp */
71
uint usage_mask:4; /* bitmask of TGSI_WRITEMASK_x flags */
72
uint src_index:8; /* where to find values in incoming vertices */
73
uint cyl_wrap:4; /* TGSI_CYLINDRICAL_WRAP_x flags */
74
uint location:2; /* TGSI_INTERPOLOATE_LOC_* */
75
uint padding:10;
76
};
77
78
79
struct lp_build_interp_soa_context
80
{
81
/* TGSI_QUAD_SIZE x float */
82
struct lp_build_context coeff_bld;
83
struct lp_build_context setup_bld;
84
85
unsigned num_attribs;
86
unsigned mask[1 + PIPE_MAX_SHADER_INPUTS]; /**< TGSI_WRITE_MASK_x */
87
enum lp_interp interp[1 + PIPE_MAX_SHADER_INPUTS];
88
unsigned interp_loc[1 + PIPE_MAX_SHADER_INPUTS];
89
boolean depth_clamp;
90
91
double pos_offset;
92
unsigned coverage_samples;
93
LLVMValueRef num_loop;
94
LLVMValueRef sample_pos_array;
95
96
LLVMValueRef x;
97
LLVMValueRef y;
98
99
LLVMValueRef a0_ptr;
100
LLVMValueRef dadx_ptr;
101
LLVMValueRef dady_ptr;
102
103
LLVMValueRef a0aos[1 + PIPE_MAX_SHADER_INPUTS];
104
LLVMValueRef dadxaos[1 + PIPE_MAX_SHADER_INPUTS];
105
LLVMValueRef dadyaos[1 + PIPE_MAX_SHADER_INPUTS];
106
107
LLVMValueRef attribs[1 + PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS];
108
109
LLVMValueRef xoffset_store;
110
LLVMValueRef yoffset_store;
111
112
/*
113
* Convenience pointers. Callers may access this one.
114
*/
115
const LLVMValueRef *pos;
116
const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS];
117
};
118
119
120
void
121
lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
122
struct gallivm_state *gallivm,
123
unsigned num_inputs,
124
const struct lp_shader_input *inputs,
125
boolean pixel_center_integer,
126
unsigned coverage_samples,
127
LLVMValueRef sample_pos_array,
128
LLVMValueRef num_loop,
129
boolean depth_clamp,
130
LLVMBuilderRef builder,
131
struct lp_type type,
132
LLVMValueRef a0_ptr,
133
LLVMValueRef dadx_ptr,
134
LLVMValueRef dady_ptr,
135
LLVMValueRef x,
136
LLVMValueRef y);
137
138
void
139
lp_build_interp_soa_update_inputs_dyn(struct lp_build_interp_soa_context *bld,
140
struct gallivm_state *gallivm,
141
LLVMValueRef quad_start_index,
142
LLVMValueRef mask_store,
143
LLVMValueRef sample_id);
144
145
void
146
lp_build_interp_soa_update_pos_dyn(struct lp_build_interp_soa_context *bld,
147
struct gallivm_state *gallivm,
148
LLVMValueRef quad_start_index,
149
LLVMValueRef sample_id);
150
151
LLVMValueRef
152
lp_build_interp_soa(struct lp_build_interp_soa_context *bld,
153
struct gallivm_state *gallivm,
154
LLVMValueRef loop_iter,
155
LLVMValueRef mask_store,
156
unsigned attrib, unsigned chan,
157
unsigned loc,
158
LLVMValueRef indir_index,
159
LLVMValueRef offsets[2]);
160
161
#endif /* LP_BLD_INTERP_H */
162
163