r600g: propagate usage flags in texture transfers
authorKeith Whitwell <keithw@vmware.com>
Fri, 15 Oct 2010 13:44:30 +0000 (14:44 +0100)
committerKeith Whitwell <keithw@vmware.com>
Wed, 3 Nov 2010 09:36:01 +0000 (09:36 +0000)
src/gallium/drivers/r600/r600_texture.c

index 4ebd5b754b31434f60efee50233c55dd1d83154f..7222b43af651466dc5917769502538de6eac692f 100644 (file)
@@ -31,6 +31,7 @@
 #include <util/u_inlines.h>
 #include <util/u_memory.h>
 #include "state_tracker/drm_driver.h"
+#include "pipebuffer/pb_buffer.h"
 #include "r600_pipe.h"
 #include "r600_resource.h"
 #include "r600_state_inlines.h"
@@ -537,6 +538,7 @@ void* r600_texture_transfer_map(struct pipe_context *ctx,
        enum pipe_format format = transfer->resource->format;
        struct radeon *radeon = (struct radeon *)ctx->screen->winsys;
        unsigned offset = 0;
+       unsigned usage = 0;
        char *map;
 
        if (rtransfer->linear_texture) {
@@ -553,7 +555,30 @@ 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 = r600_bo_map(radeon, bo, 0, ctx);
+
+       if (transfer->usage & PIPE_TRANSFER_WRITE) {
+               usage |= PB_USAGE_CPU_WRITE;
+
+               if (transfer->usage & PIPE_TRANSFER_DISCARD) {
+               }
+
+               if (transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT) {
+               }
+       }
+
+       if (transfer->usage & PIPE_TRANSFER_READ) {
+               usage |= PB_USAGE_CPU_READ;
+       }
+
+       if (transfer->usage & PIPE_TRANSFER_DONTBLOCK) {
+               usage |= PB_USAGE_DONTBLOCK;
+       }
+
+       if (transfer->usage & PIPE_TRANSFER_UNSYNCHRONIZED) {
+               usage |= PB_USAGE_UNSYNCHRONIZED;
+       }
+
+       map = r600_bo_map(radeon, bo, usage, ctx);
        if (!map) {
                return NULL;
        }