svga_context.h revision 848b8605
1/**********************************************************
2 * Copyright 2008-2009 VMware, Inc.  All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 *
24 **********************************************************/
25
26#ifndef SVGA_CONTEXT_H
27#define SVGA_CONTEXT_H
28
29
30#include "pipe/p_context.h"
31#include "pipe/p_defines.h"
32#include "pipe/p_state.h"
33
34#include "util/u_blitter.h"
35#include "util/u_double_list.h"
36
37#include "tgsi/tgsi_scan.h"
38
39#include "svga_screen.h"
40#include "svga_state.h"
41#include "svga_tgsi.h"
42#include "svga_winsys.h"
43#include "svga_hw_reg.h"
44#include "svga3d_shaderdefs.h"
45
46
47/** Non-GPU queries for gallium HUD */
48#define SVGA_QUERY_DRAW_CALLS   (PIPE_QUERY_DRIVER_SPECIFIC + 0)
49#define SVGA_QUERY_FALLBACKS    (PIPE_QUERY_DRIVER_SPECIFIC + 1)
50#define SVGA_QUERY_MEMORY_USED  (PIPE_QUERY_DRIVER_SPECIFIC + 2)
51
52
53struct draw_vertex_shader;
54struct draw_fragment_shader;
55struct svga_shader_variant;
56struct SVGACmdMemory;
57struct util_bitmask;
58
59
60struct svga_shader
61{
62   const struct tgsi_token *tokens;
63
64   struct tgsi_shader_info info;
65
66   /** Head of linked list of variants */
67   struct svga_shader_variant *variants;
68
69   unsigned id;  /**< for debugging only */
70};
71
72
73struct svga_fragment_shader
74{
75   struct svga_shader base;
76
77   struct draw_fragment_shader *draw_shader;
78
79   /** Mask of which generic varying variables are read by this shader */
80   unsigned generic_inputs;
81   /** Table mapping original TGSI generic indexes to low integers */
82   int8_t generic_remap_table[MAX_GENERIC_VARYING];
83};
84
85
86struct svga_vertex_shader
87{
88   struct svga_shader base;
89
90   struct draw_vertex_shader *draw_shader;
91};
92
93
94struct svga_cache_context;
95struct svga_tracked_state;
96
97struct svga_blend_state {
98
99   boolean need_white_fragments;
100
101   /* Should be per-render-target:
102    */
103   struct {
104      uint8_t writemask;
105
106      boolean blend_enable;
107      uint8_t srcblend;
108      uint8_t dstblend;
109      uint8_t blendeq;
110
111      boolean separate_alpha_blend_enable;
112      uint8_t srcblend_alpha;
113      uint8_t dstblend_alpha;
114      uint8_t blendeq_alpha;
115
116   } rt[1];
117};
118
119struct svga_depth_stencil_state {
120   unsigned zfunc:8;
121   unsigned zenable:1;
122   unsigned zwriteenable:1;
123
124   unsigned alphatestenable:1;
125   unsigned alphafunc:8;
126
127   struct {
128      unsigned enabled:1;
129      unsigned func:8;
130      unsigned fail:8;
131      unsigned zfail:8;
132      unsigned pass:8;
133   } stencil[2];
134
135   /* SVGA3D has one ref/mask/writemask triple shared between front &
136    * back face stencil.  We really need two:
137    */
138   unsigned stencil_mask:8;
139   unsigned stencil_writemask:8;
140
141   float    alpharef;
142};
143
144#define SVGA_UNFILLED_DISABLE 0
145#define SVGA_UNFILLED_LINE    1
146#define SVGA_UNFILLED_POINT   2
147
148#define SVGA_PIPELINE_FLAG_POINTS   (1<<PIPE_PRIM_POINTS)
149#define SVGA_PIPELINE_FLAG_LINES    (1<<PIPE_PRIM_LINES)
150#define SVGA_PIPELINE_FLAG_TRIS     (1<<PIPE_PRIM_TRIANGLES)
151
152struct svga_rasterizer_state {
153   struct pipe_rasterizer_state templ; /* needed for draw module */
154
155   unsigned shademode:8;
156   unsigned cullmode:8;
157   unsigned scissortestenable:1;
158   unsigned multisampleantialias:1;
159   unsigned antialiasedlineenable:1;
160   unsigned lastpixel:1;
161   unsigned pointsprite:1;
162
163   unsigned linepattern;
164
165   float slopescaledepthbias;
166   float depthbias;
167   float pointsize;
168   float linewidth;
169
170   unsigned hw_unfilled:16;         /* PIPE_POLYGON_MODE_x */
171
172   /** Which prims do we need help for?  Bitmask of (1 << PIPE_PRIM_x) flags */
173   unsigned need_pipeline:16;
174
175   /** For debugging: */
176   const char* need_pipeline_tris_str;
177   const char* need_pipeline_lines_str;
178   const char* need_pipeline_points_str;
179};
180
181struct svga_sampler_state {
182   unsigned mipfilter;
183   unsigned magfilter;
184   unsigned minfilter;
185   unsigned aniso_level;
186   float lod_bias;
187   unsigned addressu;
188   unsigned addressv;
189   unsigned addressw;
190   unsigned bordercolor;
191   unsigned normalized_coords:1;
192   unsigned compare_mode:1;
193   unsigned compare_func:3;
194
195   unsigned min_lod;
196   unsigned view_min_lod;
197   unsigned view_max_lod;
198};
199
200struct svga_velems_state {
201   unsigned count;
202   struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
203   SVGA3dDeclType decl_type[PIPE_MAX_ATTRIBS]; /**< vertex attrib formats */
204   unsigned adjust_attrib_range; /* bitmask of attrs needing range adjustment */
205   unsigned adjust_attrib_w_1;   /* bitmask of attrs needing w = 1 */
206   boolean need_swvfetch;
207};
208
209/* Use to calculate differences between state emitted to hardware and
210 * current driver-calculated state.
211 */
212struct svga_state
213{
214   const struct svga_blend_state *blend;
215   const struct svga_depth_stencil_state *depth;
216   const struct svga_rasterizer_state *rast;
217   const struct svga_sampler_state *sampler[PIPE_MAX_SAMPLERS];
218   const struct svga_velems_state *velems;
219
220   struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS]; /* or texture ID's? */
221   struct svga_fragment_shader *fs;
222   struct svga_vertex_shader *vs;
223
224   struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
225   struct pipe_index_buffer ib;
226   struct pipe_constant_buffer cbufs[PIPE_SHADER_TYPES];
227
228   struct pipe_framebuffer_state framebuffer;
229   float depthscale;
230
231   /* Hack to limit the number of different render targets between
232    * flushes.  Helps avoid blowing out our surface cache in EXA.
233    */
234   int nr_fbs;
235
236   struct pipe_poly_stipple poly_stipple;
237   struct pipe_scissor_state scissor;
238   struct pipe_blend_color blend_color;
239   struct pipe_stencil_ref stencil_ref;
240   struct pipe_clip_state clip;
241   struct pipe_viewport_state viewport;
242
243   unsigned num_samplers;
244   unsigned num_sampler_views;
245   unsigned num_vertex_buffers;
246   unsigned reduced_prim;
247
248   struct {
249      unsigned flag_1d;
250      unsigned flag_srgb;
251   } tex_flags;
252};
253
254struct svga_prescale {
255   float translate[4];
256   float scale[4];
257   boolean enabled;
258};
259
260
261/* Updated by calling svga_update_state( SVGA_STATE_HW_CLEAR )
262 */
263struct svga_hw_clear_state
264{
265   struct {
266      unsigned x,y,w,h;
267   } viewport;
268
269   struct {
270      float zmin, zmax;
271   } depthrange;
272
273   struct pipe_framebuffer_state framebuffer;
274   struct svga_prescale prescale;
275};
276
277struct svga_hw_view_state
278{
279   struct pipe_resource *texture;
280   struct svga_sampler_view *v;
281   unsigned min_lod;
282   unsigned max_lod;
283   int dirty;
284};
285
286/* Updated by calling svga_update_state( SVGA_STATE_HW_DRAW )
287 */
288struct svga_hw_draw_state
289{
290   unsigned rs[SVGA3D_RS_MAX];
291   unsigned ts[SVGA3D_PIXEL_SAMPLERREG_MAX][SVGA3D_TS_MAX];
292   float cb[PIPE_SHADER_TYPES][SVGA3D_CONSTREG_MAX][4];
293
294   /**
295    * For guest backed shader constants only.
296    */
297   struct svga_winsys_surface *hw_cb[PIPE_SHADER_TYPES];
298
299   struct svga_shader_variant *fs;
300   struct svga_shader_variant *vs;
301   struct svga_hw_view_state views[PIPE_MAX_SAMPLERS];
302
303   unsigned num_views;
304};
305
306
307/* Updated by calling svga_update_state( SVGA_STATE_NEED_SWTNL )
308 */
309struct svga_sw_state
310{
311   /* which parts we need */
312   boolean need_swvfetch;
313   boolean need_pipeline;
314   boolean need_swtnl;
315
316   /* Flag to make sure that need sw is on while
317    * updating state within a swtnl call.
318    */
319   boolean in_swtnl_draw;
320};
321
322
323/* Queue some state updates (like rss) and submit them to hardware in
324 * a single packet.
325 */
326struct svga_hw_queue;
327
328struct svga_query;
329
330struct svga_context
331{
332   struct pipe_context pipe;
333   struct svga_winsys_context *swc;
334   struct blitter_context *blitter;
335
336   struct {
337      boolean no_swtnl;
338      boolean force_swtnl;
339      boolean use_min_mipmap;
340
341      /* incremented for each shader */
342      unsigned shader_id;
343
344      unsigned disable_shader;
345
346      boolean no_line_width;
347      boolean force_hw_line_stipple;
348   } debug;
349
350   struct {
351      struct draw_context *draw;
352      struct vbuf_render *backend;
353      unsigned hw_prim;
354      boolean new_vbuf;
355      boolean new_vdecl;
356   } swtnl;
357
358   /* Bitmask of used shader IDs */
359   struct util_bitmask *shader_id_bm;
360
361   struct {
362      unsigned dirty[SVGA_STATE_MAX];
363
364      unsigned texture_timestamp;
365
366      /*
367       */
368      struct svga_sw_state          sw;
369      struct svga_hw_draw_state     hw_draw;
370      struct svga_hw_clear_state    hw_clear;
371   } state;
372
373   struct svga_state curr;      /* state from the state tracker */
374   unsigned dirty;              /* statechanges since last update_state() */
375
376   struct {
377      unsigned rendertargets:1;
378      unsigned texture_samplers:1;
379      unsigned vs:1;
380      unsigned fs:1;
381   } rebind;
382
383   struct svga_hwtnl *hwtnl;
384
385   /** The occlusion query currently in progress */
386   struct svga_query *sq;
387
388   /** List of buffers with queued transfers */
389   struct list_head dirty_buffers;
390
391   /** performance / info queries */
392   uint64_t num_draw_calls;  /**< SVGA_QUERY_DRAW_CALLS */
393   uint64_t num_fallbacks;   /**< SVGA_QUERY_FALLBACKS */
394};
395
396/* A flag for each state_tracker state object:
397 */
398#define SVGA_NEW_BLEND               0x1
399#define SVGA_NEW_DEPTH_STENCIL       0x2
400#define SVGA_NEW_RAST                0x4
401#define SVGA_NEW_SAMPLER             0x8
402#define SVGA_NEW_TEXTURE             0x10
403#define SVGA_NEW_VBUFFER             0x20
404#define SVGA_NEW_VELEMENT            0x40
405#define SVGA_NEW_FS                  0x80
406#define SVGA_NEW_VS                  0x100
407#define SVGA_NEW_FS_CONST_BUFFER     0x200
408#define SVGA_NEW_VS_CONST_BUFFER     0x400
409#define SVGA_NEW_FRAME_BUFFER        0x800
410#define SVGA_NEW_STIPPLE             0x1000
411#define SVGA_NEW_SCISSOR             0x2000
412#define SVGA_NEW_BLEND_COLOR         0x4000
413#define SVGA_NEW_CLIP                0x8000
414#define SVGA_NEW_VIEWPORT            0x10000
415#define SVGA_NEW_PRESCALE            0x20000
416#define SVGA_NEW_REDUCED_PRIMITIVE   0x40000
417#define SVGA_NEW_TEXTURE_BINDING     0x80000
418#define SVGA_NEW_NEED_PIPELINE       0x100000
419#define SVGA_NEW_NEED_SWVFETCH       0x200000
420#define SVGA_NEW_NEED_SWTNL          0x400000
421#define SVGA_NEW_FS_VARIANT          0x800000
422#define SVGA_NEW_VS_VARIANT          0x1000000
423#define SVGA_NEW_TEXTURE_FLAGS       0x4000000
424#define SVGA_NEW_STENCIL_REF         0x8000000
425
426
427
428
429
430/***********************************************************************
431 * svga_clear.c:
432 */
433void svga_clear(struct pipe_context *pipe,
434                unsigned buffers,
435                const union pipe_color_union *color,
436                double depth,
437                unsigned stencil);
438
439
440/***********************************************************************
441 * svga_screen_texture.c:
442 */
443void svga_mark_surfaces_dirty(struct svga_context *svga);
444
445
446
447
448void svga_init_state_functions( struct svga_context *svga );
449void svga_init_flush_functions( struct svga_context *svga );
450void svga_init_string_functions( struct svga_context *svga );
451void svga_init_blit_functions(struct svga_context *svga);
452
453void svga_init_blend_functions( struct svga_context *svga );
454void svga_init_depth_stencil_functions( struct svga_context *svga );
455void svga_init_misc_functions( struct svga_context *svga );
456void svga_init_rasterizer_functions( struct svga_context *svga );
457void svga_init_sampler_functions( struct svga_context *svga );
458void svga_init_fs_functions( struct svga_context *svga );
459void svga_init_vs_functions( struct svga_context *svga );
460void svga_init_vertex_functions( struct svga_context *svga );
461void svga_init_constbuffer_functions( struct svga_context *svga );
462void svga_init_draw_functions( struct svga_context *svga );
463void svga_init_query_functions( struct svga_context *svga );
464void svga_init_surface_functions(struct svga_context *svga);
465
466void svga_cleanup_vertex_state( struct svga_context *svga );
467void svga_cleanup_tss_binding( struct svga_context *svga );
468void svga_cleanup_framebuffer( struct svga_context *svga );
469
470void svga_context_flush( struct svga_context *svga,
471                         struct pipe_fence_handle **pfence );
472
473void svga_hwtnl_flush_retry( struct svga_context *svga );
474void svga_hwtnl_flush_buffer( struct svga_context *svga,
475                              struct pipe_resource *buffer );
476
477void svga_surfaces_flush(struct svga_context *svga);
478
479struct pipe_context *
480svga_context_create(struct pipe_screen *screen,
481		    void *priv);
482
483
484/***********************************************************************
485 * Inline conversion functions.  These are better-typed than the
486 * macros used previously:
487 */
488static INLINE struct svga_context *
489svga_context( struct pipe_context *pipe )
490{
491   return (struct svga_context *)pipe;
492}
493
494
495static INLINE boolean
496svga_have_gb_objects(const struct svga_context *svga)
497{
498   return svga_screen(svga->pipe.screen)->sws->have_gb_objects;
499}
500
501static INLINE boolean
502svga_have_gb_dma(const struct svga_context *svga)
503{
504   return svga_screen(svga->pipe.screen)->sws->have_gb_dma;
505}
506
507
508#endif
509