summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2011-02-07 02:00:56 +0100
committerMarek Olšák <maraeo@gmail.com>2011-02-07 02:46:17 +0100
commitaa8a2224a3df111a1613f0baefebc00883e1b70b (patch)
treee09c1f779a1e22a0e561a5cd039f3bbcac31c5b1
parent975320ab76f5c247f6ed4dab80627173845200d0 (diff)
r600g: use the new vertex buffer manager
-rw-r--r--src/gallium/drivers/r600/r600_asm.c6
-rw-r--r--src/gallium/drivers/r600/r600_blit.c12
-rw-r--r--src/gallium/drivers/r600/r600_buffer.c115
-rw-r--r--src/gallium/drivers/r600/r600_pipe.c26
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h34
-rw-r--r--src/gallium/drivers/r600/r600_resource.h10
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c128
-rw-r--r--src/gallium/drivers/r600/r600_texture.c20
-rw-r--r--src/gallium/drivers/r600/r600_translate.c169
9 files changed, 101 insertions, 419 deletions
diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
index 35a7bc79e04..46d7fc391c6 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -2054,6 +2054,6 @@ int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, stru
unsigned vbuffer_index;
- r600_vertex_data_type(ve->hw_format[i], &format, &num_format, &format_comp);
- desc = util_format_description(ve->hw_format[i]);
+ r600_vertex_data_type(ve->elements[i].src_format, &format, &num_format, &format_comp);
+ desc = util_format_description(ve->elements[i].src_format);
if (desc == NULL) {
- R600_ERR("unknown format %d\n", ve->hw_format[i]);
+ R600_ERR("unknown format %d\n", ve->elements[i].src_format);
r600_bo_reference(rctx->radeon, &ve->fetch_shader, NULL);
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index af471d0d917..fbade99fc54 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -56,3 +56,5 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
}
- util_blitter_save_vertex_buffers(rctx->blitter, rctx->nvertex_buffers, rctx->vertex_buffer);
+ util_blitter_save_vertex_buffers(rctx->blitter,
+ rctx->vbuf_mgr->nr_vertex_buffers,
+ rctx->vbuf_mgr->vertex_buffer);
@@ -90,3 +92,3 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
- surf_tmpl.format = texture->resource.base.b.format;
+ surf_tmpl.format = texture->resource.b.b.b.format;
surf_tmpl.u.tex.level = level;
@@ -96,3 +98,3 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
- zsurf = ctx->create_surface(ctx, &texture->resource.base.b, &surf_tmpl);
+ zsurf = ctx->create_surface(ctx, &texture->resource.b.b.b, &surf_tmpl);
@@ -250,4 +252,4 @@ void r600_blit_push_depth(struct pipe_context *ctx, struct r600_resource_texture
sbox.x = sbox.y = sbox.z = 0;
- sbox.width = texture->resource.base.b.width0;
- sbox.height = texture->resource.base.b.height0;
+ sbox.width = texture->resource.b.b.b.width0;
+ sbox.height = texture->resource.b.b.b.height0;
/* XXX that might be wrong */
diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c
index c3bc6eadda4..0a0e3db854a 100644
--- a/src/gallium/drivers/r600/r600_buffer.c
+++ b/src/gallium/drivers/r600/r600_buffer.c
@@ -68,4 +68,4 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
- if (rbuffer->user_buffer)
- return (uint8_t*)rbuffer->user_buffer + transfer->box.x;
+ if (rbuffer->r.b.user_ptr)
+ return (uint8_t*)rbuffer->r.b.user_ptr + transfer->box.x;
@@ -89,3 +89,3 @@ static void r600_buffer_transfer_unmap(struct pipe_context *pipe,
- if (rbuffer->user_buffer)
+ if (rbuffer->r.b.user_ptr)
return;
@@ -128,10 +128,15 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
rbuffer->magic = R600_BUFFER_MAGIC;
- rbuffer->user_buffer = NULL;
- rbuffer->r.base.b = *templ;
- pipe_reference_init(&rbuffer->r.base.b.reference, 1);
- rbuffer->r.base.b.screen = screen;
- rbuffer->r.base.vtbl = &r600_buffer_vtbl;
- rbuffer->r.size = rbuffer->r.base.b.width0;
+ rbuffer->r.b.b.b = *templ;
+ pipe_reference_init(&rbuffer->r.b.b.b.reference, 1);
+ rbuffer->r.b.b.b.screen = screen;
+ rbuffer->r.b.b.vtbl = &r600_buffer_vtbl;
+ rbuffer->r.b.user_ptr = NULL;
+ rbuffer->r.size = rbuffer->r.b.b.b.width0;
rbuffer->r.bo_size = rbuffer->r.size;
- bo = r600_bo((struct radeon*)screen->winsys, rbuffer->r.base.b.width0, alignment, rbuffer->r.base.b.bind, rbuffer->r.base.b.usage);
+
+ bo = r600_bo((struct radeon*)screen->winsys,
+ rbuffer->r.b.b.b.width0,
+ alignment, rbuffer->r.b.b.b.bind,
+ rbuffer->r.b.b.b.usage);
+
if (bo == NULL) {
@@ -141,3 +146,3 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
rbuffer->r.bo = bo;
- return &rbuffer->r.base.b;
+ return &rbuffer->r.b.b.b;
}
@@ -155,18 +160,18 @@ struct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen,
rbuffer->magic = R600_BUFFER_MAGIC;
- pipe_reference_init(&rbuffer->r.base.b.reference, 1);
- rbuffer->r.base.vtbl = &r600_buffer_vtbl;
- rbuffer->r.base.b.screen = screen;
- rbuffer->r.base.b.target = PIPE_BUFFER;
- rbuffer->r.base.b.format = PIPE_FORMAT_R8_UNORM;
- rbuffer->r.base.b.usage = PIPE_USAGE_IMMUTABLE;
- rbuffer->r.base.b.bind = bind;
- rbuffer->r.base.b.width0 = bytes;
- rbuffer->r.base.b.height0 = 1;
- rbuffer->r.base.b.depth0 = 1;
- rbuffer->r.base.b.array_size = 1;
- rbuffer->r.base.b.flags = 0;
+ pipe_reference_init(&rbuffer->r.b.b.b.reference, 1);
+ rbuffer->r.b.b.vtbl = &r600_buffer_vtbl;
+ rbuffer->r.b.b.b.screen = screen;
+ rbuffer->r.b.b.b.target = PIPE_BUFFER;
+ rbuffer->r.b.b.b.format = PIPE_FORMAT_R8_UNORM;
+ rbuffer->r.b.b.b.usage = PIPE_USAGE_IMMUTABLE;
+ rbuffer->r.b.b.b.bind = bind;
+ rbuffer->r.b.b.b.width0 = bytes;
+ rbuffer->r.b.b.b.height0 = 1;
+ rbuffer->r.b.b.b.depth0 = 1;
+ rbuffer->r.b.b.b.array_size = 1;
+ rbuffer->r.b.b.b.flags = 0;
+ rbuffer->r.b.user_ptr = ptr;
rbuffer->r.bo = NULL;
rbuffer->r.bo_size = 0;
- rbuffer->user_buffer = ptr;
- return &rbuffer->r.base.b;
+ return &rbuffer->r.b.b.b;
}
@@ -191,8 +196,8 @@ struct pipe_resource *r600_buffer_from_handle(struct pipe_screen *screen,
- pipe_reference_init(&rbuffer->base.b.reference, 1);
- rbuffer->base.b.target = PIPE_BUFFER;
- rbuffer->base.b.screen = screen;
- rbuffer->base.vtbl = &r600_buffer_vtbl;
+ pipe_reference_init(&rbuffer->b.b.b.reference, 1);
+ rbuffer->b.b.b.target = PIPE_BUFFER;
+ rbuffer->b.b.b.screen = screen;
+ rbuffer->b.b.vtbl = &r600_buffer_vtbl;
rbuffer->bo = bo;
- return &rbuffer->base.b;
+ return &rbuffer->b.b.b;
}
@@ -204,5 +209,5 @@ void r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl
- u_upload_data(rctx->upload_vb, 0,
+ u_upload_data(rctx->upload_ib, 0,
draw->info.count * draw->index_size,
- rbuffer->user_buffer,
+ rbuffer->r.b.user_ptr,
&draw->index_buffer_offset,
@@ -211,42 +216,2 @@ void r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl
-void r600_upload_user_buffers(struct r600_pipe_context *rctx,
- int min_index, int max_index)
-{
- int i, nr = rctx->vertex_elements->count;
- unsigned count = max_index + 1 - min_index;
- boolean flushed;
- boolean uploaded[32] = {0};
-
- for (i = 0; i < nr; i++) {
- unsigned index = rctx->vertex_elements->elements[i].vertex_buffer_index;
- struct pipe_vertex_buffer *vb = &rctx->vertex_buffer[index];
- struct r600_resource_buffer *userbuf = r600_buffer(vb->buffer);
-
- if (userbuf && userbuf->user_buffer && !uploaded[index]) {
- unsigned first, size;
-
- if (vb->stride) {
- first = vb->stride * min_index;
- size = vb->stride * count;
- } else {
- first = 0;
- size = rctx->vertex_elements->hw_format_size[i];
- }
-
- u_upload_data(rctx->upload_vb, first, size,
- (uint8_t*)userbuf->user_buffer + first,
- &vb->buffer_offset,
- &rctx->real_vertex_buffer[index],
- &flushed);
-
- vb->buffer_offset -= first;
-
- /* vertex_arrays_dirty = TRUE; */
- uploaded[index] = TRUE;
- } else {
- assert(rctx->real_vertex_buffer[index]);
- }
- }
-}
-
void r600_upload_const_buffer(struct r600_pipe_context *rctx, struct r600_resource_buffer **rbuffer,
@@ -254,5 +219,5 @@ void r600_upload_const_buffer(struct r600_pipe_context *rctx, struct r600_resour
{
- if ((*rbuffer)->user_buffer) {
- uint8_t *ptr = (*rbuffer)->user_buffer;
- unsigned size = (*rbuffer)->r.base.b.width0;
+ if ((*rbuffer)->r.b.user_ptr) {
+ uint8_t *ptr = (*rbuffer)->r.b.user_ptr;
+ unsigned size = (*rbuffer)->r.b.b.b.width0;
boolean flushed;
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 1c903a0b4e1..85ad0ee968b 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -78,4 +78,2 @@ static void r600_destroy_context(struct pipe_context *context)
- r600_end_vertex_translate(rctx);
-
r600_context_fini(&rctx->ctx);
@@ -88,7 +86,5 @@ static void r600_destroy_context(struct pipe_context *context)
- u_upload_destroy(rctx->upload_vb);
+ u_upload_destroy(rctx->upload_ib);
u_upload_destroy(rctx->upload_const);
-
- if (rctx->tran.translate_cache)
- translate_cache_destroy(rctx->tran.translate_cache);
+ u_vbuf_mgr_destroy(rctx->vbuf_mgr);
@@ -166,6 +162,12 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
- rctx->upload_vb = u_upload_create(&rctx->context, 1024 * 1024, 16,
- PIPE_BIND_VERTEX_BUFFER |
+ rctx->vbuf_mgr = u_vbuf_mgr_create(&rctx->context, 1024 * 1024, 16,
+ U_VERTEX_FETCH_BYTE_ALIGNED);
+ if (!rctx->vbuf_mgr) {
+ r600_destroy_context(&rctx->context);
+ return NULL;
+ }
+
+ rctx->upload_ib = u_upload_create(&rctx->context, 128 * 1024, 16,
PIPE_BIND_INDEX_BUFFER);
- if (rctx->upload_vb == NULL) {
+ if (rctx->upload_ib == NULL) {
r600_destroy_context(&rctx->context);
@@ -187,8 +189,2 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
- rctx->tran.translate_cache = translate_cache_create();
- if (rctx->tran.translate_cache == NULL) {
- FREE(rctx);
- return NULL;
- }
-
rctx->vs_resource = CALLOC(R600_RESOURCE_ARRAY_SIZE, sizeof(struct r600_pipe_state));
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index d376a777852..e9820a23911 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -32,3 +32,3 @@
#include <util/u_math.h>
-#include "translate/translate_cache.h"
+#include "util/u_vbuf_mgr.h"
#include "r600.h"
@@ -88,5 +88,3 @@ struct r600_vertex_element
struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS];
- enum pipe_format hw_format[PIPE_MAX_ATTRIBS];
- unsigned hw_format_size[PIPE_MAX_ATTRIBS];
- boolean incompatible_layout;
+ struct u_vbuf_mgr_elements *vmgr_elements;
struct r600_bo *fetch_shader;
@@ -119,14 +117,2 @@ struct r600_textures_info {
-/* vertex buffer translation context, used to translate vertex input that
- * hw doesn't natively support, so far only FLOAT64 is unsupported.
- */
-struct r600_translate_context {
- /* Translate cache for incompatible vertex offset/stride/format fallback. */
- struct translate_cache *translate_cache;
- /* The vertex buffer slot containing the translated buffer. */
- unsigned vb_slot;
- void *saved_velems;
- void *new_velems;
-};
-
#define R600_CONSTANT_ARRAY_SIZE 256
@@ -146,6 +132,2 @@ struct r600_pipe_context {
struct pipe_index_buffer index_buffer;
- struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
- struct pipe_resource *real_vertex_buffer[PIPE_MAX_ATTRIBS];
- unsigned nvertex_buffers;
- unsigned nreal_vertex_buffers; /* with the translated vertex buffer */
unsigned cb_target_mask;
@@ -167,7 +149,6 @@ struct r600_pipe_context {
bool flatshade;
- struct u_upload_mgr *upload_vb;
- unsigned any_user_vbs;
struct r600_textures_info ps_samplers;
- unsigned vb_max_index;
- struct r600_translate_context tran;
+
+ struct u_vbuf_mgr *vbuf_mgr;
+ struct u_upload_mgr *upload_ib;
struct u_upload_mgr *upload_const;
@@ -212,4 +193,2 @@ struct pipe_resource *r600_buffer_from_handle(struct pipe_screen *screen,
void r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl *draw);
-void r600_upload_user_buffers(struct r600_pipe_context *rctx,
- int min_index, int max_index);
@@ -252,5 +231,2 @@ unsigned r600_texture_get_offset(struct r600_resource_texture *rtex,
/* r600_translate.c */
-void r600_begin_vertex_translate(struct r600_pipe_context *rctx,
- int min_index, int max_index);
-void r600_end_vertex_translate(struct r600_pipe_context *rctx);
void r600_translate_index_buffer(struct r600_pipe_context *r600,
diff --git a/src/gallium/drivers/r600/r600_resource.h b/src/gallium/drivers/r600/r600_resource.h
index 8afe866c91e..2e7a28cc94f 100644
--- a/src/gallium/drivers/r600/r600_resource.h
+++ b/src/gallium/drivers/r600/r600_resource.h
@@ -26,2 +26,3 @@
#include "util/u_transfer.h"
+#include "util/u_vbuf_mgr.h"
@@ -45,3 +46,3 @@ struct r600_transfer {
struct r600_resource {
- struct u_resource base;
+ struct u_vbuf_resource b;
struct r600_bo *bo;
@@ -70,2 +71,3 @@ struct r600_resource_texture {
+/* XXX this could be removed */
struct r600_resource_buffer {
@@ -73,3 +75,2 @@ struct r600_resource_buffer {
uint32_t magic;
- void *user_buffer;
};
@@ -100,7 +101,2 @@ static INLINE struct r600_resource_buffer *r600_buffer(struct pipe_resource *buf
-static INLINE boolean r600_is_user_buffer(struct pipe_resource *buffer)
-{
- return r600_buffer(buffer)->user_buffer ? TRUE : FALSE;
-}
-
int r600_texture_depth_flush(struct pipe_context *ctx, struct pipe_resource *texture, boolean just_create);
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 3b037f8c8c2..3a959465715 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -125,2 +125,5 @@ void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
if (v) {
+ u_vbuf_mgr_bind_vertex_elements(rctx->vbuf_mgr, state,
+ v->vmgr_elements);
+
rctx->states[v->rstate.id] = &v->rstate;
@@ -142,2 +145,3 @@ void r600_delete_vertex_element(struct pipe_context *ctx, void *state)
r600_bo_reference(rctx->radeon, &v->fetch_shader, NULL);
+ u_vbuf_mgr_destroy_vertex_elements(rctx->vbuf_mgr, v->vmgr_elements);
FREE(state);
@@ -166,14 +170,7 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
- struct pipe_vertex_buffer *vbo;
- unsigned max_index = ~0;
int i;
+ /* Zero states. */
for (i = 0; i < count; i++) {
- vbo = (struct pipe_vertex_buffer*)&buffers[i];
-
- pipe_resource_reference(&rctx->vertex_buffer[i].buffer, vbo->buffer);
- pipe_resource_reference(&rctx->real_vertex_buffer[i], NULL);
-
- if (!vbo->buffer) {
- /* Zero states. */
+ if (!buffers[i].buffer) {
if (rctx->family >= CHIP_CEDAR) {
@@ -183,31 +180,5 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
}
- continue;
- }
-
- if (r600_is_user_buffer(vbo->buffer)) {
- rctx->any_user_vbs = TRUE;
- continue;
- }
-
- pipe_resource_reference(&rctx->real_vertex_buffer[i], vbo->buffer);
-
- /* The stride of zero means we will be fetching only the first
- * vertex, so don't care about max_index. */
- if (!vbo->stride) {
- continue;
- }
-
- /* Update the maximum index. */
- {
- unsigned vbo_max_index =
- (vbo->buffer->width0 - vbo->buffer_offset) / vbo->stride;
- max_index = MIN2(max_index, vbo_max_index);
}
}
-
- for (; i < rctx->nreal_vertex_buffers; i++) {
- pipe_resource_reference(&rctx->vertex_buffer[i].buffer, NULL);
- pipe_resource_reference(&rctx->real_vertex_buffer[i], NULL);
-
- /* Zero states. */
+ for (; i < rctx->vbuf_mgr->nr_real_vertex_buffers; i++) {
if (rctx->family >= CHIP_CEDAR) {
@@ -219,13 +190,5 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
- memcpy(rctx->vertex_buffer, buffers, sizeof(struct pipe_vertex_buffer) * count);
-
- rctx->nvertex_buffers = count;
- rctx->nreal_vertex_buffers = count;
- rctx->vb_max_index = max_index;
+ u_vbuf_mgr_set_vertex_buffers(rctx->vbuf_mgr, count, buffers);
}
-
-#define FORMAT_REPLACE(what, withwhat) \
- case PIPE_FORMAT_##what: *format = PIPE_FORMAT_##withwhat; break
-
void *r600_create_vertex_elements(struct pipe_context *ctx,
@@ -236,4 +199,2 @@ void *r600_create_vertex_elements(struct pipe_context *ctx,
struct r600_vertex_element *v = CALLOC_STRUCT(r600_vertex_element);
- enum pipe_format *format;
- int i;
@@ -244,43 +205,5 @@ void *r600_create_vertex_elements(struct pipe_context *ctx,
v->count = count;
- memcpy(v->elements, elements, count * sizeof(struct pipe_vertex_element));
-
- for (i = 0; i < count; i++) {
- v->hw_format[i] = v->elements[i].src_format;
- format = &v->hw_format[i];
-
- switch (*format) {
- FORMAT_REPLACE(R64_FLOAT, R32_FLOAT);
- FORMAT_REPLACE(R64G64_FLOAT, R32G32_FLOAT);
- FORMAT_REPLACE(R64G64B64_FLOAT, R32G32B32_FLOAT);
- FORMAT_REPLACE(R64G64B64A64_FLOAT, R32G32B32A32_FLOAT);
-
- /* r600 doesn't seem to support 32_*SCALED, these formats
- * aren't in D3D10 either. */
- FORMAT_REPLACE(R32_UNORM, R32_FLOAT);
- FORMAT_REPLACE(R32G32_UNORM, R32G32_FLOAT);
- FORMAT_REPLACE(R32G32B32_UNORM, R32G32B32_FLOAT);
- FORMAT_REPLACE(R32G32B32A32_UNORM, R32G32B32A32_FLOAT);
-
- FORMAT_REPLACE(R32_USCALED, R32_FLOAT);
- FORMAT_REPLACE(R32G32_USCALED, R32G32_FLOAT);
- FORMAT_REPLACE(R32G32B32_USCALED, R32G32B32_FLOAT);
- FORMAT_REPLACE(R32G32B32A32_USCALED,R32G32B32A32_FLOAT);
-
- FORMAT_REPLACE(R32_SNORM, R32_FLOAT);
- FORMAT_REPLACE(R32G32_SNORM, R32G32_FLOAT);
- FORMAT_REPLACE(R32G32B32_SNORM, R32G32B32_FLOAT);
- FORMAT_REPLACE(R32G32B32A32_SNORM, R32G32B32A32_FLOAT);
-
- FORMAT_REPLACE(R32_SSCALED, R32_FLOAT);
- FORMAT_REPLACE(R32G32_SSCALED, R32G32_FLOAT);
- FORMAT_REPLACE(R32G32B32_SSCALED, R32G32B32_FLOAT);
- FORMAT_REPLACE(R32G32B32A32_SSCALED,R32G32B32A32_FLOAT);
- default:;
- }
- v->incompatible_layout =
- v->incompatible_layout ||
- v->elements[i].src_format != v->hw_format[i];
-
- v->hw_format_size[i] = align(util_format_get_blocksize(v->hw_format[i]), 4);
- }
+ v->vmgr_elements =
+ u_vbuf_mgr_create_vertex_elements(rctx->vbuf_mgr, count,
+ elements, v->elements);
@@ -435,3 +358,3 @@ void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
- if (buffer != &rbuffer->r.base.b)
+ if (buffer != &rbuffer->r.b.b.b)
pipe_resource_reference((struct pipe_resource**)&rbuffer, NULL);
@@ -451,3 +374,3 @@ static void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
/* bind vertex buffer once */
- rctx->nvs_resource = rctx->nreal_vertex_buffers;
+ rctx->nvs_resource = rctx->vbuf_mgr->nr_real_vertex_buffers;
}
@@ -463,4 +386,4 @@ static void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
- vertex_buffer = &rctx->vertex_buffer[vbuffer_index];
- rbuffer = (struct r600_resource*)rctx->real_vertex_buffer[vbuffer_index];
+ vertex_buffer = &rctx->vbuf_mgr->vertex_buffer[vbuffer_index];
+ rbuffer = (struct r600_resource*)rctx->vbuf_mgr->real_vertex_buffer[vbuffer_index];
offset = rctx->vertex_elements->vbuffer_offset[i];
@@ -468,4 +391,4 @@ static void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
/* bind vertex buffer once */
- vertex_buffer = &rctx->vertex_buffer[i];
- rbuffer = (struct r600_resource*)rctx->real_vertex_buffer[i];
+ vertex_buffer = &rctx->vbuf_mgr->vertex_buffer[i];
+ rbuffer = (struct r600_resource*)rctx->vbuf_mgr->real_vertex_buffer[i];
offset = 0;
@@ -499,11 +422,3 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
r600_flush_depth_textures(rctx);
-
- if (rctx->vertex_elements->incompatible_layout) {
- r600_begin_vertex_translate(rctx, info->min_index, info->max_index);
- }
-
- if (rctx->any_user_vbs) {
- r600_upload_user_buffers(rctx, info->min_index, info->max_index);
- }
-
+ u_vbuf_mgr_draw_begin(rctx->vbuf_mgr, info, NULL, NULL);
r600_vertex_buffer_update(rctx);
@@ -525,3 +440,3 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
- if (r600_is_user_buffer(draw.index_buffer)) {
+ if (u_vbuf_resource(draw.index_buffer)->user_ptr) {
r600_upload_index_buffer(rctx, &draw);
@@ -609,6 +524,3 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
- /* delete previous translated vertex elements */
- if (rctx->tran.new_velems) {
- r600_end_vertex_translate(rctx);
- }
+ u_vbuf_mgr_draw_end(rctx->vbuf_mgr);
}
diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index 14a289444df..b7bfdd8c166 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -77,3 +77,3 @@ unsigned r600_texture_get_offset(struct r600_resource_texture *rtex,
- switch (rtex->resource.base.b.target) {
+ switch (rtex->resource.b.b.b.target) {
case PIPE_TEXTURE_3D:
@@ -169,3 +169,3 @@ static unsigned r600_texture_get_stride(struct pipe_screen *screen,
{
- struct pipe_resource *ptex = &rtex->resource.base.b;
+ struct pipe_resource *ptex = &rtex->resource.b.b.b;
unsigned width, stride, tile_width;
@@ -190,3 +190,3 @@ static unsigned r600_texture_get_nblocksy(struct pipe_screen *screen,
{
- struct pipe_resource *ptex = &rtex->resource.base.b;
+ struct pipe_resource *ptex = &rtex->resource.b.b.b;
unsigned height, tile_height;
@@ -213,3 +213,3 @@ static void r600_texture_set_array_mode(struct pipe_screen *screen,
{
- struct pipe_resource *ptex = &rtex->resource.base.b;
+ struct pipe_resource *ptex = &rtex->resource.b.b.b;
@@ -244,3 +244,3 @@ static void r600_setup_miptree(struct pipe_screen *screen,
{
- struct pipe_resource *ptex = &rtex->resource.base.b;
+ struct pipe_resource *ptex = &rtex->resource.b.b.b;
struct radeon *radeon = (struct radeon *)screen->winsys;
@@ -374,6 +374,6 @@ r600_texture_create_object(struct pipe_screen *screen,
resource = &rtex->resource;
- resource->base.b = *base;
- resource->base.vtbl = &r600_texture_vtbl;
- pipe_reference_init(&resource->base.b.reference, 1);
- resource->base.b.screen = screen;
+ resource->b.b.b = *base;
+ resource->b.b.vtbl = &r600_texture_vtbl;
+ pipe_reference_init(&resource->b.b.b.reference, 1);
+ resource->b.b.b.screen = screen;
resource->bo = bo;
@@ -391,3 +391,3 @@ r600_texture_create_object(struct pipe_screen *screen,
if (!resource->bo) {
- struct pipe_resource *ptex = &rtex->resource.base.b;
+ struct pipe_resource *ptex = &rtex->resource.b.b.b;
int base_align = r600_get_base_alignment(screen, ptex->format, array_mode);
diff --git a/src/gallium/drivers/r600/r600_translate.c b/src/gallium/drivers/r600/r600_translate.c
index 68429b99d01..a980eac95e0 100644
--- a/src/gallium/drivers/r600/r600_translate.c
+++ b/src/gallium/drivers/r600/r600_translate.c
@@ -25,6 +25,4 @@
-#include "translate/translate_cache.h"
-#include "translate/translate.h"
-#include <pipebuffer/pb_buffer.h>
#include <util/u_index_modify.h>
+#include "util/u_inlines.h"
#include "util/u_upload_mgr.h"
@@ -32,165 +30,2 @@
-void r600_begin_vertex_translate(struct r600_pipe_context *rctx,
- int min_index, int max_index)
-{
- struct pipe_context *pipe = &rctx->context;
- struct translate_key key = {0};
- struct translate_element *te;
- unsigned tr_elem_index[PIPE_MAX_ATTRIBS] = {0};
- struct translate *tr;
- struct r600_vertex_element *ve = rctx->vertex_elements;
- boolean vb_translated[PIPE_MAX_ATTRIBS] = {0};
- uint8_t *vb_map[PIPE_MAX_ATTRIBS] = {0}, *out_map;
- struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS] = {0};
- struct pipe_resource *out_buffer = NULL;
- unsigned i, num_verts, out_offset;
- struct pipe_vertex_element new_velems[PIPE_MAX_ATTRIBS];
- boolean flushed;
-
- /* Initialize the translate key, i.e. the recipe how vertices should be
- * translated. */
- for (i = 0; i < ve->count; i++) {
- enum pipe_format output_format = ve->hw_format[i];
- unsigned output_format_size = ve->hw_format_size[i];
-
- /* Check for support. */
- if (ve->elements[i].src_format == ve->hw_format[i]) {
- continue;
- }
-
- /* Workaround for translate: output floats instead of halfs. */
- switch (output_format) {
- case PIPE_FORMAT_R16_FLOAT:
- output_format = PIPE_FORMAT_R32_FLOAT;
- output_format_size = 4;
- break;
- case PIPE_FORMAT_R16G16_FLOAT:
- output_format = PIPE_FORMAT_R32G32_FLOAT;
- output_format_size = 8;
- break;
- case PIPE_FORMAT_R16G16B16_FLOAT:
- output_format = PIPE_FORMAT_R32G32B32_FLOAT;
- output_format_size = 12;
- break;
- case PIPE_FORMAT_R16G16B16A16_FLOAT:
- output_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
- output_format_size = 16;
- break;
- default:;
- }
-
- /* Add this vertex element. */
- te = &key.element[key.nr_elements];
- /*te->type;
- te->instance_divisor;*/
- te->input_buffer = ve->elements[i].vertex_buffer_index;
- te->input_format = ve->elements[i].src_format;
- te->input_offset = ve->elements[i].src_offset;
- te->output_format = output_format;
- te->output_offset = key.output_stride;
-
- key.output_stride += output_format_size;
- vb_translated[ve->elements[i].vertex_buffer_index] = TRUE;
- tr_elem_index[i] = key.nr_elements;
- key.nr_elements++;
- }
-
- /* Get a translate object. */
- tr = translate_cache_find(rctx->tran.translate_cache, &key);
-
- /* Map buffers we want to translate. */
- for (i = 0; i < rctx->nvertex_buffers; i++) {
- if (vb_translated[i]) {
- struct pipe_vertex_buffer *vb = &rctx->vertex_buffer[i];
-
- vb_map[i] = pipe_buffer_map(pipe, vb->buffer,
- PIPE_TRANSFER_READ, &vb_transfer[i]);
-
- tr->set_buffer(tr, i,
- vb_map[i] + vb->buffer_offset + vb->stride * min_index,
- vb->stride, ~0);
- }
- }
-
- /* Create and map the output buffer. */
- num_verts = max_index + 1 - min_index;
-
- u_upload_alloc(rctx->upload_vb,
- key.output_stride * min_index,
- key.output_stride * num_verts,
- &out_offset, &out_buffer, &flushed,
- (void**)&out_map);
-
- out_offset -= key.output_stride * min_index;
-
- /* Translate. */
- tr->run(tr, 0, num_verts, 0, out_map);
-
- /* Unmap all buffers. */
- for (i = 0; i < rctx->nvertex_buffers; i++) {
- if (vb_translated[i]) {
- pipe_buffer_unmap(pipe, vb_transfer[i]);
- }
- }
-
- /* Find the first free slot. */
- rctx->tran.vb_slot = ~0;
- for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
- if (!rctx->vertex_buffer[i].buffer) {
- rctx->tran.vb_slot = i;
-
- if (i >= rctx->nvertex_buffers) {
- rctx->nreal_vertex_buffers = i+1;
- }
- break;
- }
- }
-
- if (rctx->tran.vb_slot != ~0) {
- /* Setup the new vertex buffer. */
- pipe_resource_reference(&rctx->real_vertex_buffer[rctx->tran.vb_slot], out_buffer);
- rctx->vertex_buffer[rctx->tran.vb_slot].buffer_offset = out_offset;
- rctx->vertex_buffer[rctx->tran.vb_slot].stride = key.output_stride;
-
- /* Setup new vertex elements. */
- for (i = 0; i < ve->count; i++) {
- if (vb_translated[ve->elements[i].vertex_buffer_index]) {
- te = &key.element[tr_elem_index[i]];
- new_velems[i].instance_divisor = ve->elements[i].instance_divisor;
- new_velems[i].src_format = te->output_format;
- new_velems[i].src_offset = te->output_offset;
- new_velems[i].vertex_buffer_index = rctx->tran.vb_slot;
- } else {
- memcpy(&new_velems[i], &ve->elements[i],
- sizeof(struct pipe_vertex_element));
- }
- }
-
- rctx->tran.saved_velems = rctx->vertex_elements;
- rctx->tran.new_velems =
- pipe->create_vertex_elements_state(pipe, ve->count, new_velems);
- pipe->bind_vertex_elements_state(pipe, rctx->tran.new_velems);
- }
-
- pipe_resource_reference(&out_buffer, NULL);
-}
-
-void r600_end_vertex_translate(struct r600_pipe_context *rctx)
-{
- struct pipe_context *pipe = &rctx->context;
-
- if (rctx->tran.new_velems == NULL) {
- return;
- }
-
- /* Restore vertex elements. */
- pipe->bind_vertex_elements_state(pipe, rctx->tran.saved_velems);
- rctx->tran.saved_velems = NULL;
- pipe->delete_vertex_elements_state(pipe, rctx->tran.new_velems);
- rctx->tran.new_velems = NULL;
-
- /* Delete the now-unused VBO. */
- pipe_resource_reference(&rctx->real_vertex_buffer[rctx->tran.vb_slot], NULL);
- rctx->nreal_vertex_buffers = rctx->nvertex_buffers;
-}
@@ -208,3 +43,3 @@ void r600_translate_index_buffer(struct r600_pipe_context *r600,
case 1:
- u_upload_alloc(r600->upload_vb, 0, count * 2,
+ u_upload_alloc(r600->upload_ib, 0, count * 2,
&out_offset, &out_buffer, &flushed, &ptr);