X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fpipe%2Fsoftpipe%2Fsp_context.h;h=4f429e8139795071359e17aebbabf5c22db61a0b;hb=9f8cfa75ca0882a8015a714887b41f8a7a10fd19;hp=21d6108ac6e2a7da737a34522c19b16507a109a2;hpb=e89bd0fbc56ecfb96f3aff926c5891c45221dd37;p=mesa.git diff --git a/src/mesa/pipe/softpipe/sp_context.h b/src/mesa/pipe/softpipe/sp_context.h index 21d6108ac6e..4f429e81397 100644 --- a/src/mesa/pipe/softpipe/sp_context.h +++ b/src/mesa/pipe/softpipe/sp_context.h @@ -31,89 +31,105 @@ #ifndef SP_CONTEXT_H #define SP_CONTEXT_H -#include "glheader.h" - #include "pipe/p_state.h" #include "pipe/p_context.h" +#include "pipe/p_defines.h" + +#include "pipe/draw/draw_vertex.h" #include "sp_quad.h" struct softpipe_surface; +struct softpipe_winsys; struct draw_context; -struct prim_stage; - - -enum interp_mode { - INTERP_CONSTANT, - INTERP_LINEAR, - INTERP_PERSPECTIVE -}; +struct draw_stage; #define SP_NEW_VIEWPORT 0x1 -#define SP_NEW_SETUP 0x2 +#define SP_NEW_RASTERIZER 0x2 #define SP_NEW_FS 0x4 #define SP_NEW_BLEND 0x8 -#define SP_NEW_CLIP 0x10 -#define SP_NEW_SCISSOR 0x20 -#define SP_NEW_STIPPLE 0x40 -#define SP_NEW_FRAMEBUFFER 0x80 -#define SP_NEW_ALPHA_TEST 0x100 -#define SP_NEW_DEPTH_TEST 0x200 -#define SP_NEW_SAMPLER 0x400 -#define SP_NEW_TEXTURE 0x800 -#define SP_NEW_STENCIL 0x1000 - - -struct softpipe_context { +#define SP_NEW_CLIP 0x10 +#define SP_NEW_SCISSOR 0x20 +#define SP_NEW_STIPPLE 0x40 +#define SP_NEW_FRAMEBUFFER 0x80 +#define SP_NEW_ALPHA_TEST 0x100 +#define SP_NEW_DEPTH_STENCIL 0x200 +#define SP_NEW_SAMPLER 0x400 +#define SP_NEW_TEXTURE 0x800 +#define SP_NEW_VERTEX 0x1000 +#define SP_NEW_VS 0x2000 +#define SP_NEW_CONSTANTS 0x4000 + +struct sp_vertex_shader_state { + const struct pipe_shader_state *state; + void *draw_data; +}; + +struct softpipe_context { struct pipe_context pipe; /**< base class */ + struct softpipe_winsys *winsys; /**< window system interface */ + /* The most recent drawing state as set by the driver: */ - struct pipe_alpha_test_state alpha_test; - struct pipe_blend_state blend; + const struct pipe_alpha_test_state *alpha_test; + const struct pipe_blend_state *blend; + const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS]; + const struct pipe_depth_stencil_state *depth_stencil; + const struct pipe_rasterizer_state *rasterizer; + const struct pipe_shader_state *fs; + const struct sp_vertex_shader_state *vs; + struct pipe_blend_color blend_color; struct pipe_clear_color_state clear_color; struct pipe_clip_state clip; - struct pipe_depth_state depth_test; + struct pipe_constant_buffer constants[2]; + struct pipe_feedback_state feedback; struct pipe_framebuffer_state framebuffer; - struct pipe_fs_state fs; struct pipe_poly_stipple poly_stipple; struct pipe_scissor_state scissor; - struct pipe_sampler_state sampler[PIPE_MAX_SAMPLERS]; - struct pipe_setup_state setup; - struct pipe_stencil_state stencil; - struct pipe_texture_object *texture[PIPE_MAX_SAMPLERS]; + struct pipe_mipmap_tree *texture[PIPE_MAX_SAMPLERS]; struct pipe_viewport_state viewport; - GLuint dirty; + struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX]; + struct pipe_vertex_element vertex_element[PIPE_ATTRIB_MAX]; + unsigned dirty; - /* Setup derived state. TODO: this should be passed in the program - * tokens as parameters to DECL instructions. - * - * For now we just set colors to CONST on flatshade, textures to - * perspective always and everything else to linear. + /* + * Active queries */ - enum interp_mode interp[PIPE_ATTRIB_MAX]; + struct pipe_query_object *queries[PIPE_QUERY_TYPES]; - - /* FS + setup derived state: + /* + * Mapped vertex buffers */ - - /** Map fragment program attribute to quad/coef array slot */ - GLuint fp_attr_to_slot[PIPE_ATTRIB_MAX]; - /** Map vertex format attribute to a vertex attribute slot */ - GLuint vf_attr_to_slot[PIPE_ATTRIB_MAX]; - GLuint nr_attrs; - GLuint nr_frag_attrs; /**< number of active fragment attribs */ - GLbitfield attr_mask; /**< bitfield of VF_ATTRIB_ indexes/bits */ - - GLboolean need_z; /**< produce quad/fragment Z values? */ - GLboolean need_w; /**< produce quad/fragment W values? */ - + ubyte *mapped_vbuffer[PIPE_ATTRIB_MAX]; + + /** Mapped constant buffers */ + void *mapped_constants[PIPE_SHADER_TYPES]; + + /** Vertex format */ + struct vertex_info vertex_info; + unsigned attr_mask; + unsigned nr_frag_attrs; /**< number of active fragment attribs */ + boolean need_z; /**< produce quad/fragment Z values? */ + boolean need_w; /**< produce quad/fragment W values? */ + int psize_slot; + + /** Feedback buffers */ + struct pipe_feedback_buffer feedback_buffer[PIPE_MAX_FEEDBACK_ATTRIBS]; + +#if 0 /* Stipple derived state: */ - GLubyte stipple_masks[16][16]; + ubyte stipple_masks[16][16]; +#endif + + /** Derived from scissor and surface bounds: */ + struct pipe_scissor_state cliprect; + + unsigned line_stipple_counter; /** Software quad rendering pipeline */ struct { @@ -122,7 +138,11 @@ struct softpipe_context { struct quad_stage *alpha_test; struct quad_stage *stencil_test; struct quad_stage *depth_test; + struct quad_stage *occlusion; + struct quad_stage *coverage; + struct quad_stage *bufloop; struct quad_stage *blend; + struct quad_stage *colormask; struct quad_stage *output; struct quad_stage *first; /**< points to one of the above stages */ @@ -130,6 +150,12 @@ struct softpipe_context { /** The primitive drawing context */ struct draw_context *draw; + struct draw_stage *setup; + struct draw_stage *vbuf; + + struct pipe_surface *cbuf; /**< current color buffer (one of cbufs) */ + + int use_sse : 1; };