File: | root/firefox-clang/gfx/wr/swgl/src/program.h |
Warning: | line 98, column 8 Excessive padding in 'struct glsl::FragmentShaderImpl' (32 padding bytes, where 0 is optimal). Optimal fields order: swgl_IsPixelDiscarded, gl_FragCoord, gl_FragColor, gl_SecondaryFragColor, init_span_func, run_func, skip_func, init_span_w_func, run_w_func, skip_w_func, draw_span_RGBA8_func, draw_span_R8_func, swgl_OutRGBA8, swgl_OutR8, flags, swgl_SpanLength, swgl_StepZW, consider reordering the fields or adding explicit padding members |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* This Source Code Form is subject to the terms of the Mozilla Public |
2 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | |
5 | struct VertexAttrib; |
6 | |
7 | namespace glsl { |
8 | |
9 | // Type holding group of scalars interpolated across rasterized rows and spans, |
10 | // shuttling values between vertex shaders and fragment shaders. |
11 | // GCC requires power-of-two vector sizes, so must use glsl type as workaround |
12 | // to operate in Float-sized chunks. |
13 | typedef vec3 Interpolants; |
14 | |
15 | // Clip distances, if enabled, are always stored in the first SIMD chunk of the |
16 | // interpolants. |
17 | static ALWAYS_INLINE__attribute__((always_inline)) inline Float get_clip_distances(const Interpolants& interp) { |
18 | return interp.x; |
19 | } |
20 | |
21 | struct VertexShaderImpl; |
22 | struct FragmentShaderImpl; |
23 | |
24 | struct ProgramImpl { |
25 | virtual ~ProgramImpl() {} |
26 | virtual int get_uniform(const char* name) const = 0; |
27 | virtual void bind_attrib(const char* name, int index) = 0; |
28 | virtual int get_attrib(const char* name) const = 0; |
29 | virtual size_t interpolants_size() const = 0; |
30 | virtual VertexShaderImpl* get_vertex_shader() = 0; |
31 | virtual FragmentShaderImpl* get_fragment_shader() = 0; |
32 | virtual const char* get_name() const = 0; |
33 | }; |
34 | |
35 | typedef ProgramImpl* (*ProgramLoader)(); |
36 | |
37 | // The maximum size of the gl_ClipDistance array. |
38 | constexpr int32_t gl_MaxClipDistances = 4; |
39 | |
40 | struct VertexShaderImpl { |
41 | typedef void (*SetUniform1iFunc)(VertexShaderImpl*, int index, int value); |
42 | typedef void (*SetUniform4fvFunc)(VertexShaderImpl*, int index, |
43 | const float* value); |
44 | typedef void (*SetUniformMatrix4fvFunc)(VertexShaderImpl*, int index, |
45 | const float* value); |
46 | typedef void (*InitBatchFunc)(VertexShaderImpl*); |
47 | typedef void (*LoadAttribsFunc)(VertexShaderImpl*, VertexAttrib* attribs, |
48 | uint32_t start, int instance, int count); |
49 | typedef void (*RunPrimitiveFunc)(VertexShaderImpl*, char* interps, |
50 | size_t interp_stride); |
51 | |
52 | SetUniform1iFunc set_uniform_1i_func = nullptr; |
53 | SetUniform4fvFunc set_uniform_4fv_func = nullptr; |
54 | SetUniformMatrix4fvFunc set_uniform_matrix4fv_func = nullptr; |
55 | InitBatchFunc init_batch_func = nullptr; |
56 | LoadAttribsFunc load_attribs_func = nullptr; |
57 | RunPrimitiveFunc run_primitive_func = nullptr; |
58 | |
59 | enum FLAGS { |
60 | CLIP_DISTANCE = 1 << 0, |
61 | }; |
62 | int flags = 0; |
63 | void enable_clip_distance() { flags |= CLIP_DISTANCE; } |
64 | ALWAYS_INLINE__attribute__((always_inline)) inline bool use_clip_distance() const { |
65 | return (flags & CLIP_DISTANCE) != 0; |
66 | } |
67 | |
68 | vec4 gl_Position; |
69 | Float gl_ClipDistance[gl_MaxClipDistances]; |
70 | |
71 | void set_uniform_1i(int index, int value) { |
72 | (*set_uniform_1i_func)(this, index, value); |
73 | } |
74 | |
75 | void set_uniform_4fv(int index, const float* value) { |
76 | (*set_uniform_4fv_func)(this, index, value); |
77 | } |
78 | |
79 | void set_uniform_matrix4fv(int index, const float* value) { |
80 | (*set_uniform_matrix4fv_func)(this, index, value); |
81 | } |
82 | |
83 | void init_batch() { (*init_batch_func)(this); } |
84 | |
85 | ALWAYS_INLINE__attribute__((always_inline)) inline void load_attribs(VertexAttrib* attribs, uint32_t start, |
86 | int instance, int count) { |
87 | (*load_attribs_func)(this, attribs, start, instance, count); |
88 | } |
89 | |
90 | ALWAYS_INLINE__attribute__((always_inline)) inline void run_primitive(char* interps, size_t interp_stride) { |
91 | (*run_primitive_func)(this, interps, interp_stride); |
92 | } |
93 | }; |
94 | |
95 | // The number of pixels in a step. |
96 | constexpr int32_t swgl_StepSize = 4; |
97 | |
98 | struct FragmentShaderImpl { |
Excessive padding in 'struct glsl::FragmentShaderImpl' (32 padding bytes, where 0 is optimal). Optimal fields order: swgl_IsPixelDiscarded, gl_FragCoord, gl_FragColor, gl_SecondaryFragColor, init_span_func, run_func, skip_func, init_span_w_func, run_w_func, skip_w_func, draw_span_RGBA8_func, draw_span_R8_func, swgl_OutRGBA8, swgl_OutR8, flags, swgl_SpanLength, swgl_StepZW, consider reordering the fields or adding explicit padding members | |
99 | typedef void (*InitSpanFunc)(FragmentShaderImpl*, const void* interps, |
100 | const void* step); |
101 | typedef void (*RunFunc)(FragmentShaderImpl*); |
102 | typedef void (*SkipFunc)(FragmentShaderImpl*, int steps); |
103 | typedef void (*InitSpanWFunc)(FragmentShaderImpl*, const void* interps, |
104 | const void* step); |
105 | typedef void (*RunWFunc)(FragmentShaderImpl*); |
106 | typedef void (*SkipWFunc)(FragmentShaderImpl*, int steps); |
107 | typedef int (*DrawSpanRGBA8Func)(FragmentShaderImpl*); |
108 | typedef int (*DrawSpanR8Func)(FragmentShaderImpl*); |
109 | |
110 | InitSpanFunc init_span_func = nullptr; |
111 | RunFunc run_func = nullptr; |
112 | SkipFunc skip_func = nullptr; |
113 | InitSpanWFunc init_span_w_func = nullptr; |
114 | RunWFunc run_w_func = nullptr; |
115 | SkipWFunc skip_w_func = nullptr; |
116 | DrawSpanRGBA8Func draw_span_RGBA8_func = nullptr; |
117 | DrawSpanR8Func draw_span_R8_func = nullptr; |
118 | |
119 | enum FLAGS { |
120 | DISCARD = 1 << 0, |
121 | PERSPECTIVE = 1 << 1, |
122 | }; |
123 | int flags = 0; |
124 | void enable_discard() { flags |= DISCARD; } |
125 | void enable_perspective() { flags |= PERSPECTIVE; } |
126 | ALWAYS_INLINE__attribute__((always_inline)) inline bool use_discard() const { return (flags & DISCARD) != 0; } |
127 | ALWAYS_INLINE__attribute__((always_inline)) inline bool use_perspective() const { |
128 | return (flags & PERSPECTIVE) != 0; |
129 | } |
130 | |
131 | vec4 gl_FragCoord; |
132 | vec4 gl_FragColor; |
133 | vec4 gl_SecondaryFragColor; |
134 | |
135 | vec2_scalar swgl_StepZW; |
136 | Bool swgl_IsPixelDiscarded = false; |
137 | // The current buffer position for committing span output. |
138 | uint32_t* swgl_OutRGBA8 = nullptr; |
139 | uint8_t* swgl_OutR8 = nullptr; |
140 | // The remaining number of pixels in the span. |
141 | int32_t swgl_SpanLength = 0; |
142 | |
143 | ALWAYS_INLINE__attribute__((always_inline)) inline void step_fragcoord(int steps = 4) { gl_FragCoord.x += steps; } |
144 | |
145 | ALWAYS_INLINE__attribute__((always_inline)) inline void step_perspective(int steps = 4) { |
146 | gl_FragCoord.z += swgl_StepZW.x * steps; |
147 | gl_FragCoord.w += swgl_StepZW.y * steps; |
148 | } |
149 | |
150 | template <bool W = false> |
151 | ALWAYS_INLINE__attribute__((always_inline)) inline void init_span(const void* interps, const void* step) { |
152 | (*(W ? init_span_w_func : init_span_func))(this, interps, step); |
153 | } |
154 | |
155 | template <bool W = false> |
156 | ALWAYS_INLINE__attribute__((always_inline)) inline void run() { |
157 | (*(W ? run_w_func : run_func))(this); |
158 | } |
159 | |
160 | template <bool W = false> |
161 | ALWAYS_INLINE__attribute__((always_inline)) inline void skip(int steps = 4) { |
162 | (*(W ? skip_w_func : skip_func))(this, steps); |
163 | } |
164 | |
165 | ALWAYS_INLINE__attribute__((always_inline)) inline int draw_span(uint32_t* buf, int len) { |
166 | swgl_OutRGBA8 = buf; |
167 | swgl_SpanLength = len; |
168 | return (*draw_span_RGBA8_func)(this); |
169 | } |
170 | |
171 | ALWAYS_INLINE__attribute__((always_inline)) inline bool has_draw_span(uint32_t*) { |
172 | return draw_span_RGBA8_func != nullptr; |
173 | } |
174 | |
175 | ALWAYS_INLINE__attribute__((always_inline)) inline int draw_span(uint8_t* buf, int len) { |
176 | swgl_OutR8 = buf; |
177 | swgl_SpanLength = len; |
178 | return (*draw_span_R8_func)(this); |
179 | } |
180 | |
181 | ALWAYS_INLINE__attribute__((always_inline)) inline bool has_draw_span(uint8_t*) { |
182 | return draw_span_R8_func != nullptr; |
183 | } |
184 | }; |
185 | |
186 | } // namespace glsl |