summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Gawin <filip.gawin@collabora.com>2023-09-12 11:54:27 +0200
committerMarge Bot <emma+marge@anholt.net>2023-09-19 06:36:44 +0000
commit6e9bd8a0995982113e3a94280acdf4beb869b89d (patch)
tree7e52a1a836c2870d79dd6772fafba9f47ceb62a3
parentc4a53646c57aa94dc7b3e95c6b27367bad8a5b82 (diff)
vrend/decode: refactor parameters check in create_vertex_elements
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1232>
-rw-r--r--src/vrend_decode.c3
-rw-r--r--src/vrend_renderer.c3
-rw-r--r--tests/test_virgl_cmd.c40
3 files changed, 43 insertions, 3 deletions
diff --git a/src/vrend_decode.c b/src/vrend_decode.c
index 5d1a21e..5073d32 100644
--- a/src/vrend_decode.c
+++ b/src/vrend_decode.c
@@ -727,6 +727,9 @@ static int vrend_decode_create_ve(struct vrend_context *ctx, const uint32_t *buf
num_elements = (length - 1) / 4;
+ if (num_elements > PIPE_MAX_ATTRIBS)
+ return EINVAL;
+
if (num_elements) {
ve = calloc(num_elements, sizeof(struct pipe_vertex_element));
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 8e325f0..3959394 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -3265,9 +3265,6 @@ int vrend_create_vertex_elements_state(struct vrend_context *ctx,
uint i;
uint32_t ret_handle;
- if (num_elements > PIPE_MAX_ATTRIBS)
- return EINVAL;
-
v = CALLOC_STRUCT(vrend_vertex_element_array);
if (!v)
return ENOMEM;
diff --git a/tests/test_virgl_cmd.c b/tests/test_virgl_cmd.c
index 88fdeea..8f152cf 100644
--- a/tests/test_virgl_cmd.c
+++ b/tests/test_virgl_cmd.c
@@ -1308,6 +1308,44 @@ START_TEST(virgl_test_create_surface_fail_format)
}
END_TEST
+static void test_vertex_elements(int ve_num, int expected_error)
+{
+ struct virgl_context ctx;
+ struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS+1];
+
+ int ret;
+
+ ret = testvirgl_init_ctx_cmdbuf(&ctx);
+ ck_assert_int_eq(ret, 0);
+
+ /* create vertex elements */
+ memset(ve, 0, sizeof(ve));
+
+ for (int i = 0; i < ve_num;i++) {
+ ve[i].src_offset = sizeof(float[4])* i;
+ ve[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+ }
+
+ virgl_encoder_create_vertex_elements(&ctx, 2000, ve_num, ve);
+
+ ret = testvirgl_ctx_send_cmdbuf(&ctx);
+ ck_assert_int_eq(ret, expected_error);
+
+ testvirgl_fini_ctx_cmdbuf(&ctx);
+}
+
+START_TEST(virgl_test_create_vertex_elements_pass)
+{
+ test_vertex_elements(PIPE_MAX_ATTRIBS, 0);
+}
+END_TEST
+
+START_TEST(virgl_test_create_vertex_elements_fail)
+{
+ test_vertex_elements(PIPE_MAX_ATTRIBS + 1, EINVAL);
+}
+END_TEST
+
static Suite *virgl_init_suite(void)
{
Suite *s;
@@ -1329,6 +1367,8 @@ static Suite *virgl_init_suite(void)
tcase_add_test(tc_core, virgl_test_encode_sampler_view);
tcase_add_test(tc_core, virgl_test_create_surface_pass);
tcase_add_test(tc_core, virgl_test_create_surface_fail_format);
+ tcase_add_test(tc_core, virgl_test_create_vertex_elements_pass);
+ tcase_add_test(tc_core, virgl_test_create_vertex_elements_fail);
suite_add_tcase(s, tc_core);
return s;