r600g: use pipe context for flushing inside map
authorJerome Glisse <jglisse@redhat.com>
Mon, 20 Sep 2010 19:35:19 +0000 (15:35 -0400)
committerJerome Glisse <jglisse@redhat.com>
Mon, 20 Sep 2010 20:02:13 +0000 (16:02 -0400)
This allow to share code path btw old & new, also
remove check on reference this might make things
a little slower but new design doesn't use reference
stuff.

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_context.c
src/gallium/drivers/r600/r600_query.c
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_state2.c
src/gallium/drivers/r600/r600_texture.c
src/gallium/drivers/r600/radeon.h
src/gallium/winsys/r600/drm/radeon_bo_pb.c

index dc3fc812e1ae34890671d25ac206c76f22bb6dc7..ea370782fdb1a19cb5f395ccd71c0cb3d5abc352 100644 (file)
@@ -171,7 +171,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
        if (transfer->usage & PIPE_TRANSFER_WRITE) {
                write = 1;
        }
-       data = radeon_ws_bo_map(rscreen->rw, rbuffer->r.bo, transfer->usage, rctx);
+       data = radeon_ws_bo_map(rscreen->rw, rbuffer->r.bo, transfer->usage, pipe);
        if (!data)
                return NULL;
 
index 72aab91d04e3da00c53954f9af182efe2fdaadc8..7a63d966eb569edef686762c8cf69d1a8a185c3b 100644 (file)
@@ -69,6 +69,10 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
 {
        struct r600_context *rctx = r600_context(ctx);
        struct r600_query *rquery = NULL;
+#if 0
+       static int dc = 0;
+       char dname[256];
+#endif
 
        /* flush upload buffers */
        u_upload_flush(rctx->upload_vb);
@@ -77,6 +81,16 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
        /* suspend queries */
        r600_queries_suspend(ctx);
 
+
+#if 0
+       sprintf(dname, "gallium-%08d.bof", dc);
+       if (dc < 2) {
+               radeon_ctx_dump_bof(rctx->ctx, dname);
+               R600_ERR("dumped %s\n", dname);
+       }
+       dc++;
+#endif
+
        radeon_ctx_submit(rctx->ctx);
 
        LIST_FOR_EACH_ENTRY(rquery, &rctx->query_list, list) {
@@ -88,13 +102,6 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
        r600_queries_resume(ctx);
 }
 
-void r600_flush_ctx(void *data)
-{
-        struct r600_context *rctx = data;
-
-        rctx->context.flush(&rctx->context, 0, NULL);
-}
-
 struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv)
 {
        struct r600_context *rctx = CALLOC_STRUCT(r600_context);
index 023b09ef65778575956d8a6b220d2417e6d0f99e..6e50701de668bac5b6dfb6984d6b25a19416f063 100644 (file)
@@ -108,7 +108,7 @@ static void r600_query_result(struct pipe_context *ctx, struct r600_query *rquer
        u32 *results;
        int i;
 
-       results = radeon_ws_bo_map(rscreen->rw, rquery->buffer, 0, r600_context(ctx));
+       results = radeon_ws_bo_map(rscreen->rw, rquery->buffer, 0, ctx);
        for (i = 0; i < rquery->num_results; i += 4) {
                start = (u64)results[i] | (u64)results[i + 1] << 32;
                end = (u64)results[i + 2] | (u64)results[i + 3] << 32;
index 1702475fa35a69a247abe8a3809a76db3bf3c0b3..e1e2891b6e97eb19a1e10bbb62c2cd9f7255452d 100644 (file)
@@ -167,7 +167,7 @@ static int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state
        if (rpshader->bo == NULL) {
                return -ENOMEM;
        }
-       data = radeon_ws_bo_map(rscreen->rw, rpshader->bo, 0, rctx);
+       data = radeon_ws_bo_map(rscreen->rw, rpshader->bo, 0, ctx);
        memcpy(data, rshader->bc.bytecode, rshader->bc.ndw * 4);
        radeon_ws_bo_unmap(rscreen->rw, rpshader->bo);
        /* build state */
index ffb18ab7fb309aa6c01b16d89df060e1bc865914..5269e6db912342032dc9fe228f2105a97947e724 100644 (file)
@@ -1600,6 +1600,9 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
        /* unreference old buffer and reference new one */
        rstate->id = R600_PIPE_STATE_FRAMEBUFFER;
        for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) {
+               pipe_surface_reference(&rctx->framebuffer.cbufs[i], NULL);
+       }
+       for (int i = 0; i < state->nr_cbufs; i++) {
                pipe_surface_reference(&rctx->framebuffer.cbufs[i], state->cbufs[i]);
        }
        pipe_surface_reference(&rctx->framebuffer.zsbuf, state->zsbuf);
index 66332580908a526a369e07f9be31929580b857a5..abfe406402a5806616e0bf6342fe92fb19f5510f 100644 (file)
@@ -346,7 +346,7 @@ void* r600_texture_transfer_map(struct pipe_context *ctx,
                        transfer->box.y / util_format_get_blockheight(format) * transfer->stride +
                        transfer->box.x / util_format_get_blockwidth(format) * util_format_get_blocksize(format);
        }
-       map = radeon_ws_bo_map(radeon, bo, 0, r600_context(ctx));
+       map = radeon_ws_bo_map(radeon, bo, 0, ctx);
        if (!map) {
                return NULL;
        }
index e52dcb4a341969eae5de27d9309cc9e6f69aabf2..a7e7982c195b8d6ca0d16a69785ba1f98aa79d85 100644 (file)
@@ -221,5 +221,4 @@ enum r600_stype {
 #define R600_QUERY_SIZE                                1
 #define R600_QUERY_PM4                         128
 
-void r600_flush_ctx(void *data);
 #endif
index 93dc927aba45e2d19d2b97a6892dee469306f694..148cf6d81d202a3fbe6981a72dc31acc878947d2 100644 (file)
@@ -53,7 +53,9 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
                          unsigned flags, void *ctx)
 {
        struct radeon_bo_pb *buf = radeon_bo_pb(_buf);
+       struct pipe_context *pctx = ctx;
 
+//printf("%s:%d ************************************************\n", __func__, __LINE__);
        if (flags & PB_USAGE_UNSYNCHRONIZED) {
                if (!buf->bo->data && radeon_bo_map(buf->mgr->radeon, buf->bo)) {
                        return NULL;
@@ -62,13 +64,11 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
                return buf->bo->data;
        }
 
-       if (p_atomic_read(&buf->bo->reference.count) > 1) {
-               if (flags & PB_USAGE_DONTBLOCK) {
-                       return NULL;
-               }
-               if (ctx) {
-                       r600_flush_ctx(ctx);
-               }
+       if (flags & PB_USAGE_DONTBLOCK) {
+               return NULL;
+       }
+       if (ctx) {
+               pctx->flush(pctx, 0, NULL);
        }
 
        if (flags & PB_USAGE_DONTBLOCK) {