mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 04:50:11 +01:00
r600g: set the flush callback in radeon_winsys
I have also renamed the winsys function. Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
7ee65800c3
commit
e2e1dc9e66
7 changed files with 38 additions and 22 deletions
|
|
@ -457,7 +457,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
|||
r300_init_render_functions(r300);
|
||||
r300_init_states(&r300->context);
|
||||
|
||||
rws->cs_set_flush(r300->cs, r300_flush_callback, r300);
|
||||
rws->cs_set_flush_callback(r300->cs, r300_flush_callback, r300);
|
||||
|
||||
/* The KIL opcode needs the first texture unit to be enabled
|
||||
* on r3xx-r4xx. In order to calm down the CS checker, we bind this
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@ void r600_context_pipe_state_set_vs_resource(struct r600_context *ctx, struct r6
|
|||
void r600_context_pipe_state_set_fs_resource(struct r600_context *ctx, struct r600_pipe_resource_state *state, unsigned rid);
|
||||
void r600_context_pipe_state_set_ps_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
void r600_context_pipe_state_set_vs_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
void r600_context_flush(struct r600_context *ctx);
|
||||
void r600_context_flush(struct r600_context *ctx, unsigned flags);
|
||||
void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw);
|
||||
|
||||
struct r600_query *r600_context_query_create(struct r600_context *ctx, unsigned query_type);
|
||||
|
|
|
|||
|
|
@ -114,8 +114,10 @@ static struct r600_fence *r600_create_fence(struct r600_pipe_context *ctx)
|
|||
return fence;
|
||||
}
|
||||
|
||||
|
||||
static void r600_flush(struct pipe_context *ctx,
|
||||
struct pipe_fence_handle **fence)
|
||||
struct pipe_fence_handle **fence,
|
||||
unsigned flags)
|
||||
{
|
||||
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
|
||||
struct r600_fence **rfence = (struct r600_fence**)fence;
|
||||
|
|
@ -123,7 +125,18 @@ static void r600_flush(struct pipe_context *ctx,
|
|||
if (rfence)
|
||||
*rfence = r600_create_fence(rctx);
|
||||
|
||||
r600_context_flush(&rctx->ctx);
|
||||
r600_context_flush(&rctx->ctx, flags);
|
||||
}
|
||||
|
||||
static void r600_flush_from_st(struct pipe_context *ctx,
|
||||
struct pipe_fence_handle **fence)
|
||||
{
|
||||
r600_flush(ctx, fence, 0);
|
||||
}
|
||||
|
||||
static void r600_flush_from_winsys(void *ctx, unsigned flags)
|
||||
{
|
||||
r600_flush((struct pipe_context*)ctx, NULL, flags);
|
||||
}
|
||||
|
||||
static void r600_update_num_contexts(struct r600_screen *rscreen, int diff)
|
||||
|
|
@ -194,7 +207,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
|
|||
rctx->context.screen = screen;
|
||||
rctx->context.priv = priv;
|
||||
rctx->context.destroy = r600_destroy_context;
|
||||
rctx->context.flush = r600_flush;
|
||||
rctx->context.flush = r600_flush_from_st;
|
||||
|
||||
/* Easy accessing of screen/winsys. */
|
||||
rctx->screen = rscreen;
|
||||
|
|
@ -244,6 +257,8 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
|
|||
return NULL;
|
||||
}
|
||||
|
||||
rctx->screen->ws->cs_set_flush_callback(rctx->ctx.cs, r600_flush_from_winsys, rctx);
|
||||
|
||||
util_slab_create(&rctx->pool_transfers,
|
||||
sizeof(struct pipe_transfer), 64,
|
||||
UTIL_SLAB_SINGLETHREADED);
|
||||
|
|
|
|||
|
|
@ -1158,7 +1158,7 @@ void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *dr
|
|||
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
|
||||
/* need to flush */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
/* at that point everythings is flushed and ctx->pm4_cdwords = 0 */
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords) > ctx->pm4_ndwords) {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ void r600_get_backend_mask(struct r600_context *ctx)
|
|||
ctx->pm4[ctx->pm4_cdwords++] = r600_context_bo_reloc(ctx, buffer);
|
||||
|
||||
/* execute */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
|
||||
/* analyze results */
|
||||
results = r600_bo_map(ctx->radeon, buffer, PB_USAGE_CPU_READ, NULL);
|
||||
|
|
@ -940,7 +940,7 @@ void r600_context_flush_all(struct r600_context *ctx, unsigned flush_flags)
|
|||
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
|
||||
/* need to flush */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_SURFACE_SYNC, 3, ctx->predicate_drawing);
|
||||
|
|
@ -1441,7 +1441,7 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
|
|||
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
|
||||
/* need to flush */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
/* at that point everythings is flushed and ctx->pm4_cdwords = 0 */
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords) > ctx->pm4_ndwords) {
|
||||
|
|
@ -1485,7 +1485,7 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
|
|||
ctx->pm4_dirty_cdwords = 0;
|
||||
}
|
||||
|
||||
void r600_context_flush(struct r600_context *ctx)
|
||||
void r600_context_flush(struct r600_context *ctx, unsigned flags)
|
||||
{
|
||||
struct r600_block *enable_block = NULL;
|
||||
|
||||
|
|
@ -1506,7 +1506,8 @@ void r600_context_flush(struct r600_context *ctx)
|
|||
|
||||
/* Flush the CS. */
|
||||
ctx->cs->cdw = ctx->pm4_cdwords;
|
||||
ctx->radeon->ws->cs_flush(ctx->cs, 0);
|
||||
ctx->radeon->ws->cs_flush(ctx->cs, flags);
|
||||
|
||||
/* We need to get the pointer to the other CS,
|
||||
* the command streams are double-buffered. */
|
||||
ctx->pm4 = ctx->cs->buf;
|
||||
|
|
@ -1553,7 +1554,7 @@ void r600_context_emit_fence(struct r600_context *ctx, struct r600_bo *fence_bo,
|
|||
|
||||
if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
|
||||
/* need to flush */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
|
||||
|
|
@ -1615,7 +1616,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
|
|||
|
||||
if ((required_space + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
|
||||
/* need to flush */
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
|
||||
if (query->type == PIPE_QUERY_OCCLUSION_COUNTER) {
|
||||
|
|
@ -1626,7 +1627,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
|
|||
query->queries_emitted = 1;
|
||||
} else {
|
||||
if (++query->queries_emitted > query->buffer_size / query->result_size / 2)
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1637,7 +1638,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
|
|||
/* collect current results if query buffer is full */
|
||||
if (new_results_end == query->results_start) {
|
||||
if (!(query->state & R600_QUERY_STATE_FLUSHED))
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
r600_query_result(ctx, query, TRUE);
|
||||
}
|
||||
|
||||
|
|
@ -1718,7 +1719,7 @@ void r600_query_predication(struct r600_context *ctx, struct r600_query *query,
|
|||
{
|
||||
if (operation == PREDICATION_OP_CLEAR) {
|
||||
if (ctx->pm4_cdwords + 3 > ctx->pm4_ndwords)
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_SET_PREDICATION, 1, 0);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = 0;
|
||||
|
|
@ -1734,7 +1735,7 @@ void r600_query_predication(struct r600_context *ctx, struct r600_query *query,
|
|||
count /= query->result_size;
|
||||
|
||||
if (ctx->pm4_cdwords + 5 * count > ctx->pm4_ndwords)
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
|
||||
op = PRED_OP(operation) | PREDICATION_DRAW_VISIBLE |
|
||||
(flag_wait ? PREDICATION_HINT_WAIT : PREDICATION_HINT_NOWAIT_DRAW);
|
||||
|
|
@ -1807,7 +1808,7 @@ boolean r600_context_query_result(struct r600_context *ctx,
|
|||
uint64_t *result = (uint64_t*)vresult;
|
||||
|
||||
if (!(query->state & R600_QUERY_STATE_FLUSHED)) {
|
||||
r600_context_flush(ctx);
|
||||
r600_context_flush(ctx, 0);
|
||||
}
|
||||
if (!r600_query_result(ctx, query, wait))
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -477,6 +477,6 @@ void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws)
|
|||
ws->base.cs_validate = radeon_drm_cs_validate;
|
||||
ws->base.cs_write_reloc = radeon_drm_cs_write_reloc;
|
||||
ws->base.cs_flush = radeon_drm_cs_flush;
|
||||
ws->base.cs_set_flush = radeon_drm_cs_set_flush;
|
||||
ws->base.cs_set_flush_callback = radeon_drm_cs_set_flush;
|
||||
ws->base.cs_is_buffer_referenced = radeon_bo_is_referenced;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,9 +306,9 @@ struct radeon_winsys {
|
|||
* \param flush A flush callback function associated with the command stream.
|
||||
* \param user A user pointer that will be passed to the flush callback.
|
||||
*/
|
||||
void (*cs_set_flush)(struct radeon_winsys_cs *cs,
|
||||
void (*flush)(void *ctx, unsigned flags),
|
||||
void *ctx);
|
||||
void (*cs_set_flush_callback)(struct radeon_winsys_cs *cs,
|
||||
void (*flush)(void *ctx, unsigned flags),
|
||||
void *ctx);
|
||||
|
||||
/**
|
||||
* Return TRUE if a buffer is referenced by a command stream.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue