fix softpipe_clear() to handle ps->offset!=0 (such as when rendering to texture and...
[mesa.git] / src / mesa / pipe / softpipe / sp_context.h
index ef1a06ccaf6ab63adf5f152470251928a46f2c36..4f429e8139795071359e17aebbabf5c22db61a0b 100644 (file)
 #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 draw_stage;
 
 
-enum interp_mode {
-   INTERP_CONSTANT, 
-   INTERP_LINEAR, 
-   INTERP_PERSPECTIVE
-};
-
-
 #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;
 
-   GLuint occlusion_counter;
+   unsigned line_stipple_counter;
 
    /** Software quad rendering pipeline */
    struct {
@@ -136,8 +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;
 };