svga_context.h revision 4a49301e
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_double_list.h"
35
36#include "tgsi/tgsi_scan.h"
37
38
39#define SVGA_TEX_UNITS 8
40
41struct draw_vertex_shader;
42struct svga_shader_result;
43struct SVGACmdMemory;
44struct util_bitmask;
45struct u_upload_mgr;
46
47
48struct svga_shader
49{
50   const struct tgsi_token *tokens;
51
52   struct tgsi_shader_info info;
53
54   struct svga_shader_result *results;
55
56   unsigned id;
57
58   boolean use_sm30;
59};
60
61struct svga_fragment_shader
62{
63   struct svga_shader base;
64};
65
66struct svga_vertex_shader
67{
68   struct svga_shader base;
69
70   struct draw_vertex_shader *draw_shader;
71};
72
73
74struct svga_cache_context;
75struct svga_tracked_state;
76
77struct svga_blend_state {
78
79   boolean need_white_fragments;
80
81   /* Should be per-render-target:
82    */
83   struct {
84      uint8_t writemask;
85
86      boolean blend_enable;
87      uint8_t srcblend;
88      uint8_t dstblend;
89      uint8_t blendeq;
90
91      boolean separate_alpha_blend_enable;
92      uint8_t srcblend_alpha;
93      uint8_t dstblend_alpha;
94      uint8_t blendeq_alpha;
95
96   } rt[1];
97};
98
99struct svga_depth_stencil_state {
100   unsigned zfunc:8;
101   unsigned zenable:1;
102   unsigned zwriteenable:1;
103
104   unsigned alphatestenable:1;
105   unsigned alphafunc:8;
106
107   struct {
108      unsigned enabled:1;
109      unsigned func:8;
110      unsigned fail:8;
111      unsigned zfail:8;
112      unsigned pass:8;
113   } stencil[2];
114
115   /* SVGA3D has one ref/mask/writemask triple shared between front &
116    * back face stencil.  We really need two:
117    */
118   unsigned stencil_ref:8;
119   unsigned stencil_mask:8;
120   unsigned stencil_writemask:8;
121
122   float    alpharef;
123};
124
125#define SVGA_UNFILLED_DISABLE 0
126#define SVGA_UNFILLED_LINE    1
127#define SVGA_UNFILLED_POINT   2
128
129#define SVGA_PIPELINE_FLAG_POINTS   (1<<PIPE_PRIM_POINTS)
130#define SVGA_PIPELINE_FLAG_LINES    (1<<PIPE_PRIM_LINES)
131#define SVGA_PIPELINE_FLAG_TRIS     (1<<PIPE_PRIM_TRIANGLES)
132
133struct svga_rasterizer_state {
134   struct pipe_rasterizer_state templ; /* needed for draw module */
135
136   unsigned shademode:8;
137   unsigned cullmode:8;
138   unsigned scissortestenable:1;
139   unsigned multisampleantialias:1;
140   unsigned antialiasedlineenable:1;
141   unsigned lastpixel:1;
142   unsigned pointspriteenable:1;
143
144   unsigned linepattern;
145
146   float slopescaledepthbias;
147   float depthbias;
148   float pointsize;
149   float pointsize_min;
150   float pointsize_max;
151
152   unsigned hw_unfilled:16;         /* PIPE_POLYGON_MODE_x */
153   unsigned need_pipeline:16;    /* which prims do we need help for? */
154};
155
156struct svga_sampler_state {
157   unsigned mipfilter;
158   unsigned magfilter;
159   unsigned minfilter;
160   unsigned aniso_level;
161   float lod_bias;
162   unsigned addressu;
163   unsigned addressv;
164   unsigned addressw;
165   unsigned bordercolor;
166   unsigned normalized_coords:1;
167   unsigned compare_mode:1;
168   unsigned compare_func:3;
169
170   unsigned min_lod;
171   unsigned view_min_lod;
172   unsigned view_max_lod;
173};
174
175/* Use to calculate differences between state emitted to hardware and
176 * current driver-calculated state.
177 */
178struct svga_state
179{
180   const struct svga_blend_state *blend;
181   const struct svga_depth_stencil_state *depth;
182   const struct svga_rasterizer_state *rast;
183   const struct svga_sampler_state *sampler[PIPE_MAX_SAMPLERS];
184
185   struct pipe_texture *texture[PIPE_MAX_SAMPLERS]; /* or texture ID's? */
186   struct svga_fragment_shader *fs;
187   struct svga_vertex_shader *vs;
188
189   struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
190   struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS];
191   struct pipe_buffer *cb[PIPE_SHADER_TYPES];
192
193   struct pipe_framebuffer_state framebuffer;
194   float depthscale;
195
196   /* Hack to limit the number of different render targets between
197    * flushes.  Helps avoid blowing out our surface cache in EXA.
198    */
199   int nr_fbs;
200
201   struct pipe_poly_stipple poly_stipple;
202   struct pipe_scissor_state scissor;
203   struct pipe_blend_color blend_color;
204   struct pipe_clip_state clip;
205   struct pipe_viewport_state viewport;
206
207   const unsigned *edgeflags;
208
209   unsigned num_samplers;
210   unsigned num_textures;
211   unsigned num_vertex_elements;
212   unsigned num_vertex_buffers;
213   unsigned reduced_prim;
214
215   struct {
216      unsigned flag_1d;
217      unsigned flag_srgb;
218   } tex_flags;
219
220   boolean any_user_vertex_buffers;
221
222   unsigned zero_stride_vertex_elements;
223   unsigned num_zero_stride_vertex_elements;
224   /* ### maybe dynamically allocate this */
225   float zero_stride_constants[PIPE_MAX_ATTRIBS*4];
226};
227
228#define RS_MAX 97
229#define TS_MAX 30
230#define CB_MAX 256
231
232struct svga_prescale {
233   float translate[4];
234   float scale[4];
235   boolean enabled;
236};
237
238
239/* Updated by calling svga_update_state( SVGA_STATE_HW_VIEWPORT )
240 */
241struct svga_hw_clear_state
242{
243   struct {
244      unsigned x,y,w,h;
245   } viewport;
246
247   struct {
248      float zmin, zmax;
249   } depthrange;
250
251   struct pipe_framebuffer_state framebuffer;
252   struct svga_prescale prescale;
253};
254
255struct svga_hw_view_state
256{
257   struct pipe_texture *texture;
258   struct svga_sampler_view *v;
259   unsigned min_lod;
260   unsigned max_lod;
261   int dirty;
262};
263
264/* Updated by calling svga_update_state( SVGA_STATE_HW_DRAW )
265 */
266struct svga_hw_draw_state
267{
268   unsigned rs[RS_MAX];
269   unsigned ts[16][TS_MAX];
270   float cb[PIPE_SHADER_TYPES][CB_MAX][4];
271
272   struct svga_shader_result *fs;
273   struct svga_shader_result *vs;
274   struct svga_hw_view_state views[PIPE_MAX_SAMPLERS];
275
276   unsigned num_views;
277};
278
279
280/* Updated by calling svga_update_state( SVGA_STATE_NEED_SWTNL )
281 */
282struct svga_sw_state
283{
284   unsigned ve_format[PIPE_MAX_ATTRIBS]; /* NEW_VELEMENT */
285
286   /* which parts we need */
287   boolean need_swvfetch;
288   boolean need_pipeline;
289   boolean need_swtnl;
290};
291
292
293/* Queue some state updates (like rss) and submit them to hardware in
294 * a single packet.
295 */
296struct svga_hw_queue;
297
298struct svga_query;
299
300struct svga_context
301{
302   struct pipe_context pipe;
303   struct svga_winsys_context *swc;
304
305   struct {
306      boolean no_swtnl;
307      boolean force_swtnl;
308      boolean use_min_mipmap;
309
310      /* incremented for each shader */
311      unsigned shader_id;
312
313      unsigned disable_shader;
314   } debug;
315
316   struct {
317      struct draw_context *draw;
318      struct vbuf_render *backend;
319      unsigned hw_prim;
320      boolean new_vbuf;
321      boolean new_vdecl;
322   } swtnl;
323
324   /* Bitmask of used shader IDs */
325   struct util_bitmask *fs_bm;
326   struct util_bitmask *vs_bm;
327
328   struct {
329      unsigned dirty[4];
330
331      unsigned texture_timestamp;
332
333      /*
334       */
335      struct svga_sw_state          sw;
336      struct svga_hw_draw_state     hw_draw;
337      struct svga_hw_clear_state    hw_clear;
338   } state;
339
340   struct svga_state curr;      /* state from the state tracker */
341   unsigned dirty;              /* statechanges since last update_state() */
342
343   struct u_upload_mgr *upload_ib;
344   struct u_upload_mgr *upload_vb;
345   struct svga_hwtnl *hwtnl;
346
347   /** The occlusion query currently in progress */
348   struct svga_query *sq;
349
350   /** List of buffers with queued transfers */
351   struct list_head dirty_buffers;
352};
353
354/* A flag for each state_tracker state object:
355 */
356#define SVGA_NEW_BLEND               0x1
357#define SVGA_NEW_DEPTH_STENCIL       0x2
358#define SVGA_NEW_RAST                0x4
359#define SVGA_NEW_SAMPLER             0x8
360#define SVGA_NEW_TEXTURE             0x10
361#define SVGA_NEW_VBUFFER             0x20
362#define SVGA_NEW_VELEMENT            0x40
363#define SVGA_NEW_FS                  0x80
364#define SVGA_NEW_VS                  0x100
365#define SVGA_NEW_FS_CONST_BUFFER     0x200
366#define SVGA_NEW_VS_CONST_BUFFER     0x400
367#define SVGA_NEW_FRAME_BUFFER        0x800
368#define SVGA_NEW_STIPPLE             0x1000
369#define SVGA_NEW_SCISSOR             0x2000
370#define SVGA_NEW_BLEND_COLOR         0x5000
371#define SVGA_NEW_CLIP                0x8000
372#define SVGA_NEW_VIEWPORT            0x10000
373#define SVGA_NEW_PRESCALE            0x20000
374#define SVGA_NEW_REDUCED_PRIMITIVE   0x40000
375#define SVGA_NEW_TEXTURE_BINDING     0x80000
376#define SVGA_NEW_NEED_PIPELINE       0x100000
377#define SVGA_NEW_NEED_SWVFETCH       0x200000
378#define SVGA_NEW_NEED_SWTNL          0x400000
379#define SVGA_NEW_FS_RESULT           0x800000
380#define SVGA_NEW_VS_RESULT           0x1000000
381#define SVGA_NEW_EDGEFLAGS           0x2000000
382#define SVGA_NEW_ZERO_STRIDE         0x4000000
383#define SVGA_NEW_TEXTURE_FLAGS       0x8000000
384
385
386
387
388
389/***********************************************************************
390 * svga_clear.c:
391 */
392void svga_clear(struct pipe_context *pipe,
393                unsigned buffers,
394                const float *rgba,
395                double depth,
396                unsigned stencil);
397
398
399/***********************************************************************
400 * svga_screen_texture.c:
401 */
402void svga_mark_surfaces_dirty(struct svga_context *svga);
403
404
405
406
407void svga_init_state_functions( struct svga_context *svga );
408void svga_init_flush_functions( struct svga_context *svga );
409void svga_init_string_functions( struct svga_context *svga );
410void svga_init_blit_functions(struct svga_context *svga);
411
412void svga_init_blend_functions( struct svga_context *svga );
413void svga_init_depth_stencil_functions( struct svga_context *svga );
414void svga_init_misc_functions( struct svga_context *svga );
415void svga_init_rasterizer_functions( struct svga_context *svga );
416void svga_init_sampler_functions( struct svga_context *svga );
417void svga_init_fs_functions( struct svga_context *svga );
418void svga_init_vs_functions( struct svga_context *svga );
419void svga_init_vertex_functions( struct svga_context *svga );
420void svga_init_constbuffer_functions( struct svga_context *svga );
421void svga_init_draw_functions( struct svga_context *svga );
422void svga_init_query_functions( struct svga_context *svga );
423
424void svga_cleanup_vertex_state( struct svga_context *svga );
425void svga_cleanup_tss_binding( struct svga_context *svga );
426void svga_cleanup_framebuffer( struct svga_context *svga );
427
428void svga_context_flush( struct svga_context *svga,
429                         struct pipe_fence_handle **pfence );
430
431void svga_hwtnl_flush_retry( struct svga_context *svga );
432
433
434/***********************************************************************
435 * Inline conversion functions.  These are better-typed than the
436 * macros used previously:
437 */
438static INLINE struct svga_context *
439svga_context( struct pipe_context *pipe )
440{
441   return (struct svga_context *)pipe;
442}
443
444
445
446#endif
447