diff options
Diffstat (limited to 'src/gallium/drivers/svga/svga_context.h')
-rw-r--r-- | src/gallium/drivers/svga/svga_context.h | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h new file mode 100644 index 00000000000..9a3e92fd8d1 --- /dev/null +++ b/src/gallium/drivers/svga/svga_context.h @@ -0,0 +1,443 @@ +/********************************************************** + * Copyright 2008-2009 VMware, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +#ifndef SVGA_CONTEXT_H +#define SVGA_CONTEXT_H + + +#include "pipe/p_context.h" +#include "pipe/p_defines.h" +#include "pipe/p_state.h" + +#include "util/u_double_list.h" + +#include "tgsi/tgsi_scan.h" + + +#define SVGA_TEX_UNITS 8 + +struct draw_vertex_shader; +struct svga_shader_result; +struct SVGACmdMemory; +struct u_upload_mgr; + + +struct svga_shader +{ + const struct tgsi_token *tokens; + + struct tgsi_shader_info info; + + struct svga_shader_result *results; + + unsigned id; + + boolean use_sm30; +}; + +struct svga_fragment_shader +{ + struct svga_shader base; +}; + +struct svga_vertex_shader +{ + struct svga_shader base; + + struct draw_vertex_shader *draw_shader; +}; + + +struct svga_cache_context; +struct svga_tracked_state; + +struct svga_blend_state { + + boolean need_white_fragments; + + /* Should be per-render-target: + */ + struct { + uint8_t writemask; + + boolean blend_enable; + uint8_t srcblend; + uint8_t dstblend; + uint8_t blendeq; + + boolean separate_alpha_blend_enable; + uint8_t srcblend_alpha; + uint8_t dstblend_alpha; + uint8_t blendeq_alpha; + + } rt[1]; +}; + +struct svga_depth_stencil_state { + unsigned zfunc:8; + unsigned zenable:1; + unsigned zwriteenable:1; + + unsigned alphatestenable:1; + unsigned alphafunc:8; + + struct { + unsigned enabled:1; + unsigned func:8; + unsigned fail:8; + unsigned zfail:8; + unsigned pass:8; + } stencil[2]; + + /* SVGA3D has one ref/mask/writemask triple shared between front & + * back face stencil. We really need two: + */ + unsigned stencil_ref:8; + unsigned stencil_mask:8; + unsigned stencil_writemask:8; + + float alpharef; +}; + +#define SVGA_UNFILLED_DISABLE 0 +#define SVGA_UNFILLED_LINE 1 +#define SVGA_UNFILLED_POINT 2 + +#define SVGA_PIPELINE_FLAG_POINTS (1<<PIPE_PRIM_POINTS) +#define SVGA_PIPELINE_FLAG_LINES (1<<PIPE_PRIM_LINES) +#define SVGA_PIPELINE_FLAG_TRIS (1<<PIPE_PRIM_TRIANGLES) + +struct svga_rasterizer_state { + struct pipe_rasterizer_state templ; /* needed for draw module */ + + unsigned shademode:8; + unsigned cullmode:8; + unsigned scissortestenable:1; + unsigned multisampleantialias:1; + unsigned antialiasedlineenable:1; + unsigned lastpixel:1; + + unsigned linepattern; + + float slopescaledepthbias; + float depthbias; + float pointsize; + float pointsize_min; + float pointsize_max; + + unsigned hw_unfilled:16; /* PIPE_POLYGON_MODE_x */ + unsigned need_pipeline:16; /* which prims do we need help for? */ +}; + +struct svga_sampler_state { + unsigned mipfilter; + unsigned magfilter; + unsigned minfilter; + unsigned aniso_level; + float lod_bias; + unsigned addressu; + unsigned addressv; + unsigned addressw; + unsigned bordercolor; + unsigned normalized_coords:1; + unsigned compare_mode:1; + unsigned compare_func:3; + + unsigned min_lod; + unsigned view_min_lod; + unsigned view_max_lod; +}; + +/* Use to calculate differences between state emitted to hardware and + * current driver-calculated state. + */ +struct svga_state +{ + const struct svga_blend_state *blend; + const struct svga_depth_stencil_state *depth; + const struct svga_rasterizer_state *rast; + const struct svga_sampler_state *sampler[PIPE_MAX_SAMPLERS]; + + struct pipe_texture *texture[PIPE_MAX_SAMPLERS]; /* or texture ID's? */ + struct svga_fragment_shader *fs; + struct svga_vertex_shader *vs; + + struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS]; + struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS]; + struct pipe_buffer *cb[PIPE_SHADER_TYPES]; + + struct pipe_framebuffer_state framebuffer; + float depthscale; + + struct pipe_poly_stipple poly_stipple; + struct pipe_scissor_state scissor; + struct pipe_blend_color blend_color; + struct pipe_clip_state clip; + struct pipe_viewport_state viewport; + + const unsigned *edgeflags; + + unsigned num_samplers; + unsigned num_textures; + unsigned num_vertex_elements; + unsigned num_vertex_buffers; + unsigned reduced_prim; + + struct { + unsigned flag_1d; + unsigned flag_srgb; + } tex_flags; + + boolean any_user_vertex_buffers; + + unsigned zero_stride_vertex_elements; + unsigned num_zero_stride_vertex_elements; + /* ### maybe dynamically allocate this */ + float zero_stride_constants[PIPE_MAX_ATTRIBS*4]; +}; + +#define RS_MAX 97 +#define TS_MAX 30 +#define CB_MAX 256 + +struct svga_prescale { + float translate[4]; + float scale[4]; + boolean enabled; +}; + + +/* Updated by calling svga_update_state( SVGA_STATE_HW_VIEWPORT ) + */ +struct svga_hw_clear_state +{ + struct { + unsigned x,y,w,h; + } viewport; + + struct { + float zmin, zmax; + } depthrange; + + struct pipe_framebuffer_state framebuffer; + struct svga_prescale prescale; +}; + +struct svga_hw_view_state +{ + struct pipe_texture *texture; + struct svga_sampler_view *v; + unsigned min_lod; + unsigned max_lod; + int dirty; +}; + +/* Updated by calling svga_update_state( SVGA_STATE_HW_DRAW ) + */ +struct svga_hw_draw_state +{ + unsigned rs[RS_MAX]; + unsigned ts[16][TS_MAX]; + float cb[PIPE_SHADER_TYPES][CB_MAX][4]; + + unsigned shader_id[PIPE_SHADER_TYPES]; + + struct svga_shader_result *fs; + struct svga_shader_result *vs; + struct svga_hw_view_state views[PIPE_MAX_SAMPLERS]; + + unsigned num_views; +}; + + +/* Updated by calling svga_update_state( SVGA_STATE_NEED_SWTNL ) + */ +struct svga_sw_state +{ + unsigned ve_format[PIPE_MAX_ATTRIBS]; /* NEW_VELEMENT */ + + /* which parts we need */ + boolean need_swvfetch; + boolean need_pipeline; + boolean need_swtnl; +}; + + +/* Queue some state updates (like rss) and submit them to hardware in + * a single packet. + */ +struct svga_hw_queue; + +struct svga_query; + +struct svga_context +{ + struct pipe_context pipe; + struct svga_winsys_context *swc; + + struct { + boolean no_swtnl; + boolean force_swtnl; + boolean use_min_mipmap; + + /* incremented for each shader */ + unsigned shader_id; + + unsigned disable_shader; + } debug; + + struct { + struct draw_context *draw; + struct vbuf_render *backend; + unsigned hw_prim; + boolean new_vbuf; + boolean new_vdecl; + } swtnl; + + struct { + unsigned dirty[4]; + + unsigned texture_timestamp; + unsigned next_fs_id; + unsigned next_vs_id; + + /* Internally generated shaders: + */ + unsigned white_fs_id; + + /* + */ + struct svga_sw_state sw; + struct svga_hw_draw_state hw_draw; + struct svga_hw_clear_state hw_clear; + } state; + + struct svga_state curr; /* state from the state tracker */ + unsigned dirty; /* statechanges since last update_state() */ + + struct u_upload_mgr *upload_ib; + struct u_upload_mgr *upload_vb; + struct svga_hwtnl *hwtnl; + + /** The occlusion query currently in progress */ + struct svga_query *sq; + + /** List of buffers with queued transfers */ + struct list_head dirty_buffers; +}; + +/* A flag for each state_tracker state object: + */ +#define SVGA_NEW_BLEND 0x1 +#define SVGA_NEW_DEPTH_STENCIL 0x2 +#define SVGA_NEW_RAST 0x4 +#define SVGA_NEW_SAMPLER 0x8 +#define SVGA_NEW_TEXTURE 0x10 +#define SVGA_NEW_VBUFFER 0x20 +#define SVGA_NEW_VELEMENT 0x40 +#define SVGA_NEW_FS 0x80 +#define SVGA_NEW_VS 0x100 +#define SVGA_NEW_FS_CONST_BUFFER 0x200 +#define SVGA_NEW_VS_CONST_BUFFER 0x400 +#define SVGA_NEW_FRAME_BUFFER 0x800 +#define SVGA_NEW_STIPPLE 0x1000 +#define SVGA_NEW_SCISSOR 0x2000 +#define SVGA_NEW_BLEND_COLOR 0x5000 +#define SVGA_NEW_CLIP 0x8000 +#define SVGA_NEW_VIEWPORT 0x10000 +#define SVGA_NEW_PRESCALE 0x20000 +#define SVGA_NEW_REDUCED_PRIMITIVE 0x40000 +#define SVGA_NEW_TEXTURE_BINDING 0x80000 +#define SVGA_NEW_NEED_PIPELINE 0x100000 +#define SVGA_NEW_NEED_SWVFETCH 0x200000 +#define SVGA_NEW_NEED_SWTNL 0x400000 +#define SVGA_NEW_FS_RESULT 0x800000 +#define SVGA_NEW_VS_RESULT 0x1000000 +#define SVGA_NEW_EDGEFLAGS 0x2000000 +#define SVGA_NEW_ZERO_STRIDE 0x4000000 +#define SVGA_NEW_TEXTURE_FLAGS 0x8000000 + + + + + +/*********************************************************************** + * svga_clear.c: + */ +void svga_clear(struct pipe_context *pipe, + unsigned buffers, + const float *rgba, + double depth, + unsigned stencil); + + +/*********************************************************************** + * svga_screen_texture.c: + */ +void svga_mark_surfaces_dirty(struct svga_context *svga); + + + + +void svga_init_state_functions( struct svga_context *svga ); +void svga_init_flush_functions( struct svga_context *svga ); +void svga_init_string_functions( struct svga_context *svga ); +void svga_init_blit_functions(struct svga_context *svga); + +void svga_init_blend_functions( struct svga_context *svga ); +void svga_init_depth_stencil_functions( struct svga_context *svga ); +void svga_init_misc_functions( struct svga_context *svga ); +void svga_init_rasterizer_functions( struct svga_context *svga ); +void svga_init_sampler_functions( struct svga_context *svga ); +void svga_init_fs_functions( struct svga_context *svga ); +void svga_init_vs_functions( struct svga_context *svga ); +void svga_init_vertex_functions( struct svga_context *svga ); +void svga_init_constbuffer_functions( struct svga_context *svga ); +void svga_init_draw_functions( struct svga_context *svga ); +void svga_init_query_functions( struct svga_context *svga ); + +void svga_cleanup_vertex_state( struct svga_context *svga ); +void svga_cleanup_tss_binding( struct svga_context *svga ); +void svga_cleanup_framebuffer( struct svga_context *svga ); + +void svga_context_flush( struct svga_context *svga, + struct pipe_fence_handle **pfence ); + +void svga_hwtnl_flush_retry( struct svga_context *svga ); + + +/*********************************************************************** + * Inline conversion functions. These are better-typed than the + * macros used previously: + */ +static INLINE struct svga_context * +svga_context( struct pipe_context *pipe ) +{ + return (struct svga_context *)pipe; +} + + + +#endif |