[Mesa-dev] [PATCH 02/12] nvc0: allow to push constant buffers for compute on Fermi
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sat Feb 6 22:38:01 UTC 2016
Constant buffers must be bound for compute like for 3D. This is done
by adding a new 'shader' parameter to nvc0_cb_bo_push() which allows
to use the compute channel for compute shaders, and the 3D channel
for other shader types.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 2 +-
src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c | 2 +-
src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c | 15 +++++++++++----
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
index 2e726e6..2ab70e8 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
@@ -301,7 +301,7 @@ nve4_p2mf_push_linear(struct nouveau_context *nv,
unsigned size, const void *data);
void
nvc0_cb_bo_push(struct nouveau_context *,
- struct nouveau_bo *bo, unsigned domain,
+ struct nouveau_bo *bo, unsigned domain, unsigned shader,
unsigned base, unsigned size,
unsigned offset, unsigned words, const uint32_t *data);
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
index 2bb9b44..97fcfbc 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
@@ -441,7 +441,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
PUSH_DATA (push, (0 << 4) | 1);
}
nvc0_cb_bo_push(&nvc0->base, bo, NV_VRAM_DOMAIN(&nvc0->screen->base),
- base, nvc0->state.uniform_buffer_bound[s],
+ base, nvc0->state.uniform_buffer_bound[s], s,
0, (size + 3) / 4,
nvc0->constbuf[s][0].u.data);
} else {
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
index 279c7e9..5cea822 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
@@ -4,6 +4,7 @@
#include "nvc0/nvc0_context.h"
#include "nv50/nv50_defs.xml.h"
+#include "nvc0/nvc0_compute.xml.h"
struct nvc0_transfer {
struct pipe_transfer base;
@@ -532,7 +533,7 @@ nvc0_cb_push(struct nouveau_context *nv,
if (cb) {
nvc0_cb_bo_push(nv, res->bo, res->domain,
- res->offset + cb->offset, cb->size,
+ res->offset + cb->offset, cb->size, s,
offset - cb->offset, words, data);
} else {
nv->push_data(nv, res->bo, res->offset + offset, res->domain,
@@ -543,7 +544,7 @@ nvc0_cb_push(struct nouveau_context *nv,
void
nvc0_cb_bo_push(struct nouveau_context *nv,
struct nouveau_bo *bo, unsigned domain,
- unsigned base, unsigned size,
+ unsigned base, unsigned size, unsigned shader,
unsigned offset, unsigned words, const uint32_t *data)
{
struct nouveau_pushbuf *push = nv->pushbuf;
@@ -557,7 +558,10 @@ nvc0_cb_bo_push(struct nouveau_context *nv,
assert(offset < size);
assert(offset + words * 4 <= size);
- BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
+ if (unlikely(shader == 5))
+ BEGIN_NVC0(push, NVC0_COMPUTE(CB_SIZE), 3);
+ else
+ BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
PUSH_DATA (push, size);
PUSH_DATAh(push, bo->offset + base);
PUSH_DATA (push, bo->offset + base);
@@ -567,7 +571,10 @@ nvc0_cb_bo_push(struct nouveau_context *nv,
PUSH_SPACE(push, nr + 2);
PUSH_REFN (push, bo, NOUVEAU_BO_WR | domain);
- BEGIN_1IC0(push, NVC0_3D(CB_POS), nr + 1);
+ if (unlikely(shader == 5))
+ BEGIN_1IC0(push, NVC0_COMPUTE(CB_POS), nr + 1);
+ else
+ BEGIN_1IC0(push, NVC0_3D(CB_POS), nr + 1);
PUSH_DATA (push, offset);
PUSH_DATAp(push, data, nr);
--
2.6.4
More information about the mesa-dev
mailing list