mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
ilo: rework winsys batch buffer functions
Rename intel_winsys_check_aperture_size() to intel_winsys_can_submit_bo(), intel_bo_exec() to intel_winsys_submit_bo(), and intel_winsys_decode_commands() to intel_winsys_decode_bo(). Make a semantic change to ignore intel_context when the ring is not the render ring.
This commit is contained in:
parent
3e324f99d3
commit
249b1ad984
5 changed files with 59 additions and 55 deletions
|
|
@ -173,7 +173,6 @@ ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
|
|||
|
||||
while (true) {
|
||||
struct ilo_cp_jmp_buf jmp;
|
||||
int err;
|
||||
|
||||
/* we will rewind if aperture check below fails */
|
||||
ilo_cp_setjmp(p->cp, &jmp);
|
||||
|
|
@ -185,8 +184,7 @@ ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
|
|||
p->emit_draw(p, ilo);
|
||||
ilo_cp_assert_no_implicit_flush(p->cp, false);
|
||||
|
||||
err = intel_winsys_check_aperture_space(ilo->winsys, &p->cp->bo, 1);
|
||||
if (!err) {
|
||||
if (intel_winsys_can_submit_bo(ilo->winsys, &p->cp->bo, 1)) {
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
|
|
@ -271,7 +269,6 @@ ilo_3d_pipeline_emit_rectlist(struct ilo_3d_pipeline *p,
|
|||
|
||||
while (true) {
|
||||
struct ilo_cp_jmp_buf jmp;
|
||||
int err;
|
||||
|
||||
/* we will rewind if aperture check below fails */
|
||||
ilo_cp_setjmp(p->cp, &jmp);
|
||||
|
|
@ -282,9 +279,7 @@ ilo_3d_pipeline_emit_rectlist(struct ilo_3d_pipeline *p,
|
|||
p->emit_rectlist(p, blitter);
|
||||
ilo_cp_assert_no_implicit_flush(p->cp, false);
|
||||
|
||||
err = intel_winsys_check_aperture_space(blitter->ilo->winsys,
|
||||
&p->cp->bo, 1);
|
||||
if (err) {
|
||||
if (!intel_winsys_can_submit_bo(blitter->ilo->winsys, &p->cp->bo, 1)) {
|
||||
/* rewind */
|
||||
ilo_cp_longjmp(p->cp, &jmp);
|
||||
|
||||
|
|
|
|||
|
|
@ -349,7 +349,7 @@ ilo_blitter_blt_begin(struct ilo_blitter *blitter, int max_cmd_size,
|
|||
count++;
|
||||
}
|
||||
|
||||
if (intel_winsys_check_aperture_space(ilo->winsys, aper_check, count))
|
||||
if (!intel_winsys_can_submit_bo(ilo->winsys, aper_check, count))
|
||||
ilo_cp_flush(ilo->cp, "out of aperture");
|
||||
|
||||
/* set BCS_SWCTRL */
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ ilo_cp_dump(struct ilo_cp *cp)
|
|||
{
|
||||
ilo_printf("dumping %d bytes\n", cp->used * 4);
|
||||
if (cp->used)
|
||||
intel_winsys_decode_commands(cp->winsys, cp->bo, cp->used * 4);
|
||||
intel_winsys_decode_bo(cp->winsys, cp->bo, cp->used * 4);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -182,31 +182,31 @@ static int
|
|||
ilo_cp_exec_bo(struct ilo_cp *cp)
|
||||
{
|
||||
const bool do_exec = !(ilo_debug & ILO_DEBUG_NOHW);
|
||||
struct intel_context *ctx;
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
switch (cp->ring) {
|
||||
case ILO_CP_RING_RENDER:
|
||||
ctx = cp->render_ctx;
|
||||
flags = INTEL_EXEC_RENDER;
|
||||
break;
|
||||
case ILO_CP_RING_BLT:
|
||||
ctx = NULL;
|
||||
flags = INTEL_EXEC_BLT;
|
||||
break;
|
||||
default:
|
||||
ctx = NULL;
|
||||
assert(!"unknown cp ring");
|
||||
flags = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
flags |= cp->one_off_flags;
|
||||
|
||||
if (likely(do_exec))
|
||||
err = intel_bo_exec(cp->bo, cp->used * 4, ctx, flags);
|
||||
else
|
||||
if (likely(do_exec)) {
|
||||
err = intel_winsys_submit_bo(cp->winsys,
|
||||
cp->bo, cp->used * 4, cp->render_ctx, flags);
|
||||
}
|
||||
else {
|
||||
err = 0;
|
||||
}
|
||||
|
||||
cp->one_off_flags = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -356,18 +356,38 @@ intel_winsys_export_handle(struct intel_winsys *winsys,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
intel_winsys_check_aperture_space(struct intel_winsys *winsys,
|
||||
struct intel_bo **bo_array,
|
||||
int count)
|
||||
bool
|
||||
intel_winsys_can_submit_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo **bo_array,
|
||||
int count)
|
||||
{
|
||||
return drm_intel_bufmgr_check_aperture_space((drm_intel_bo **) bo_array,
|
||||
count);
|
||||
return !drm_intel_bufmgr_check_aperture_space((drm_intel_bo **) bo_array,
|
||||
count);
|
||||
}
|
||||
|
||||
int
|
||||
intel_winsys_submit_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used,
|
||||
struct intel_context *ctx,
|
||||
unsigned long flags)
|
||||
{
|
||||
/* logical contexts are only available for the render ring */
|
||||
if ((flags & 0x7) > INTEL_EXEC_RENDER)
|
||||
ctx = NULL;
|
||||
|
||||
if (ctx) {
|
||||
return drm_intel_gem_bo_context_exec(gem_bo(bo),
|
||||
(drm_intel_context *) ctx, used, flags);
|
||||
}
|
||||
else {
|
||||
return drm_intel_bo_mrb_exec(gem_bo(bo),
|
||||
used, NULL, 0, 0, flags);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
intel_winsys_decode_commands(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used)
|
||||
intel_winsys_decode_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used)
|
||||
{
|
||||
void *ptr;
|
||||
|
||||
|
|
@ -509,20 +529,6 @@ intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo)
|
|||
return drm_intel_bo_references(gem_bo(bo), gem_bo(target_bo));
|
||||
}
|
||||
|
||||
int
|
||||
intel_bo_exec(struct intel_bo *bo, int used,
|
||||
struct intel_context *ctx, unsigned long flags)
|
||||
{
|
||||
if (ctx) {
|
||||
return drm_intel_gem_bo_context_exec(gem_bo(bo),
|
||||
(drm_intel_context *) ctx, used, flags);
|
||||
}
|
||||
else {
|
||||
return drm_intel_bo_mrb_exec(gem_bo(bo),
|
||||
used, NULL, 0, 0, flags);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
intel_bo_wait(struct intel_bo *bo, int64_t timeout)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -161,13 +161,26 @@ intel_winsys_export_handle(struct intel_winsys *winsys,
|
|||
struct winsys_handle *handle);
|
||||
|
||||
/**
|
||||
* Check that buffer objects directly specified in \p bo_array, and those
|
||||
* indirectly referenced by them, can fit in the aperture space.
|
||||
* Return true when buffer objects directly specified in \p bo_array, and
|
||||
* those indirectly referenced by them, can fit in the aperture space.
|
||||
*/
|
||||
bool
|
||||
intel_winsys_can_submit_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo **bo_array,
|
||||
int count);
|
||||
|
||||
/**
|
||||
* Submit \p bo for execution.
|
||||
*
|
||||
* \p bo and all bos referenced by \p bo will be considered busy until all
|
||||
* commands are parsed and executed. \p ctx is ignored when the bo is not
|
||||
* submitted to the render ring.
|
||||
*/
|
||||
int
|
||||
intel_winsys_check_aperture_space(struct intel_winsys *winsys,
|
||||
struct intel_bo **bo_array,
|
||||
int count);
|
||||
intel_winsys_submit_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used,
|
||||
struct intel_context *ctx,
|
||||
unsigned long flags);
|
||||
|
||||
/**
|
||||
* Decode the commands contained in \p bo. For debugging.
|
||||
|
|
@ -176,8 +189,8 @@ intel_winsys_check_aperture_space(struct intel_winsys *winsys,
|
|||
* \param used Size of the commands in bytes.
|
||||
*/
|
||||
void
|
||||
intel_winsys_decode_commands(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used);
|
||||
intel_winsys_decode_bo(struct intel_winsys *winsys,
|
||||
struct intel_bo *bo, int used);
|
||||
|
||||
/**
|
||||
* Increase the reference count of \p bo.
|
||||
|
|
@ -273,16 +286,6 @@ intel_bo_truncate_relocs(struct intel_bo *bo, int start);
|
|||
bool
|
||||
intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo);
|
||||
|
||||
/**
|
||||
* Submit \p bo for execution.
|
||||
*
|
||||
* \p bo and all bos referenced by \p bo will be considered busy until all
|
||||
* commands are parsed and executed.
|
||||
*/
|
||||
int
|
||||
intel_bo_exec(struct intel_bo *bo, int used,
|
||||
struct intel_context *ctx, unsigned long flags);
|
||||
|
||||
/**
|
||||
* Wait until \bo is idle, or \p timeout nanoseconds have passed. A
|
||||
* negative timeout means to wait indefinitely.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue