summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r300
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2014-04-12 17:01:52 +0200
committerMarek Olšák <[email protected]>2014-04-16 14:02:51 +0200
commit70cf6639c331342619e65c46db925d115bf51920 (patch)
treeb20b53d7d4d123cd0b7aeb95c3f6eb04243a70f2 /src/gallium/drivers/r300
parent3e9d2cbca2b6b65f302adeadbfc049cc51c14c46 (diff)
gallium/radeon: create and return a fence in the flush function
All flush functions get a fence parameter. cs_create_fence is removed. Reviewed-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r--src/gallium/drivers/r300/r300_context.c5
-rw-r--r--src/gallium/drivers/r300/r300_flush.c19
2 files changed, 12 insertions, 12 deletions
diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index 0116d6c0683..7ae355189fc 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -123,11 +123,12 @@ static void r300_destroy_context(struct pipe_context* context)
FREE(r300);
}
-static void r300_flush_callback(void *data, unsigned flags)
+static void r300_flush_callback(void *data, unsigned flags,
+ struct pipe_fence_handle **fence)
{
struct r300_context* const cs_context_copy = data;
- r300_flush(&cs_context_copy->context, flags, NULL);
+ r300_flush(&cs_context_copy->context, flags, fence);
}
#define R300_INIT_ATOM(atomname, atomsize) \
diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c
index cbe2b578448..404c6fe11ec 100644
--- a/src/gallium/drivers/r300/r300_flush.c
+++ b/src/gallium/drivers/r300/r300_flush.c
@@ -34,7 +34,8 @@
#include "r300_emit.h"
-static void r300_flush_and_cleanup(struct r300_context *r300, unsigned flags)
+static void r300_flush_and_cleanup(struct r300_context *r300, unsigned flags,
+ struct pipe_fence_handle **fence)
{
struct r300_atom *atom;
@@ -52,7 +53,7 @@ static void r300_flush_and_cleanup(struct r300_context *r300, unsigned flags)
}
r300->flush_counter++;
- r300->rws->cs_flush(r300->cs, flags, 0);
+ r300->rws->cs_flush(r300->cs, flags, fence, 0);
r300->dirty_hw = 0;
/* New kitchen sink, baby. */
@@ -81,23 +82,19 @@ void r300_flush(struct pipe_context *pipe,
flags |= RADEON_FLUSH_KEEP_TILING_FLAGS;
}
- if (fence) {
- *fence = r300->rws->cs_create_fence(r300->cs);
- }
-
if (r300->dirty_hw) {
- r300_flush_and_cleanup(r300, flags);
+ r300_flush_and_cleanup(r300, flags, fence);
} else {
if (fence) {
/* We have to create a fence object, but the command stream is empty
* and we cannot emit an empty CS. Let's write to some reg. */
CS_LOCALS(r300);
OUT_CS_REG(RB3D_COLOR_CHANNEL_MASK, 0);
- r300->rws->cs_flush(r300->cs, flags, 0);
+ r300->rws->cs_flush(r300->cs, flags, fence, 0);
} else {
/* Even if hw is not dirty, we should at least reset the CS in case
* the space checking failed for the first draw operation. */
- r300->rws->cs_flush(r300->cs, flags, 0);
+ r300->rws->cs_flush(r300->cs, flags, NULL, 0);
}
}
@@ -119,7 +116,9 @@ void r300_flush(struct pipe_context *pipe,
r300_decompress_zmask(r300);
}
- r300_flush_and_cleanup(r300, flags);
+ if (fence && *fence)
+ r300->rws->fence_reference(fence, NULL);
+ r300_flush_and_cleanup(r300, flags, fence);
}
/* Revoke Hyper-Z access, so that some other process can take it. */