[Mesa-dev] [PATCH 05/21] u_vbuf: override set_index_buffer
Marek Olšák
maraeo at gmail.com
Wed Apr 11 08:38:39 PDT 2012
This makes u_vbuf_mgr call the driver instead of the other way around.
---
src/gallium/auxiliary/util/u_vbuf.c | 35 ++++++++++++++++++++++---
src/gallium/auxiliary/util/u_vbuf.h | 6 ----
src/gallium/drivers/r300/r300_context.h | 2 +-
src/gallium/drivers/r300/r300_render.c | 22 ++++++++--------
src/gallium/drivers/r300/r300_state.c | 15 +++++------
src/gallium/drivers/r600/r600_pipe.h | 1 +
src/gallium/drivers/r600/r600_state_common.c | 16 +++++++----
7 files changed, 60 insertions(+), 37 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c
index 50c35af..7883845 100644
--- a/src/gallium/auxiliary/util/u_vbuf.c
+++ b/src/gallium/auxiliary/util/u_vbuf.c
@@ -70,6 +70,9 @@ struct u_vbuf_priv {
struct translate_cache *translate_cache;
struct cso_cache *cso_cache;
+ /* The index buffer. */
+ struct pipe_index_buffer index_buffer;
+
/* Vertex element state bound by the state tracker. */
void *saved_ve;
/* and its associated helper structure for this module. */
@@ -93,6 +96,9 @@ struct u_vbuf_priv {
boolean incompatible_vb_layout;
/* Per-buffer flags. */
boolean incompatible_vb[PIPE_MAX_ATTRIBS];
+
+ void (*driver_set_index_buffer)(struct pipe_context *pipe,
+ const struct pipe_index_buffer *);
};
static void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr)
@@ -124,6 +130,8 @@ static void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr)
0, PIPE_BIND_VERTEX_BUFFER);
}
+static void u_vbuf_install(struct u_vbuf_priv *mgr);
+
struct u_vbuf *
u_vbuf_create(struct pipe_context *pipe,
unsigned upload_buffer_size,
@@ -146,7 +154,7 @@ u_vbuf_create(struct pipe_context *pipe,
fetch_alignment == U_VERTEX_FETCH_BYTE_ALIGNED;
u_vbuf_init_format_caps(mgr);
-
+ u_vbuf_install(mgr);
return &mgr->b;
}
@@ -195,6 +203,9 @@ void u_vbuf_destroy(struct u_vbuf *mgrb)
struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
unsigned i;
+ assert(mgr->pipe->draw);
+ mgr->pipe->draw = NULL;
+
for (i = 0; i < mgr->b.nr_vertex_buffers; i++) {
pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, NULL);
}
@@ -256,7 +267,7 @@ u_vbuf_translate_buffers(struct u_vbuf_priv *mgr, struct translate_key *key,
/* Translate. */
if (unroll_indices) {
- struct pipe_index_buffer *ib = &mgr->b.index_buffer;
+ struct pipe_index_buffer *ib = &mgr->index_buffer;
struct pipe_transfer *transfer = NULL;
unsigned offset = ib->offset + start_index * ib->index_size;
uint8_t *map;
@@ -732,9 +743,11 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgrb,
mgr->b.nr_real_vertex_buffers = count;
}
-void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
- const struct pipe_index_buffer *ib)
+static void u_vbuf_set_index_buffer(struct pipe_context *pipe,
+ const struct pipe_index_buffer *ib)
{
+ struct u_vbuf_priv *mgr = pipe->draw;
+
if (ib && ib->buffer) {
assert(ib->offset % ib->index_size == 0);
pipe_resource_reference(&mgr->index_buffer.buffer, ib->buffer);
@@ -743,6 +756,8 @@ void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
} else {
pipe_resource_reference(&mgr->index_buffer.buffer, NULL);
}
+
+ mgr->driver_set_index_buffer(pipe, ib);
}
static void
@@ -1068,7 +1083,7 @@ u_vbuf_draw_begin(struct u_vbuf *mgrb,
max_index = info->max_index;
index_bounds_valid = true;
} else if (u_vbuf_need_minmax_index(mgr)) {
- u_vbuf_get_minmax_index(mgr->pipe, &mgr->b.index_buffer, info,
+ u_vbuf_get_minmax_index(mgr->pipe, &mgr->index_buffer, info,
&min_index, &max_index);
index_bounds_valid = true;
}
@@ -1161,3 +1176,13 @@ void u_vbuf_draw_end(struct u_vbuf *mgrb)
u_vbuf_translate_end(mgr);
}
}
+
+static void u_vbuf_install(struct u_vbuf_priv *mgr)
+{
+ struct pipe_context *pipe = mgr->pipe;
+ assert(!pipe->draw);
+
+ pipe->draw = mgr;
+ mgr->driver_set_index_buffer = pipe->set_index_buffer;
+ pipe->set_index_buffer = u_vbuf_set_index_buffer;
+}
diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h
index 3669c9b..4a449fc 100644
--- a/src/gallium/auxiliary/util/u_vbuf.h
+++ b/src/gallium/auxiliary/util/u_vbuf.h
@@ -67,9 +67,6 @@ struct u_vbuf {
struct pipe_vertex_buffer real_vertex_buffer[PIPE_MAX_ATTRIBS];
int nr_real_vertex_buffers;
- /* The index buffer. */
- struct pipe_index_buffer index_buffer;
-
/* This uploader can optionally be used by the driver.
*
* Allowed functions:
@@ -126,9 +123,6 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
unsigned count,
const struct pipe_vertex_buffer *bufs);
-void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
- const struct pipe_index_buffer *ib);
-
enum u_vbuf_return_flags u_vbuf_draw_begin(struct u_vbuf *mgr,
struct pipe_draw_info *info);
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index b679592..de58266 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -579,7 +579,7 @@ struct r300_context {
void *dsa_decompress_zmask;
struct u_vbuf *vbuf_mgr;
- struct pipe_index_buffer swtcl_index_buffer;
+ struct pipe_index_buffer index_buffer;
struct pipe_vertex_buffer swtcl_vertex_buffer[PIPE_MAX_ATTRIBS];
unsigned swtcl_nr_vertex_buffers;
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index 5981bec..49013c0 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -511,7 +511,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
uint8_t *ptr1;
uint16_t *ptr2;
uint32_t *ptr4;
- unsigned index_size = r300->vbuf_mgr->index_buffer.index_size;
+ unsigned index_size = r300->index_buffer.index_size;
unsigned i, count_dwords = index_size == 4 ? info->count :
(info->count + 1) / 2;
CS_LOCALS(r300);
@@ -529,7 +529,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
switch (index_size) {
case 1:
- ptr1 = r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+ ptr1 = r300_resource(r300->index_buffer.buffer)->b.user_ptr;
ptr1 += info->start;
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -553,7 +553,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
break;
case 2:
- ptr2 = (uint16_t*)r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+ ptr2 = (uint16_t*)r300_resource(r300->index_buffer.buffer)->b.user_ptr;
ptr2 += info->start;
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -572,7 +572,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
break;
case 4:
- ptr4 = (uint32_t*)r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+ ptr4 = (uint32_t*)r300_resource(r300->index_buffer.buffer)->b.user_ptr;
ptr4 += info->start;
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -594,8 +594,8 @@ static void r300_draw_elements(struct r300_context *r300,
const struct pipe_draw_info *info,
int instance_id)
{
- struct pipe_resource *indexBuffer = r300->vbuf_mgr->index_buffer.buffer;
- unsigned indexSize = r300->vbuf_mgr->index_buffer.index_size;
+ struct pipe_resource *indexBuffer = r300->index_buffer.buffer;
+ unsigned indexSize = r300->index_buffer.index_size;
struct pipe_resource* orgIndexBuffer = indexBuffer;
unsigned start = info->start;
unsigned count = info->count;
@@ -746,7 +746,7 @@ static void r300_draw_vbo(struct pipe_context* pipe,
struct r300_context* r300 = r300_context(pipe);
struct pipe_draw_info info = *dinfo;
- info.indexed = info.indexed && r300->vbuf_mgr->index_buffer.buffer;
+ info.indexed = info.indexed && r300->index_buffer.buffer;
if (r300->skip_rendering ||
!u_trim_pipe_prim(info.mode, &info.count)) {
@@ -776,11 +776,11 @@ static void r300_draw_vbo(struct pipe_context* pipe,
}
info.max_index = max_count - 1;
- info.start += r300->vbuf_mgr->index_buffer.offset / r300->vbuf_mgr->index_buffer.index_size;
+ info.start += r300->index_buffer.offset / r300->index_buffer.index_size;
if (info.instance_count <= 1) {
if (info.count <= 8 &&
- r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr) {
+ r300_resource(r300->index_buffer.buffer)->b.user_ptr) {
r300_draw_elements_immediate(r300, &info);
} else {
r300_draw_elements(r300, &info, -1);
@@ -818,7 +818,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
struct pipe_transfer *ib_transfer = NULL;
int i;
void *indices = NULL;
- boolean indexed = info->indexed && r300->swtcl_index_buffer.buffer;
+ boolean indexed = info->indexed && r300->index_buffer.buffer;
if (r300->skip_rendering) {
return;
@@ -843,7 +843,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
}
if (indexed) {
- indices = pipe_buffer_map(pipe, r300->swtcl_index_buffer.buffer,
+ indices = pipe_buffer_map(pipe, r300->index_buffer.buffer,
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED, &ib_transfer);
}
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 4101523..5ae37c3 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1618,15 +1618,14 @@ static void r300_set_index_buffer(struct pipe_context* pipe,
{
struct r300_context* r300 = r300_context(pipe);
- if (r300->screen->caps.has_tcl) {
- u_vbuf_set_index_buffer(r300->vbuf_mgr, ib);
+ if (ib) {
+ pipe_resource_reference(&r300->index_buffer.buffer, ib->buffer);
+ memcpy(&r300->index_buffer, ib, sizeof(*ib));
} else {
- if (ib) {
- pipe_resource_reference(&r300->swtcl_index_buffer.buffer, ib->buffer);
- memcpy(&r300->swtcl_index_buffer, ib, sizeof(*ib));
- } else {
- pipe_resource_reference(&r300->swtcl_index_buffer.buffer, NULL);
- }
+ pipe_resource_reference(&r300->index_buffer.buffer, NULL);
+ }
+
+ if (!r300->screen->caps.has_tcl) {
draw_set_index_buffer(r300->draw, ib);
}
}
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index a84f9cc..3c7039a 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -346,6 +346,7 @@ struct r600_context {
void *dummy_pixel_shader;
bool vertex_buffers_dirty;
+ struct pipe_index_buffer index_buffer;
};
static INLINE void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 59336cf..52bdedd 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -385,13 +385,17 @@ void r600_delete_vertex_element(struct pipe_context *ctx, void *state)
FREE(state);
}
-
void r600_set_index_buffer(struct pipe_context *ctx,
const struct pipe_index_buffer *ib)
{
struct r600_context *rctx = (struct r600_context *)ctx;
- u_vbuf_set_index_buffer(rctx->vbuf_mgr, ib);
+ if (ib) {
+ pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
+ memcpy(&rctx->index_buffer, ib, sizeof(*ib));
+ } else {
+ pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
+ }
}
void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
@@ -747,7 +751,7 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo)
uint8_t *ptr;
if ((!info.count && (info.indexed || !info.count_from_stream_output)) ||
- (info.indexed && !rctx->vbuf_mgr->index_buffer.buffer) ||
+ (info.indexed && !rctx->index_buffer.buffer) ||
!r600_conv_pipe_prim(info.mode, &prim)) {
assert(0);
return;
@@ -772,9 +776,9 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo)
if (info.indexed) {
/* Initialize the index buffer struct. */
- pipe_resource_reference(&ib.buffer, rctx->vbuf_mgr->index_buffer.buffer);
- ib.index_size = rctx->vbuf_mgr->index_buffer.index_size;
- ib.offset = rctx->vbuf_mgr->index_buffer.offset + info.start * ib.index_size;
+ pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer);
+ ib.index_size = rctx->index_buffer.index_size;
+ ib.offset = rctx->index_buffer.offset + info.start * ib.index_size;
/* Translate or upload, if needed. */
r600_translate_index_buffer(rctx, &ib, info.count);
--
1.7.5.4
More information about the mesa-dev
mailing list