• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2003 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   * Authors:
30   *   Keith Whitwell <keithw@vmware.com>
31   */
32 
33 
34 #ifndef ST_PROGRAM_H
35 #define ST_PROGRAM_H
36 
37 #include "main/atifragshader.h"
38 #include "program/program.h"
39 #include "pipe/p_state.h"
40 #include "tgsi/tgsi_from_mesa.h"
41 #include "st_context.h"
42 #include "st_texture.h"
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 struct st_external_sampler_key
49 {
50    GLuint lower_nv12;             /**< bitmask of 2 plane YUV samplers */
51    GLuint lower_nv21;
52    GLuint lower_iyuv;             /**< bitmask of 3 plane YUV samplers */
53    GLuint lower_xy_uxvx;          /**< bitmask of 2 plane YUV samplers */
54    GLuint lower_xy_vxux;          /**< bitmask of 2 plane YUV samplers */
55    GLuint lower_yx_xuxv;          /**< bitmask of 2 plane YUV samplers */
56    GLuint lower_yx_xvxu;          /**< bitmask of 2 plane YUV samplers */
57    GLuint lower_ayuv;
58    GLuint lower_xyuv;
59    GLuint lower_yuv;
60    GLuint lower_yu_yv;
61    GLuint lower_yv_yu;
62    GLuint lower_y41x;
63    GLuint bt709;
64    GLuint bt2020;
65    GLuint yuv_full_range;
66 };
67 
68 static inline struct st_external_sampler_key
st_get_external_sampler_key(struct st_context * st,struct gl_program * prog)69 st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
70 {
71    unsigned mask = prog->ExternalSamplersUsed;
72    struct st_external_sampler_key key;
73 
74    memset(&key, 0, sizeof(key));
75 
76    while (unlikely(mask)) {
77       unsigned unit = u_bit_scan(&mask);
78       struct gl_texture_object *stObj =
79             st_get_texture_object(st->ctx, prog, unit);
80       enum pipe_format format = st_get_view_format(stObj);
81 
82       /* if resource format matches then YUV wasn't lowered */
83       if (format == stObj->pt->format)
84          continue;
85 
86       switch (format) {
87       case PIPE_FORMAT_NV16:
88          if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM) {
89             key.lower_yuv |= (1 << unit);
90             break;
91          }
92          FALLTHROUGH;
93       case PIPE_FORMAT_NV12:
94          if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM) {
95             key.lower_yuv |= (1 << unit);
96             break;
97          }
98          FALLTHROUGH;
99       case PIPE_FORMAT_NV15:
100          if (stObj->pt->format == PIPE_FORMAT_R10_G10B10_420_UNORM) {
101             key.lower_yuv |= (1 << unit);
102             break;
103          }
104          FALLTHROUGH;
105       case PIPE_FORMAT_P010:
106       case PIPE_FORMAT_P012:
107       case PIPE_FORMAT_P016:
108       case PIPE_FORMAT_P030:
109          key.lower_nv12 |= (1 << unit);
110          break;
111       case PIPE_FORMAT_NV21:
112          if (stObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM) {
113             key.lower_yuv |= (1 << unit);
114             break;
115          }
116          key.lower_nv21 |= (1 << unit);
117          break;
118       case PIPE_FORMAT_NV20:
119          if (stObj->pt->format == PIPE_FORMAT_R10_G10B10_422_UNORM) {
120             key.lower_yuv |= (1 << unit);
121             break;
122          }
123          FALLTHROUGH;
124       case PIPE_FORMAT_IYUV:
125          if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
126              stObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {
127             key.lower_yuv |= (1 << unit);
128             break;
129          }
130          key.lower_iyuv |= (1 << unit);
131          break;
132       case PIPE_FORMAT_YUYV:
133          if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM) {
134             key.lower_yu_yv |= (1 << unit);
135             break;
136          }
137          FALLTHROUGH;
138       case PIPE_FORMAT_Y210:
139       case PIPE_FORMAT_Y212:
140       case PIPE_FORMAT_Y216:
141          key.lower_yx_xuxv |= (1 << unit);
142          break;
143       case PIPE_FORMAT_UYVY:
144          if (stObj->pt->format == PIPE_FORMAT_G8R8_B8R8_UNORM) {
145             key.lower_yu_yv |= (1 << unit);
146             break;
147          }
148          key.lower_xy_uxvx |= (1 << unit);
149          break;
150       case PIPE_FORMAT_VYUY:
151          if (stObj->pt->format == PIPE_FORMAT_B8R8_G8R8_UNORM) {
152             key.lower_yv_yu |= (1 << unit);
153             break;
154          }
155          key.lower_xy_vxux |= (1 << unit);
156          break;
157       case PIPE_FORMAT_YVYU:
158          if (stObj->pt->format == PIPE_FORMAT_R8B8_R8G8_UNORM) {
159             key.lower_yv_yu |= (1 << unit);
160             break;
161          }
162          key.lower_yx_xvxu |= (1 << unit);
163          break;
164       case PIPE_FORMAT_AYUV:
165          key.lower_ayuv |= (1 << unit);
166          break;
167       case PIPE_FORMAT_XYUV:
168          key.lower_xyuv |= (1 << unit);
169          break;
170       case PIPE_FORMAT_Y410:
171       case PIPE_FORMAT_Y412:
172       case PIPE_FORMAT_Y416:
173          key.lower_y41x |= (1 << unit);
174          break;
175       default:
176          printf("mesa: st_get_external_sampler_key: unhandled pipe format %u\n",
177                 format);
178          break;
179       }
180 
181       switch (stObj->yuv_color_space) {
182       case GL_TEXTURE_YUV_COLOR_SPACE_REC601:
183          break;
184       case GL_TEXTURE_YUV_COLOR_SPACE_REC709:
185          key.bt709 |= (1 << unit);
186          break;
187       case GL_TEXTURE_YUV_COLOR_SPACE_REC2020:
188          key.bt2020 |= (1 << unit);
189          break;
190       }
191 
192       if (stObj->yuv_full_range)
193          key.yuv_full_range |= (1 << unit);
194    }
195 
196    return key;
197 }
198 
199 /** Fragment program variant key
200  *
201  * Please update st_get_fp_variant() perf_debug() when adding fields.
202  */
203 struct st_fp_variant_key
204 {
205    struct st_context *st;         /**< variants are per-context */
206 
207    /** for glBitmap */
208    GLuint bitmap:1;               /**< glBitmap variant? */
209 
210    /** for glDrawPixels */
211    GLuint drawpixels:1;           /**< glDrawPixels variant */
212    GLuint scaleAndBias:1;         /**< glDrawPixels w/ scale and/or bias? */
213    GLuint pixelMaps:1;            /**< glDrawPixels w/ pixel lookup map? */
214 
215    /** for ARB_color_buffer_float */
216    GLuint clamp_color:1;
217 
218    /** for ARB_sample_shading */
219    GLuint persample_shading:1;
220 
221    /** needed for ATI_fragment_shader */
222    GLuint fog:2;
223 
224    /** for OpenGL 1.0 on modern hardware */
225    GLuint lower_two_sided_color:1;
226 
227    GLuint lower_flatshade:1;
228    unsigned lower_alpha_func:3;
229 
230    /** needed for ATI_fragment_shader */
231    uint8_t texture_index[MAX_NUM_FRAGMENT_REGISTERS_ATI];
232 
233    struct st_external_sampler_key external;
234 
235    /* bitmask of sampler units; pipe_caps.gl_clamp */
236    uint32_t gl_clamp[3];
237 
238    /* bitmask of shadow samplers with depth textures in them for ARB programs; */
239    GLbitfield depth_textures;
240 };
241 
242 /**
243  * Base class for shader variants.
244  */
245 struct st_variant
246 {
247    /** next in linked list */
248    struct st_variant *next;
249 
250    /** st_context from the shader key */
251    struct st_context *st;
252 
253    void *driver_shader;
254 };
255 
256 /**
257  * Variant of a fragment program.
258  */
259 struct st_fp_variant
260 {
261    struct st_variant base;
262 
263    /** Parameters which generated this version of fragment program */
264    struct st_fp_variant_key key;
265 
266    /** For glBitmap variants */
267    uint bitmap_sampler;
268 
269    /** For glDrawPixels variants */
270    unsigned drawpix_sampler;
271    unsigned pixelmap_sampler;
272 };
273 
274 
275 /** Shader key shared by other shaders.
276  *
277  * Please update st_get_common_variant() perf_debug() when adding fields.
278  */
279 struct st_common_variant_key
280 {
281    struct st_context *st;          /**< variants are per-context */
282    bool passthrough_edgeflags;
283 
284    /** for ARB_color_buffer_float */
285    bool clamp_color;
286 
287    /** lower glPointSize to gl_PointSize */
288    bool export_point_size;
289 
290    /* for user-defined clip-planes */
291    uint8_t lower_ucp;
292 
293    /* Whether st_variant::driver_shader is for the draw module,
294     * not for the driver.
295     */
296    bool is_draw_shader;
297 
298    /* bitmask of sampler units; pipe_caps.gl_clamp */
299    uint32_t gl_clamp[3];
300 };
301 
302 
303 /**
304  * Common shader variant.
305  */
306 struct st_common_variant
307 {
308    struct st_variant base;
309 
310    /* Parameters which generated this variant. */
311    struct st_common_variant_key key;
312 
313    /* Bitfield of VERT_BIT_* bits matching vertex shader inputs. */
314    GLbitfield vert_attrib_mask;
315 };
316 
317 static inline struct st_common_variant *
st_common_variant(struct st_variant * v)318 st_common_variant(struct st_variant *v)
319 {
320    return (struct st_common_variant*)v;
321 }
322 
323 static inline struct st_fp_variant *
st_fp_variant(struct st_variant * v)324 st_fp_variant(struct st_variant *v)
325 {
326    return (struct st_fp_variant*)v;
327 }
328 
329 /**
330  * This defines mapping from Mesa VARYING_SLOTs to TGSI GENERIC slots.
331  */
332 static inline unsigned
st_get_generic_varying_index(struct st_context * st,GLuint attr)333 st_get_generic_varying_index(struct st_context *st, GLuint attr)
334 {
335    return tgsi_get_generic_gl_varying_index((gl_varying_slot)attr,
336                                             st->needs_texcoord_semantic);
337 }
338 
339 extern void
340 st_set_prog_affected_state_flags(struct gl_program *prog);
341 
342 
343 extern struct st_fp_variant *
344 st_get_fp_variant(struct st_context *st,
345                   struct gl_program *stfp,
346                   const struct st_fp_variant_key *key);
347 
348 extern struct st_common_variant *
349 st_get_common_variant(struct st_context *st,
350                       struct gl_program *p,
351                       const struct st_common_variant_key *key);
352 
353 extern void
354 st_release_variants(struct st_context *st, struct gl_program *p);
355 
356 extern void
357 st_release_program(struct st_context *st, struct gl_program **p);
358 
359 extern void
360 st_destroy_program_variants(struct st_context *st);
361 
362 extern void
363 st_finalize_nir_before_variants(struct nir_shader *nir);
364 
365 extern void
366 st_prepare_vertex_program(struct gl_program *stvp);
367 
368 extern void
369 st_translate_stream_output_info(struct gl_program *prog);
370 
371 extern void
372 st_serialize_nir(struct gl_program *stp);
373 void
374 st_serialize_base_nir(struct gl_program *prog, struct nir_shader *nir);
375 
376 extern void
377 st_finalize_program(struct st_context *st, struct gl_program *prog);
378 
379 void *
380 st_create_nir_shader(struct st_context *st, struct pipe_shader_state *state);
381 
382 GLboolean st_program_string_notify(struct gl_context *ctx,
383                                    GLenum target,
384                                    struct gl_program *prog);
385 
386 #ifdef __cplusplus
387 }
388 #endif
389 
390 #endif
391