On Fri, Jun 13, 2014 at 10:35:38PM +0200, Bruno Jiménez wrote:
All the *Enqueue* functions that read/write buffers (except
clEnqueueCopyBuffer) would map the associated resource, making
it to be demoted if it was in the pool.
But we possitively know that this transfer will end before
positively
any kernel is launched, so there's no need to demote it.
NOTE: As a proof of concept I have used PIPE_TRANSFER_MAP_DIRECTLY,
but it collides with OpenCL 1.2 CL_MAP_WRITE_INVALIDATE_REGION,
so we will have to find another bitfield to use.
---
src/gallium/drivers/r600/evergreen_compute.c| 20 +++-
src/gallium/state_trackers/clover/api/transfer.cpp | 4 ++--
src/gallium/state_trackers/clover/core/resource.cpp | 2 ++
3 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/r600/evergreen_compute.c
b/src/gallium/drivers/r600/evergreen_compute.c
index e5967b5..794cbe6 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -967,18 +967,28 @@ void *r600_compute_global_transfer_map(
struct r600_resource_global* buffer =
(struct r600_resource_global*)resource;
- struct pipe_resource *dst;
+ struct pipe_resource *dst =
+ (struct pipe_resource *) buffer-chunk-real_buffer;
unsigned offset = box-x;
+ /* If the item is already in the pool, and we are going
+ * to read/write it, map it directly without demoting it */
if (buffer-chunk-start_in_dw != -1) {
- compute_memory_demote_item(pool, buffer-chunk, ctx_);
+ if (usage PIPE_TRANSFER_MAP_DIRECTLY) {
+ dst = (struct pipe_resource *) buffer-chunk-pool-bo;
+ offset += (buffer-chunk-start_in_dw * 4);
+ }
+ else {
+ compute_memory_demote_item(pool, buffer-chunk, ctx_);
+ dst = (struct pipe_resource *)
buffer-chunk-real_buffer;
+ }
}
- dst = (struct pipe_resource*)buffer-chunk-real_buffer;
-
- if (usage PIPE_TRANSFER_READ)
+ if ((usage PIPE_TRANSFER_READ) !(usage
PIPE_TRANSFER_MAP_DIRECTLY))
buffer-chunk-status |= ITEM_MAPPED_FOR_READING;
+ usage = ~PIPE_TRANSFER_MAP_DIRECTLY;
+
COMPUTE_DBG(rctx-screen, * r600_compute_global_transfer_map()\n
level = %u, usage = %u, box(x = %u, y = %u, z = %u
width = %u, height = %u, depth = %u)\n, level, usage,
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp
b/src/gallium/state_trackers/clover/api/transfer.cpp
index 404ceb0..032542e 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
The changes to clover should be split out into a separate patch.
@@ -174,8 +174,8 @@ namespace {
static mapping
get(command_queue q, T obj, cl_map_flags flags,
size_t offset, size_t size) {
- return { q, obj-resource(q), flags, true,
- {{ offset }}, {{ size, 1, 1 }} };
+ return { q, obj-resource(q), flags | PIPE_TRANSFER_MAP_DIRECTLY,
+ true, {{ offset }}, {{ size, 1, 1 }} };
}
};
diff --git a/src/gallium/state_trackers/clover/core/resource.cpp
b/src/gallium/state_trackers/clover/core/resource.cpp
index 7b8a40a..bda9847 100644
--- a/src/gallium/state_trackers/clover/core/resource.cpp
+++ b/src/gallium/state_trackers/clover/core/resource.cpp
@@ -174,6 +174,8 @@ mapping::mapping(command_queue q, resource r,
pctx(q.pipe) {
unsigned usage = ((flags CL_MAP_WRITE ? PIPE_TRANSFER_WRITE : 0 ) |
(flags CL_MAP_READ ? PIPE_TRANSFER_READ : 0 ) |
+ (flags PIPE_TRANSFER_MAP_DIRECTLY ?
+ PIPE_TRANSFER_MAP_DIRECTLY : 0 ) |
(!blocking ? PIPE_TRANSFER_UNSYNCHRONIZED : 0));
p = pctx-transfer_map(pctx, r.pipe, 0, usage,
--
2.0.0
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev