r600g: Flush upload buffers before draws instead of before flushes.
If a upload buffer is used by a previous draw that's still in the CS, accessing it would need a context flush. However, doing a context flush when mapping the upload buffer would then flush/destroy the same buffer we're trying to map there. Flushing the upload buffers before a draw avoids both the CS flush and the upload buffer going away while it's being used. Note that u_upload_data() could e.g. use a pool of buffers instead of allocating new ones all the time if that turns out to be a significant issue.
This commit is contained in:
@@ -70,10 +70,6 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
|
||||
struct r600_context *rctx = r600_context(ctx);
|
||||
struct r600_query *rquery = NULL;
|
||||
|
||||
/* flush upload buffers */
|
||||
u_upload_flush(rctx->upload_vb);
|
||||
u_upload_flush(rctx->upload_ib);
|
||||
|
||||
/* suspend queries */
|
||||
r600_queries_suspend(ctx);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <util/u_math.h>
|
||||
#include <util/u_inlines.h>
|
||||
#include <util/u_memory.h>
|
||||
#include <util/u_upload_mgr.h>
|
||||
#include "radeon.h"
|
||||
#include "r600_screen.h"
|
||||
#include "r600_context.h"
|
||||
@@ -125,6 +126,10 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
||||
|
||||
memset(&draw, 0, sizeof(draw));
|
||||
|
||||
/* flush upload buffers */
|
||||
u_upload_flush(rctx->upload_vb);
|
||||
u_upload_flush(rctx->upload_ib);
|
||||
|
||||
if (rctx->any_user_vbs) {
|
||||
r600_upload_user_buffers(rctx);
|
||||
rctx->any_user_vbs = false;
|
||||
|
||||
Reference in New Issue
Block a user