nvc0: add a new validation path for compute
This makes use of the new state validation interface to be consistent with 3d. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -262,35 +262,29 @@ nvc0_compute_validate_globals(struct nvc0_context *nvc0)
|
||||
}
|
||||
}
|
||||
|
||||
static struct nvc0_state_validate
|
||||
validate_list_cp[] = {
|
||||
{ nvc0_compprog_validate, NVC0_NEW_CP_PROGRAM },
|
||||
{ nvc0_compute_validate_constbufs, NVC0_NEW_CP_CONSTBUF },
|
||||
{ nvc0_compute_validate_driverconst, NVC0_NEW_CP_DRIVERCONST },
|
||||
{ nvc0_compute_validate_buffers, NVC0_NEW_CP_BUFFERS },
|
||||
{ nvc0_compute_validate_textures, NVC0_NEW_CP_TEXTURES },
|
||||
{ nvc0_compute_validate_samplers, NVC0_NEW_CP_SAMPLERS },
|
||||
{ nvc0_compute_validate_globals, NVC0_NEW_CP_GLOBALS },
|
||||
};
|
||||
|
||||
static bool
|
||||
nvc0_compute_state_validate(struct nvc0_context *nvc0)
|
||||
nvc0_state_validate_cp(struct nvc0_context *nvc0, uint32_t mask)
|
||||
{
|
||||
nvc0_compprog_validate(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_CONSTBUF)
|
||||
nvc0_compute_validate_constbufs(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_DRIVERCONST)
|
||||
nvc0_compute_validate_driverconst(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_BUFFERS)
|
||||
nvc0_compute_validate_buffers(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_TEXTURES)
|
||||
nvc0_compute_validate_textures(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_SAMPLERS)
|
||||
nvc0_compute_validate_samplers(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_GLOBALS)
|
||||
nvc0_compute_validate_globals(nvc0);
|
||||
bool ret;
|
||||
|
||||
/* TODO: surfaces */
|
||||
ret = nvc0_state_validate(nvc0, mask, validate_list_cp,
|
||||
ARRAY_SIZE(validate_list_cp), &nvc0->dirty_cp,
|
||||
nvc0->bufctx_cp);
|
||||
|
||||
nvc0_bufctx_fence(nvc0, nvc0->bufctx_cp, false);
|
||||
|
||||
nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx_cp);
|
||||
if (unlikely(nouveau_pushbuf_validate(nvc0->base.pushbuf)))
|
||||
return false;
|
||||
if (unlikely(nvc0->state.flushed))
|
||||
nvc0_bufctx_fence(nvc0, nvc0->bufctx_cp, true);
|
||||
|
||||
return true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -326,7 +320,7 @@ nvc0_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info *info)
|
||||
unsigned s;
|
||||
int ret;
|
||||
|
||||
ret = !nvc0_compute_state_validate(nvc0);
|
||||
ret = !nvc0_state_validate_cp(nvc0, ~0);
|
||||
if (ret) {
|
||||
NOUVEAU_ERR("Failed to launch grid !\n");
|
||||
return;
|
||||
|
@@ -301,34 +301,31 @@ nve4_compute_set_tex_handles(struct nvc0_context *nvc0)
|
||||
nvc0->samplers_dirty[s] = 0;
|
||||
}
|
||||
|
||||
static struct nvc0_state_validate
|
||||
validate_list_cp[] = {
|
||||
{ nvc0_compprog_validate, NVC0_NEW_CP_PROGRAM },
|
||||
{ nve4_compute_validate_textures, NVC0_NEW_CP_TEXTURES },
|
||||
{ nve4_compute_validate_samplers, NVC0_NEW_CP_SAMPLERS },
|
||||
{ nve4_compute_set_tex_handles, NVC0_NEW_CP_TEXTURES |
|
||||
NVC0_NEW_CP_SAMPLERS },
|
||||
{ nve4_compute_validate_surfaces, NVC0_NEW_CP_SURFACES },
|
||||
{ nvc0_compute_validate_globals, NVC0_NEW_CP_GLOBALS },
|
||||
};
|
||||
|
||||
static bool
|
||||
nve4_compute_state_validate(struct nvc0_context *nvc0)
|
||||
nve4_state_validate_cp(struct nvc0_context *nvc0, uint32_t mask)
|
||||
{
|
||||
nvc0_compprog_validate(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_TEXTURES)
|
||||
nve4_compute_validate_textures(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_SAMPLERS)
|
||||
nve4_compute_validate_samplers(nvc0);
|
||||
if (nvc0->dirty_cp & (NVC0_NEW_CP_TEXTURES | NVC0_NEW_CP_SAMPLERS))
|
||||
nve4_compute_set_tex_handles(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_SURFACES)
|
||||
nve4_compute_validate_surfaces(nvc0);
|
||||
if (nvc0->dirty_cp & NVC0_NEW_CP_GLOBALS)
|
||||
nvc0_compute_validate_globals(nvc0);
|
||||
bool ret;
|
||||
|
||||
nvc0_bufctx_fence(nvc0, nvc0->bufctx_cp, false);
|
||||
ret = nvc0_state_validate(nvc0, mask, validate_list_cp,
|
||||
ARRAY_SIZE(validate_list_cp), &nvc0->dirty_cp,
|
||||
nvc0->bufctx_cp);
|
||||
|
||||
nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx_cp);
|
||||
if (unlikely(nouveau_pushbuf_validate(nvc0->base.pushbuf)))
|
||||
return false;
|
||||
if (unlikely(nvc0->state.flushed))
|
||||
nvc0_bufctx_fence(nvc0, nvc0->bufctx_cp, true);
|
||||
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nve4_compute_upload_input(struct nvc0_context *nvc0, const void *input,
|
||||
const uint *block_layout,
|
||||
@@ -447,7 +444,7 @@ nve4_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info *info)
|
||||
BCTX_REFN_bo(nvc0->bufctx_cp, CP_DESC, NOUVEAU_BO_GART | NOUVEAU_BO_RD,
|
||||
desc_bo);
|
||||
|
||||
ret = !nve4_compute_state_validate(nvc0);
|
||||
ret = !nve4_state_validate_cp(nvc0, ~0);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
Reference in New Issue
Block a user