Mesa (nvfx-next-7b): nvfx: access buffer data directly
Luca Barbieri
lb at kemper.freedesktop.org
Fri Aug 13 04:34:49 UTC 2010
Module: Mesa
Branch: nvfx-next-7b
Commit: 277ceb28a8d0c245ae8ec190741fab029a509993
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=277ceb28a8d0c245ae8ec190741fab029a509993
Author: Luca Barbieri <luca at luca-barbieri.com>
Date: Wed Aug 11 10:09:47 2010 +0200
nvfx: access buffer data directly
---
src/gallium/drivers/nvfx/nvfx_draw.c | 27 ++++-----------------------
src/gallium/drivers/nvfx/nvfx_fragprog.c | 6 ++----
src/gallium/drivers/nvfx/nvfx_vertprog.c | 12 +++---------
3 files changed, 9 insertions(+), 36 deletions(-)
diff --git a/src/gallium/drivers/nvfx/nvfx_draw.c b/src/gallium/drivers/nvfx/nvfx_draw.c
index 3898bc7..4713fb5 100644
--- a/src/gallium/drivers/nvfx/nvfx_draw.c
+++ b/src/gallium/drivers/nvfx/nvfx_draw.c
@@ -9,6 +9,7 @@
#include "draw/draw_pipe.h"
#include "nvfx_context.h"
+#include "nvfx_resource.h"
/* Simple, but crappy, swtnl path, hopefully we wont need to hit this very
* often at all. Uses "quadro style" vertex submission + a fixed vertex
@@ -225,9 +226,6 @@ void
nvfx_draw_vbo_swtnl(struct pipe_context *pipe, const struct pipe_draw_info* info)
{
struct nvfx_context *nvfx = nvfx_context(pipe);
- struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS];
- struct pipe_transfer *ib_transfer = NULL;
- struct pipe_transfer *cb_transfer = NULL;
unsigned i;
void *map;
@@ -236,16 +234,12 @@ nvfx_draw_vbo_swtnl(struct pipe_context *pipe, const struct pipe_draw_info* info
nvfx_state_emit(nvfx);
for (i = 0; i < nvfx->vtxbuf_nr; i++) {
- map = pipe_buffer_map(pipe, nvfx->vtxbuf[i].buffer,
- PIPE_TRANSFER_READ,
- &vb_transfer[i]);
+ map = nvfx_buffer(nvfx->vtxbuf[i].buffer)->data + nvfx->vtxbuf[i].buffer_offset;
draw_set_mapped_vertex_buffer(nvfx->draw, i, map);
}
if (info->indexed) {
- map = pipe_buffer_map(pipe, nvfx->idxbuf.buffer,
- PIPE_TRANSFER_READ,
- &ib_transfer);
+ map = nvfx_buffer(nvfx->idxbuf.buffer)->data + nvfx->idxbuf.offset;
draw_set_mapped_element_buffer(nvfx->draw, nvfx->idxbuf.index_size, info->index_bias, map);
} else {
draw_set_mapped_element_buffer(nvfx->draw, 0, 0, NULL);
@@ -254,26 +248,13 @@ nvfx_draw_vbo_swtnl(struct pipe_context *pipe, const struct pipe_draw_info* info
if (nvfx->constbuf[PIPE_SHADER_VERTEX]) {
const unsigned nr = nvfx->constbuf_nr[PIPE_SHADER_VERTEX];
- map = pipe_buffer_map(pipe,
- nvfx->constbuf[PIPE_SHADER_VERTEX],
- PIPE_TRANSFER_READ,
- &cb_transfer);
+ map = nvfx_buffer(nvfx->constbuf[PIPE_SHADER_VERTEX])->data;
draw_set_mapped_constant_buffer(nvfx->draw, PIPE_SHADER_VERTEX, 0,
map, nr);
}
draw_arrays_instanced(nvfx->draw, info->mode, info->start, info->count, info->start_instance, info->instance_count);
- for (i = 0; i < nvfx->vtxbuf_nr; i++)
- pipe_buffer_unmap(pipe, nvfx->vtxbuf[i].buffer, vb_transfer[i]);
-
- if (nvfx->idxbuf.buffer)
- pipe_buffer_unmap(pipe, nvfx->idxbuf.buffer, ib_transfer);
-
- if (nvfx->constbuf[PIPE_SHADER_VERTEX])
- pipe_buffer_unmap(pipe, nvfx->constbuf[PIPE_SHADER_VERTEX],
- cb_transfer);
-
draw_flush(nvfx->draw);
}
diff --git a/src/gallium/drivers/nvfx/nvfx_fragprog.c b/src/gallium/drivers/nvfx/nvfx_fragprog.c
index 5973139..4b82308 100644
--- a/src/gallium/drivers/nvfx/nvfx_fragprog.c
+++ b/src/gallium/drivers/nvfx/nvfx_fragprog.c
@@ -10,6 +10,7 @@
#include "nvfx_context.h"
#include "nvfx_shader.h"
+#include "nvfx_resource.h"
#define MAX_CONSTS 128
#define MAX_IMM 32
@@ -977,10 +978,8 @@ nvfx_fragprog_validate(struct nvfx_context *nvfx)
if(nvfx->constbuf[PIPE_SHADER_FRAGMENT]) {
struct pipe_resource* constbuf = nvfx->constbuf[PIPE_SHADER_FRAGMENT];
- // TODO: avoid using transfers, just directly the buffer
- struct pipe_transfer* transfer;
// TODO: does this check make any sense, or should we do this unconditionally?
- uint32_t* map = pipe_buffer_map(&nvfx->pipe, constbuf, PIPE_TRANSFER_READ, &transfer);
+ uint32_t* map = nvfx_buffer(constbuf)->data;
uint32_t* buf = (uint32_t*)((char*)fp->fpbo->insn + offset);
int i;
for (i = 0; i < fp->nr_consts; ++i) {
@@ -993,7 +992,6 @@ nvfx_fragprog_validate(struct nvfx_context *nvfx)
nvfx_fp_memcpy(&fpmap[off], &map[idx], 4 * sizeof(uint32_t));
}
}
- pipe_buffer_unmap(&nvfx->pipe, constbuf, transfer);
}
if(fp->progs_left_with_obsolete_slot_assignments) {
diff --git a/src/gallium/drivers/nvfx/nvfx_vertprog.c b/src/gallium/drivers/nvfx/nvfx_vertprog.c
index cb0a7b4..1cc1e0d 100644
--- a/src/gallium/drivers/nvfx/nvfx_vertprog.c
+++ b/src/gallium/drivers/nvfx/nvfx_vertprog.c
@@ -11,6 +11,7 @@
#include "nvfx_context.h"
#include "nvfx_state.h"
+#include "nvfx_resource.h"
/* TODO (at least...):
* 1. Indexed consts + ARL
@@ -894,7 +895,6 @@ nvfx_vertprog_validate(struct nvfx_context *nvfx)
struct nouveau_grobj *eng3d = screen->eng3d;
struct nvfx_vertex_program *vp;
struct pipe_resource *constbuf;
- struct pipe_transfer *transfer = NULL;
boolean upload_code = FALSE, upload_data = FALSE;
int i;
@@ -1003,11 +1003,8 @@ nvfx_vertprog_validate(struct nvfx_context *nvfx)
if (vp->nr_consts) {
float *map = NULL;
- if (constbuf) {
- map = pipe_buffer_map(pipe, constbuf,
- PIPE_TRANSFER_READ,
- &transfer);
- }
+ if (constbuf)
+ map = nvfx_buffer(constbuf)->data;
for (i = 0; i < vp->nr_consts; i++) {
struct nvfx_vertex_program_data *vpd = &vp->consts[i];
@@ -1025,9 +1022,6 @@ nvfx_vertprog_validate(struct nvfx_context *nvfx)
OUT_RING (chan, i + vp->data->start);
OUT_RINGp (chan, (uint32_t *)vpd->value, 4);
}
-
- if (constbuf)
- pipe_buffer_unmap(pipe, constbuf, transfer);
}
/* Upload vtxprog */
More information about the mesa-commit
mailing list