draw: Properly limit vertex buffer fetches on draw arrays.
[mesa.git] / src / gallium / drivers / r300 / r300_context.h
index 0802e79add73367dc11b329920443f2e8f788dc9..a1ae86816fbdbcb0ceb7316cc57d12e41f19548d 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef R300_CONTEXT_H
 #define R300_CONTEXT_H
 
+#define R300_BUFFER_ALIGNMENT 64
+
 #include "draw/draw_vertex.h"
 
 #include "util/u_blitter.h"
 #include "pipe/p_context.h"
 #include "util/u_inlines.h"
 #include "util/u_transfer.h"
-#include "util/u_vbuf.h"
 
 #include "r300_defines.h"
 #include "r300_screen.h"
+#include "compiler/radeon_regalloc.h"
 #include "../../winsys/radeon/drm/radeon_winsys.h"
 
 struct u_upload_mgr;
@@ -42,6 +44,16 @@ struct r300_fragment_shader;
 struct r300_vertex_shader;
 struct r300_stencilref_context;
 
+enum colormask_swizzle {
+    COLORMASK_BGRA,
+    COLORMASK_RGBA,
+    COLORMASK_RRRR,
+    COLORMASK_AAAA,
+    COLORMASK_GRRG,
+    COLORMASK_ARRA,
+    COLORMASK_NUM_SWIZZLES
+};
+
 struct r300_atom {
     /* Name, for debugging. */
     const char* name;
@@ -67,7 +79,7 @@ struct r300_aa_state {
 struct r300_blend_state {
     struct pipe_blend_state state;
 
-    uint32_t cb_clamp[8];
+    uint32_t cb_clamp[COLORMASK_NUM_SWIZZLES][8];
     uint32_t cb_noclamp[8];
     uint32_t cb_no_readwrite[8];
 };
@@ -321,6 +333,8 @@ struct r300_surface {
 
     /* Whether the CBZB clear is allowed on the surface. */
     boolean cbzb_allowed;
+
+    unsigned colormask_swizzle;
 };
 
 struct r300_texture_desc {
@@ -383,15 +397,16 @@ struct r300_texture_desc {
 
 struct r300_resource
 {
-    struct u_vbuf_resource b;
+    struct u_resource b;
 
     /* Winsys buffer backing this resource. */
     struct pb_buffer *buf;
     struct radeon_winsys_cs_handle *cs_buf;
     enum radeon_bo_domain domain;
 
-    /* Constant buffers are in user memory. */
-    uint8_t *constant_buffer;
+    /* Constant buffers and SWTCL vertex and index buffers are in user
+     * memory. */
+    uint8_t *malloced_buffer;
 
     /* Texture description (addressing, layout, special features). */
     struct r300_texture_desc tex;
@@ -406,8 +421,6 @@ struct r300_vertex_element_state {
     struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
     unsigned format_size[PIPE_MAX_ATTRIBS];
 
-    struct u_vbuf_elements *vmgr_elements;
-
     /* The size of the vertex, in dwords. */
     unsigned vertex_size_dwords;
 
@@ -470,7 +483,7 @@ struct r300_context {
 
     /* When no vertex buffer is set, this one is used instead to prevent
      * hardlocks. */
-    struct pipe_resource *dummy_vb;
+    struct pipe_vertex_buffer dummy_vb;
 
     /* The currently active query. */
     struct r300_query *query_current;
@@ -578,10 +591,10 @@ struct r300_context {
 
     void *dsa_decompress_zmask;
 
-    struct u_vbuf *vbuf_mgr;
-    struct pipe_index_buffer swtcl_index_buffer;
-    struct pipe_vertex_buffer swtcl_vertex_buffer[PIPE_MAX_ATTRIBS];
-    unsigned swtcl_nr_vertex_buffers;
+    struct pipe_index_buffer index_buffer;
+    struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
+    unsigned nr_vertex_buffers;
+    struct u_upload_mgr *uploader;
 
     struct util_slab_mempool pool_transfers;
 
@@ -612,6 +625,10 @@ struct r300_context {
     boolean hiz_in_use;         /* Whether HIZ is enabled. */
     enum r300_hiz_func hiz_func; /* HiZ function. Can be either MIN or MAX. */
     uint32_t hiz_clear_value;   /* HiZ clear value. */
+
+    /* Compiler state. */
+    struct rc_regalloc_state fs_regalloc_state; /* Register allocator info for
+                                                 * fragment shaders. */
 };
 
 #define foreach_atom(r300, atom) \
@@ -695,7 +712,8 @@ void r300_stop_query(struct r300_context *r300);
 
 /* r300_render_translate.c */
 void r300_translate_index_buffer(struct r300_context *r300,
-                                 struct pipe_resource **index_buffer,
+                                 struct pipe_index_buffer *ib,
+                                 struct pipe_resource **out_index_buffer,
                                  unsigned *index_size, unsigned index_offset,
                                  unsigned *start, unsigned count);
 
@@ -705,6 +723,11 @@ void r300_plug_in_stencil_ref_fallback(struct r300_context *r300);
 /* r300_render.c */
 void r300_draw_flush_vbuf(struct r300_context *r300);
 void r500_emit_index_bias(struct r300_context *r300, int index_bias);
+void r300_blitter_draw_rectangle(struct blitter_context *blitter,
+                                 int x1, int y1, int x2, int y2,
+                                 float depth,
+                                 enum blitter_attrib_type type,
+                                 const union pipe_color_union *attrib);
 
 /* r300_state.c */
 enum r300_fb_state_change {