diff --git a/src/gallium/auxiliary/util/u_draw_quad.c b/src/gallium/auxiliary/util/u_draw_quad.c index b4063183a8c..619f4e6b6ec 100644 --- a/src/gallium/auxiliary/util/u_draw_quad.c +++ b/src/gallium/auxiliary/util/u_draw_quad.c @@ -89,3 +89,21 @@ util_draw_user_vertex_buffer(struct cso_context *cso, void *buffer, cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_draw_arrays(cso, prim_type, 0, num_verts); } + +/** + * Draw a user vertex buffer. This is the correct way. + * util_draw_user_vertex_buffer doesn't work with u_vbuf anymore. + */ +void +util_draw_user_vertices(struct cso_context *cso, struct cso_velems_state *ve, + void *buffer, enum mesa_prim prim_type, + unsigned num_verts) +{ + struct pipe_vertex_buffer vbuffer = {0}; + + vbuffer.is_user_buffer = true; + vbuffer.buffer.user = buffer; + + cso_set_vertex_buffers_and_elements(cso, ve, 1, 0, false, true, &vbuffer); + cso_draw_arrays(cso, prim_type, 0, num_verts); +} diff --git a/src/gallium/auxiliary/util/u_draw_quad.h b/src/gallium/auxiliary/util/u_draw_quad.h index bb814d68b2a..c79bf40a3e3 100644 --- a/src/gallium/auxiliary/util/u_draw_quad.h +++ b/src/gallium/auxiliary/util/u_draw_quad.h @@ -40,6 +40,7 @@ extern "C" { struct pipe_resource; struct cso_context; +struct cso_velems_state; extern void util_draw_vertex_buffer(struct pipe_context *pipe, struct cso_context *cso, @@ -52,6 +53,11 @@ util_draw_user_vertex_buffer(struct cso_context *cso, void *buffer, enum mesa_prim prim_type, unsigned num_verts, unsigned num_attribs); +void +util_draw_user_vertices(struct cso_context *cso, struct cso_velems_state *ve, + void *buffer, enum mesa_prim prim_type, + unsigned num_verts); + #ifdef __cplusplus } #endif diff --git a/src/gallium/auxiliary/util/u_tests.c b/src/gallium/auxiliary/util/u_tests.c index 351e1fd9643..56a1a228949 100644 --- a/src/gallium/auxiliary/util/u_tests.c +++ b/src/gallium/auxiliary/util/u_tests.c @@ -134,8 +134,8 @@ util_set_max_viewport(struct cso_context *cso, struct pipe_resource *tex) cso_set_viewport(cso, &viewport); } -static void -util_set_interleaved_vertex_elements(struct cso_context *cso, +static struct cso_velems_state +util_get_interleaved_vertex_elements(struct cso_context *cso, unsigned num_elements) { struct cso_velems_state velem; @@ -149,7 +149,7 @@ util_set_interleaved_vertex_elements(struct cso_context *cso, velem.velems[i].src_stride = num_elements * 4 * sizeof(float); } - cso_set_vertex_elements(cso, &velem); + return velem; } static void * @@ -194,8 +194,9 @@ util_draw_fullscreen_quad(struct cso_context *cso) 1, 1, 0, 1, 1, 1, 0, 0, 1, -1, 0, 1, 1, 0, 0, 0 }; - util_set_interleaved_vertex_elements(cso, 2); - util_draw_user_vertex_buffer(cso, vertices, MESA_PRIM_QUADS, 4, 2); + struct cso_velems_state ve = util_get_interleaved_vertex_elements(cso, 2); + + util_draw_user_vertices(cso, &ve, vertices, MESA_PRIM_QUADS, 4); } static void @@ -208,8 +209,9 @@ util_draw_fullscreen_quad_fill(struct cso_context *cso, 1, 1, 0, 1, r, g, b, a, 1, -1, 0, 1, r, g, b, a, }; - util_set_interleaved_vertex_elements(cso, 2); - util_draw_user_vertex_buffer(cso, vertices, MESA_PRIM_QUADS, 4, 2); + struct cso_velems_state ve = util_get_interleaved_vertex_elements(cso, 2); + + util_draw_user_vertices(cso, &ve, vertices, MESA_PRIM_QUADS, 4); } /** @@ -349,8 +351,9 @@ tgsi_vs_window_space_position(struct pipe_context *ctx) 256, 256, 0, 0, 1, 0, 0, 1, 256, 0, 0, 0, 1, 0, 0, 1, }; - util_set_interleaved_vertex_elements(cso, 2); - util_draw_user_vertex_buffer(cso, vertices, MESA_PRIM_QUADS, 4, 2); + struct cso_velems_state ve = util_get_interleaved_vertex_elements(cso, 2); + + util_draw_user_vertices(cso, &ve, vertices, MESA_PRIM_QUADS, 4); } /* Probe pixels. */