summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Gawin <filip.gawin@collabora.com>2023-09-20 12:21:54 +0200
committerFilip Gawin <filip.gawin@collabora.com>2023-09-20 12:41:58 +0200
commit6d80b10699404592017873738cb9d3bcd2b2c0de (patch)
tree0a2e3b28898ced987f9f72bdf44aed2a8bd93e67
parentdbf3e088088c3eb09d173572d531638811f3dd21 (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.c4
-rw-r--r--src/vrend_renderer.c3
-rw-r--r--tests/test_virgl_cmd.c46
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;