r300g: inline FLUSH_CS
[mesa.git] / src / gallium / drivers / r300 / r300_context.c
index 4f721ebb5998cebeff7f92c3a3bbaca87ca83550..43e567c432883d9e6909554529bd3095d2430664 100644 (file)
 #include "util/u_simple_list.h"
 #include "util/u_upload_mgr.h"
 
-#include "r300_blit.h"
 #include "r300_context.h"
 #include "r300_emit.h"
-#include "r300_flush.h"
-#include "r300_query.h"
-#include "r300_render.h"
 #include "r300_screen.h"
 #include "r300_screen_buffer.h"
 #include "r300_state_invariant.h"
@@ -70,17 +66,21 @@ static void r300_destroy_context(struct pipe_context* context)
     u_upload_destroy(r300->upload_vb);
     u_upload_destroy(r300->upload_ib);
 
+    translate_cache_destroy(r300->tran.translate_cache);
+
     FREE(r300->blend_color_state.state);
     FREE(r300->clip_state.state);
     FREE(r300->fb_state.state);
     FREE(r300->rs_block_state.state);
     FREE(r300->scissor_state.state);
     FREE(r300->textures_state.state);
-    FREE(r300->vap_output_state.state);
     FREE(r300->viewport_state.state);
     FREE(r300->ztop_state.state);
     FREE(r300->fs_constants.state);
     FREE(r300->vs_constants.state);
+    if (!r300->screen->caps.has_tcl) {
+        FREE(r300->vertex_stream_state.state);
+    }
     FREE(r300);
 }
 
@@ -125,7 +125,6 @@ static void r300_setup_atoms(struct r300_context* r300)
     R300_INIT_ATOM(viewport_state, 9);
     R300_INIT_ATOM(rs_block_state, 0);
     R300_INIT_ATOM(vertex_stream_state, 0);
-    R300_INIT_ATOM(vap_output_state, 6);
     R300_INIT_ATOM(pvs_flush, 2);
     R300_INIT_ATOM(vs_state, 0);
     R300_INIT_ATOM(vs_constants, 0);
@@ -149,11 +148,20 @@ static void r300_setup_atoms(struct r300_context* r300)
     r300->rs_block_state.state = CALLOC_STRUCT(r300_rs_block);
     r300->scissor_state.state = CALLOC_STRUCT(pipe_scissor_state);
     r300->textures_state.state = CALLOC_STRUCT(r300_textures_state);
-    r300->vap_output_state.state = CALLOC_STRUCT(r300_vap_output_state);
     r300->viewport_state.state = CALLOC_STRUCT(r300_viewport_state);
     r300->ztop_state.state = CALLOC_STRUCT(r300_ztop_state);
     r300->fs_constants.state = CALLOC_STRUCT(r300_constant_buffer);
     r300->vs_constants.state = CALLOC_STRUCT(r300_constant_buffer);
+    if (!r300->screen->caps.has_tcl) {
+        r300->vertex_stream_state.state = CALLOC_STRUCT(r300_vertex_stream_state);
+    }
+
+    /* Some non-CSO atoms don't use the state pointer. */
+    r300->invariant_state.allow_null_state = TRUE;
+    r300->fs_rc_constant_state.allow_null_state = TRUE;
+    r300->pvs_flush.allow_null_state = TRUE;
+    r300->query_start.allow_null_state = TRUE;
+    r300->texture_cache_inval.allow_null_state = TRUE;
 }
 
 struct pipe_context* r300_create_context(struct pipe_screen* screen,
@@ -175,38 +183,16 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
 
     r300->context.destroy = r300_destroy_context;
 
-    r300->context.clear = r300_clear;
-    r300->context.surface_copy = r300_surface_copy;
-    r300->context.surface_fill = r300_surface_fill;
-
-    if (r300screen->caps.has_tcl) {
-        r300->context.draw_arrays = r300_draw_arrays;
-        r300->context.draw_elements = r300_draw_elements;
-        r300->context.draw_range_elements = r300_draw_range_elements;
-
-        if (r300screen->caps.is_r500) {
-            r300->emit_draw_arrays_immediate = r500_emit_draw_arrays_immediate;
-            r300->emit_draw_arrays = r500_emit_draw_arrays;
-            r300->emit_draw_elements = r500_emit_draw_elements;
-        } else {
-            r300->emit_draw_arrays_immediate = r300_emit_draw_arrays_immediate;
-            r300->emit_draw_arrays = r300_emit_draw_arrays;
-            r300->emit_draw_elements = r300_emit_draw_elements;
-        }
-    } else {
-        r300->context.draw_arrays = r300_swtcl_draw_arrays;
-        r300->context.draw_elements = r300_draw_elements;
-        r300->context.draw_range_elements = r300_swtcl_draw_range_elements;
-
+    if (!r300screen->caps.has_tcl) {
         /* Create a Draw. This is used for SW TCL. */
         r300->draw = draw_create(&r300->context);
         /* Enable our renderer. */
         draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300));
         /* Enable Draw's clipping. */
         draw_set_driver_clipping(r300->draw, FALSE);
-        /* Force Draw to never do viewport transform, since we can do
-         * transform in hardware, always. */
-        draw_set_viewport_state(r300->draw, &r300_viewport_identity);
+        /* Disable converting points/lines to triangles. */
+        draw_wide_line_threshold(r300->draw, 10000000.f);
+        draw_wide_point_threshold(r300->draw, 10000000.f);
     }
 
     r300_setup_atoms(r300);
@@ -216,8 +202,10 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
                                    R300_BIND_OQBO, 4096);
     make_empty_list(&r300->query_list);
 
+    r300_init_blit_functions(r300);
     r300_init_flush_functions(r300);
     r300_init_query_functions(r300);
+    r300_init_render_functions(r300);
     r300_init_state_functions(r300);
     r300_init_resource_functions(r300);
 
@@ -241,6 +229,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     if (r300->upload_vb == NULL)
         goto no_upload_vb;
 
+    r300->tran.translate_cache = translate_cache_create();
+
     return &r300->context;
 
  no_upload_ib:
@@ -249,3 +239,35 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     FREE(r300);
     return NULL;
 }
+
+boolean r300_check_cs(struct r300_context *r300, unsigned size)
+{
+    return size <= r300->rws->get_cs_free_dwords(r300->rws);
+}
+
+void r300_finish(struct r300_context *r300)
+{
+    struct pipe_framebuffer_state *fb;
+    unsigned i;
+
+    /* This is a preliminary implementation of glFinish.
+     *
+     * The ideal implementation should use something like EmitIrqLocked and
+     * WaitIrq, or better, real fences.
+     */
+    if (r300->fb_state.state) {
+        fb = r300->fb_state.state;
+
+        for (i = 0; i < fb->nr_cbufs; i++) {
+            if (fb->cbufs[i]->texture) {
+                r300->rws->buffer_wait(r300->rws,
+                    r300_texture(fb->cbufs[i]->texture)->buffer);
+                return;
+            }
+        }
+        if (fb->zsbuf && fb->zsbuf->texture) {
+            r300->rws->buffer_wait(r300->rws,
+                r300_texture(fb->zsbuf->texture)->buffer);
+        }
+    }
+}