diff options
author | Filip Gawin <filip.gawin@collabora.com> | 2023-09-20 12:21:54 +0200 |
---|---|---|
committer | Filip Gawin <filip.gawin@collabora.com> | 2023-09-20 12:41:58 +0200 |
commit | 6d80b10699404592017873738cb9d3bcd2b2c0de (patch) | |
tree | 0a2e3b28898ced987f9f72bdf44aed2a8bd93e67 | |
parent | dbf3e088088c3eb09d173572d531638811f3dd21 (diff) |
vrend/decode: refactor parameters check in create_shader
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1243>
-rw-r--r-- | src/vrend_decode.c | 4 | ||||
-rw-r--r-- | src/vrend_renderer.c | 3 | ||||
-rw-r--r-- | tests/test_virgl_cmd.c | 46 |
3 files changed, 50 insertions, 3 deletions
diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 5073d32..4a4ef44 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -80,6 +80,10 @@ static int vrend_decode_create_shader(struct vrend_context *ctx, return EINVAL; type = get_buf_entry(buf, VIRGL_OBJ_SHADER_TYPE); + + if (type >= PIPE_SHADER_TYPES) + return EINVAL; + num_tokens = get_buf_entry(buf, VIRGL_OBJ_SHADER_NUM_TOKENS); offlen = get_buf_entry(buf, VIRGL_OBJ_SHADER_OFFSET); diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 3959394..f421316 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -4361,9 +4361,6 @@ int vrend_create_shader(struct vrend_context *ctx, bool finished = false; int ret; - if (type > PIPE_SHADER_COMPUTE) - return EINVAL; - if (type == PIPE_SHADER_GEOMETRY && !has_feature(feat_geometry_shader)) return EINVAL; diff --git a/tests/test_virgl_cmd.c b/tests/test_virgl_cmd.c index 8f152cf..d46fc42 100644 --- a/tests/test_virgl_cmd.c +++ b/tests/test_virgl_cmd.c @@ -1346,6 +1346,50 @@ START_TEST(virgl_test_create_vertex_elements_fail) } END_TEST +static void test_create_shader(enum pipe_shader_type type, int expected_error) +{ + struct virgl_context ctx; + + int ret; + + ret = testvirgl_init_ctx_cmdbuf(&ctx); + ck_assert_int_eq(ret, 0); + + struct pipe_shader_state vs; + const char *text = + "VERT\n" + "DCL IN[0]\n" + "DCL IN[1]\n" + "DCL OUT[0], POSITION\n" + "DCL OUT[1], COLOR\n" + " 0: MOV OUT[1], IN[1]\n" + " 1: MOV OUT[0], IN[0]\n" + " 2: END\n"; + memset(&vs, 0, sizeof(vs)); + vs.stream_output.num_outputs = 1; + vs.stream_output.stride[0] = 4; + vs.stream_output.output[0].num_components = 4; + virgl_encode_shader_state(&ctx, 2000, type, + &vs, text); + + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, expected_error); + + testvirgl_fini_ctx_cmdbuf(&ctx); +} + +START_TEST(virgl_test_create_shader_pass) +{ + test_create_shader(PIPE_SHADER_VERTEX, 0); +} +END_TEST + +START_TEST(virgl_test_create_shader_fail) +{ + test_create_shader(PIPE_SHADER_TYPES, EINVAL); +} +END_TEST + static Suite *virgl_init_suite(void) { Suite *s; @@ -1369,6 +1413,8 @@ static Suite *virgl_init_suite(void) 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); + tcase_add_test(tc_core, virgl_test_create_shader_pass); + tcase_add_test(tc_core, virgl_test_create_shader_fail); suite_add_tcase(s, tc_core); return s; |