draw: corrections to allow for different cliptest cases
[mesa.git] / src / gallium / drivers / r600 / r600_context.c
index b72494e0306cae6df9e080fc5f6d5347f290acef..091751e93a910fbfa27c234d15e16378048685c5 100644 (file)
@@ -28,6 +28,7 @@
 #include <util/u_inlines.h>
 #include <util/u_format.h>
 #include <util/u_memory.h>
+#include <util/u_upload_mgr.h>
 #include <util/u_blitter.h>
 #include "r600_screen.h"
 #include "r600_context.h"
@@ -56,7 +57,12 @@ static void r600_destroy_context(struct pipe_context *context)
        free(rctx->vs_constant);
        free(rctx->vs_resource);
 
-       radeon_ctx_fini(&rctx->ctx);
+       util_blitter_destroy(rctx->blitter);
+
+       u_upload_destroy(rctx->upload_vb);
+       u_upload_destroy(rctx->upload_ib);
+
+       radeon_ctx_fini(rctx->ctx);
        FREE(rctx);
 }
 
@@ -64,33 +70,36 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
                        struct pipe_fence_handle **fence)
 {
        struct r600_context *rctx = r600_context(ctx);
-       struct r600_query *rquery;
+       struct r600_query *rquery = NULL;
+#if 0
        static int dc = 0;
        char dname[256];
+#endif
+
+       /* flush upload buffers */
+       u_upload_flush(rctx->upload_vb);
+       u_upload_flush(rctx->upload_ib);
 
        /* suspend queries */
        r600_queries_suspend(ctx);
-       /* FIXME dumping should be removed once shader support instructions
-        * without throwing bad code
-        */
-       if (!rctx->ctx.cdwords)
-               goto out;
+
+
 #if 0
        sprintf(dname, "gallium-%08d.bof", dc);
-       if (dc < 2) {
-               radeon_ctx_dump_bof(&rctx->ctx, dname);
+       if (dc < 20) {
+               radeon_ctx_dump_bof(rctx->ctx, dname);
                R600_ERR("dumped %s\n", dname);
        }
+       dc++;
 #endif
-#if 1
-       radeon_ctx_submit(&rctx->ctx);
-#endif
+
+       radeon_ctx_submit(rctx->ctx);
+
        LIST_FOR_EACH_ENTRY(rquery, &rctx->query_list, list) {
-               rquery->flushed = true;
+               rquery->flushed = TRUE;
        }
-       dc++;
-out:
-       radeon_ctx_clear(&rctx->ctx);
+
+       radeon_ctx_clear(rctx->ctx);
        /* resume queries */
        r600_queries_resume(ctx);
 }
@@ -113,16 +122,17 @@ struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv)
        rctx->screen = rscreen;
        rctx->rw = rscreen->rw;
 
-       if (rscreen->chip_class == EVERGREEN)
+       if (radeon_get_family_class(rscreen->rw) == EVERGREEN)
                rctx->vtbl = &eg_hw_state_vtbl;
        else
                rctx->vtbl = &r600_hw_state_vtbl;
 
-       r600_init_blit_functions(rctx);
        r600_init_query_functions(rctx);
        r600_init_state_functions(rctx);
        r600_init_context_resource_functions(rctx);
 
+       r600_init_blit_functions(rctx);
+
        rctx->blitter = util_blitter_create(&rctx->context);
        if (rctx->blitter == NULL) {
                FREE(rctx);
@@ -131,25 +141,38 @@ struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv)
 
        rctx->vtbl->init_config(rctx);
 
+       rctx->upload_ib = u_upload_create(&rctx->context, 32 * 1024, 16,
+                                         PIPE_BIND_INDEX_BUFFER);
+       if (rctx->upload_ib == NULL) {
+               goto out_free;
+       }
+
+       rctx->upload_vb = u_upload_create(&rctx->context, 128 * 1024, 16,
+                                         PIPE_BIND_VERTEX_BUFFER);
+       if (rctx->upload_vb == NULL) {
+               goto out_free;
+       }
+
        rctx->vs_constant = (struct radeon_state *)calloc(R600_MAX_CONSTANT, sizeof(struct radeon_state));
        if (!rctx->vs_constant) {
-               FREE(rctx);
-               return NULL;
+               goto out_free;
        }
 
        rctx->ps_constant = (struct radeon_state *)calloc(R600_MAX_CONSTANT, sizeof(struct radeon_state));
        if (!rctx->ps_constant) {
-               FREE(rctx);
-               return NULL;
+               goto out_free;
        }
 
        rctx->vs_resource = (struct radeon_state *)calloc(R600_MAX_RESOURCE, sizeof(struct radeon_state));
        if (!rctx->vs_resource) {
-               FREE(rctx);
-               return NULL;
+               goto out_free;
        }                                                  
 
-       radeon_ctx_init(&rctx->ctx, rscreen->rw);
+       rctx->ctx = radeon_ctx_init(rscreen->rw);
        radeon_draw_init(&rctx->draw, rscreen->rw);
+       r600_blit_uncompress_depth_ptr = r600_blit_uncompress_depth;
        return &rctx->context;
+ out_free:
+       FREE(rctx);
+       return NULL;
 }