u_vbuf_mgr: make u_vbuf_mgr_draw_begin return flags in a bitmask
This commit is contained in:
@@ -152,9 +152,9 @@ void u_vbuf_mgr_destroy(struct u_vbuf_mgr *mgrb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr,
|
static enum u_vbuf_return_flags
|
||||||
int min_index, int max_index,
|
u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr,
|
||||||
boolean *upload_flushed)
|
int min_index, int max_index)
|
||||||
{
|
{
|
||||||
struct translate_key key;
|
struct translate_key key;
|
||||||
struct translate_element *te;
|
struct translate_element *te;
|
||||||
@@ -166,6 +166,7 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr,
|
|||||||
struct pipe_resource *out_buffer = NULL;
|
struct pipe_resource *out_buffer = NULL;
|
||||||
unsigned i, num_verts, out_offset;
|
unsigned i, num_verts, out_offset;
|
||||||
struct pipe_vertex_element new_velems[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_element new_velems[PIPE_MAX_ATTRIBS];
|
||||||
|
boolean upload_flushed = FALSE;
|
||||||
|
|
||||||
memset(&key, 0, sizeof(key));
|
memset(&key, 0, sizeof(key));
|
||||||
memset(tr_elem_index, 0xff, sizeof(tr_elem_index));
|
memset(tr_elem_index, 0xff, sizeof(tr_elem_index));
|
||||||
@@ -248,7 +249,7 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr,
|
|||||||
u_upload_alloc(mgr->b.uploader,
|
u_upload_alloc(mgr->b.uploader,
|
||||||
key.output_stride * min_index,
|
key.output_stride * min_index,
|
||||||
key.output_stride * num_verts,
|
key.output_stride * num_verts,
|
||||||
&out_offset, &out_buffer, upload_flushed,
|
&out_offset, &out_buffer, &upload_flushed,
|
||||||
(void**)&out_map);
|
(void**)&out_map);
|
||||||
|
|
||||||
out_offset -= key.output_stride * min_index;
|
out_offset -= key.output_stride * min_index;
|
||||||
@@ -308,6 +309,8 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pipe_resource_reference(&out_buffer, NULL);
|
pipe_resource_reference(&out_buffer, NULL);
|
||||||
|
|
||||||
|
return upload_flushed ? U_VBUF_UPLOAD_FLUSHED : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void u_vbuf_translate_end(struct u_vbuf_mgr_priv *mgr)
|
static void u_vbuf_translate_end(struct u_vbuf_mgr_priv *mgr)
|
||||||
@@ -510,14 +513,15 @@ void u_vbuf_mgr_set_vertex_buffers(struct u_vbuf_mgr *mgrb,
|
|||||||
mgr->b.nr_real_vertex_buffers = count;
|
mgr->b.nr_real_vertex_buffers = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void u_vbuf_upload_buffers(struct u_vbuf_mgr_priv *mgr,
|
static enum u_vbuf_return_flags
|
||||||
int min_index, int max_index,
|
u_vbuf_upload_buffers(struct u_vbuf_mgr_priv *mgr,
|
||||||
unsigned instance_count,
|
int min_index, int max_index,
|
||||||
boolean *upload_flushed)
|
unsigned instance_count)
|
||||||
{
|
{
|
||||||
unsigned i, nr = mgr->ve->count;
|
unsigned i, nr = mgr->ve->count;
|
||||||
unsigned count = max_index + 1 - min_index;
|
unsigned count = max_index + 1 - min_index;
|
||||||
boolean uploaded[PIPE_MAX_ATTRIBS] = {0};
|
boolean uploaded[PIPE_MAX_ATTRIBS] = {0};
|
||||||
|
enum u_vbuf_return_flags retval = 0;
|
||||||
|
|
||||||
for (i = 0; i < nr; i++) {
|
for (i = 0; i < nr; i++) {
|
||||||
unsigned index = mgr->ve->ve[i].vertex_buffer_index;
|
unsigned index = mgr->ve->ve[i].vertex_buffer_index;
|
||||||
@@ -556,11 +560,14 @@ static void u_vbuf_upload_buffers(struct u_vbuf_mgr_priv *mgr,
|
|||||||
vb->buffer_offset -= first;
|
vb->buffer_offset -= first;
|
||||||
|
|
||||||
uploaded[index] = TRUE;
|
uploaded[index] = TRUE;
|
||||||
*upload_flushed = *upload_flushed || flushed;
|
if (flushed)
|
||||||
|
retval |= U_VBUF_UPLOAD_FLUSHED;
|
||||||
} else {
|
} else {
|
||||||
assert(mgr->b.real_vertex_buffer[index]);
|
assert(mgr->b.real_vertex_buffer[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void u_vbuf_mgr_compute_max_index(struct u_vbuf_mgr_priv *mgr)
|
static void u_vbuf_mgr_compute_max_index(struct u_vbuf_mgr_priv *mgr)
|
||||||
@@ -602,14 +609,13 @@ static void u_vbuf_mgr_compute_max_index(struct u_vbuf_mgr_priv *mgr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgrb,
|
enum u_vbuf_return_flags
|
||||||
const struct pipe_draw_info *info,
|
u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgrb,
|
||||||
boolean *buffers_updated,
|
const struct pipe_draw_info *info)
|
||||||
boolean *uploader_flushed)
|
|
||||||
{
|
{
|
||||||
struct u_vbuf_mgr_priv *mgr = (struct u_vbuf_mgr_priv*)mgrb;
|
struct u_vbuf_mgr_priv *mgr = (struct u_vbuf_mgr_priv*)mgrb;
|
||||||
boolean bufs_updated = FALSE, upload_flushed = FALSE;
|
|
||||||
int min_index, max_index;
|
int min_index, max_index;
|
||||||
|
enum u_vbuf_return_flags retval = 0;
|
||||||
|
|
||||||
u_vbuf_mgr_compute_max_index(mgr);
|
u_vbuf_mgr_compute_max_index(mgr);
|
||||||
|
|
||||||
@@ -622,27 +628,20 @@ void u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgrb,
|
|||||||
|
|
||||||
/* Translate vertices with non-native layouts or formats. */
|
/* Translate vertices with non-native layouts or formats. */
|
||||||
if (mgr->incompatible_vb_layout || mgr->ve->incompatible_layout) {
|
if (mgr->incompatible_vb_layout || mgr->ve->incompatible_layout) {
|
||||||
u_vbuf_translate_begin(mgr, min_index, max_index, &upload_flushed);
|
retval |= u_vbuf_translate_begin(mgr, min_index, max_index);
|
||||||
|
|
||||||
if (mgr->fallback_ve) {
|
if (mgr->fallback_ve) {
|
||||||
bufs_updated = TRUE;
|
retval |= U_VBUF_BUFFERS_UPDATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Upload user buffers. */
|
/* Upload user buffers. */
|
||||||
if (mgr->any_user_vbs) {
|
if (mgr->any_user_vbs) {
|
||||||
u_vbuf_upload_buffers(mgr, min_index, max_index, info->instance_count,
|
retval |= u_vbuf_upload_buffers(mgr, min_index, max_index,
|
||||||
&upload_flushed);
|
info->instance_count);
|
||||||
bufs_updated = TRUE;
|
retval |= U_VBUF_BUFFERS_UPDATED;
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the return values. */
|
|
||||||
if (buffers_updated) {
|
|
||||||
*buffers_updated = bufs_updated;
|
|
||||||
}
|
|
||||||
if (uploader_flushed) {
|
|
||||||
*uploader_flushed = upload_flushed;
|
|
||||||
}
|
}
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void u_vbuf_mgr_draw_end(struct u_vbuf_mgr *mgrb)
|
void u_vbuf_mgr_draw_end(struct u_vbuf_mgr *mgrb)
|
||||||
|
@@ -78,6 +78,11 @@ enum u_fetch_alignment {
|
|||||||
U_VERTEX_FETCH_DWORD_ALIGNED
|
U_VERTEX_FETCH_DWORD_ALIGNED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum u_vbuf_return_flags {
|
||||||
|
U_VBUF_BUFFERS_UPDATED = 1,
|
||||||
|
U_VBUF_UPLOAD_FLUSHED = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct u_vbuf_mgr *
|
struct u_vbuf_mgr *
|
||||||
u_vbuf_mgr_create(struct pipe_context *pipe,
|
u_vbuf_mgr_create(struct pipe_context *pipe,
|
||||||
@@ -105,10 +110,9 @@ void u_vbuf_mgr_set_vertex_buffers(struct u_vbuf_mgr *mgr,
|
|||||||
unsigned count,
|
unsigned count,
|
||||||
const struct pipe_vertex_buffer *bufs);
|
const struct pipe_vertex_buffer *bufs);
|
||||||
|
|
||||||
void u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgr,
|
enum u_vbuf_return_flags
|
||||||
const struct pipe_draw_info *info,
|
u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgr,
|
||||||
boolean *buffers_updated,
|
const struct pipe_draw_info *info);
|
||||||
boolean *uploader_flushed);
|
|
||||||
|
|
||||||
void u_vbuf_mgr_draw_end(struct u_vbuf_mgr *mgr);
|
void u_vbuf_mgr_draw_end(struct u_vbuf_mgr *mgr);
|
||||||
|
|
||||||
|
@@ -768,7 +768,6 @@ static void r300_draw_vbo(struct pipe_context* pipe,
|
|||||||
{
|
{
|
||||||
struct r300_context* r300 = r300_context(pipe);
|
struct r300_context* r300 = r300_context(pipe);
|
||||||
struct pipe_draw_info info = *dinfo;
|
struct pipe_draw_info info = *dinfo;
|
||||||
boolean buffers_updated, uploader_flushed;
|
|
||||||
|
|
||||||
info.indexed = info.indexed && r300->index_buffer.buffer;
|
info.indexed = info.indexed && r300->index_buffer.buffer;
|
||||||
|
|
||||||
@@ -780,9 +779,7 @@ static void r300_draw_vbo(struct pipe_context* pipe,
|
|||||||
r300_update_derived_state(r300);
|
r300_update_derived_state(r300);
|
||||||
|
|
||||||
/* Start the vbuf manager and update buffers if needed. */
|
/* Start the vbuf manager and update buffers if needed. */
|
||||||
u_vbuf_mgr_draw_begin(r300->vbuf_mgr, &info,
|
if (u_vbuf_mgr_draw_begin(r300->vbuf_mgr, &info) & U_VBUF_BUFFERS_UPDATED) {
|
||||||
&buffers_updated, &uploader_flushed);
|
|
||||||
if (buffers_updated) {
|
|
||||||
r300->vertex_arrays_dirty = TRUE;
|
r300->vertex_arrays_dirty = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -543,7 +543,7 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
|||||||
if (rctx->have_depth_fb || rctx->have_depth_texture)
|
if (rctx->have_depth_fb || rctx->have_depth_texture)
|
||||||
r600_flush_depth_textures(rctx);
|
r600_flush_depth_textures(rctx);
|
||||||
}
|
}
|
||||||
u_vbuf_mgr_draw_begin(rctx->vbuf_mgr, info, NULL, NULL);
|
u_vbuf_mgr_draw_begin(rctx->vbuf_mgr, info);
|
||||||
r600_vertex_buffer_update(rctx);
|
r600_vertex_buffer_update(rctx);
|
||||||
|
|
||||||
draw.info = *info;
|
draw.info = *info;
|
||||||
|
Reference in New Issue
Block a user