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