[Mesa-dev] [PATCH 2/2] nvc0: add a new validation path for compute
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Mar 8 20:09:00 UTC 2016
This makes use of the new state validation interface to be consistent
with 3d.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/gallium/drivers/nouveau/nvc0/nvc0_compute.c | 47 +++++++++++--------------
src/gallium/drivers/nouveau/nvc0/nve4_compute.c | 42 +++++++++++-----------
2 files changed, 41 insertions(+), 48 deletions(-)
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c b/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c
index 060f59d..45b084a 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c
@@ -23,6 +23,7 @@
*/
#include "nvc0/nvc0_context.h"
+#include "nvc0/nvc0_state_validate.h"
#include "nvc0/nvc0_compute.xml.h"
@@ -262,35 +263,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);
-
- /* TODO: surfaces */
-
- 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);
+ bool ret;
- return true;
+ ret = nvc0_state_validate(nvc0, mask, validate_list_cp,
+ ARRAY_SIZE(validate_list_cp), &nvc0->dirty_cp,
+ nvc0->bufctx_cp);
+ if (unlikely(nvc0->state.flushed))
+ nvc0_bufctx_fence(nvc0, nvc0->bufctx_cp, true);
+ return ret;
}
static void
@@ -326,7 +321,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;
diff --git a/src/gallium/drivers/nouveau/nvc0/nve4_compute.c b/src/gallium/drivers/nouveau/nvc0/nve4_compute.c
index 4a4e836..cea3951 100644
--- a/src/gallium/drivers/nouveau/nvc0/nve4_compute.c
+++ b/src/gallium/drivers/nouveau/nvc0/nve4_compute.c
@@ -23,6 +23,7 @@
*/
#include "nvc0/nvc0_context.h"
+#include "nvc0/nvc0_state_validate.h"
#include "nvc0/nve4_compute.h"
#include "codegen/nv50_ir_driver.h"
@@ -301,34 +302,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);
-
- 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;
+ bool ret;
+
+ ret = nvc0_state_validate(nvc0, mask, validate_list_cp,
+ ARRAY_SIZE(validate_list_cp), &nvc0->dirty_cp,
+ nvc0->bufctx_cp);
+
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 +445,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;
--
2.7.1
More information about the mesa-dev
mailing list