diff options
author | Filip Gawin <filip.gawin@collabora.com> | 2023-09-07 13:38:24 +0200 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-09-08 15:12:42 +0000 |
commit | 8019cc5e4d4e5e5c53ad4a6cd927b35ecd3df1f0 (patch) | |
tree | ebc69db0d31f369d12736856b0cf178a4a9ee7ce | |
parent | 61d667766c3a77f89912036d76793695e7703ce5 (diff) |
vrend/decode: refactor and test of create_sampler_view
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1222>
-rw-r--r-- | src/vrend_decode.c | 34 | ||||
-rw-r--r-- | src/vrend_renderer.c | 26 | ||||
-rw-r--r-- | src/vrend_renderer.h | 8 | ||||
-rw-r--r-- | tests/test_virgl_cmd.c | 64 |
4 files changed, 97 insertions, 35 deletions
diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 2dd7aba..ab056c9 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -635,17 +635,35 @@ static int vrend_decode_create_msaa_surface(struct vrend_context *ctx, const uin static int vrend_decode_create_sampler_view(struct vrend_context *ctx, const uint32_t *buf, uint32_t handle, uint16_t length) { - uint32_t res_handle, format, val0, val1, swizzle_packed; - if (length != VIRGL_OBJ_SAMPLER_VIEW_SIZE) return EINVAL; - res_handle = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_RES_HANDLE); - format = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_FORMAT); - val0 = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_BUFFER_FIRST_ELEMENT); - val1 = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_BUFFER_LAST_ELEMENT); - swizzle_packed = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_SWIZZLE); - return vrend_create_sampler_view(ctx, handle, res_handle, format, val0, val1,swizzle_packed); + uint32_t res_handle = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_RES_HANDLE); + uint32_t format_data = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_FORMAT); + + enum virgl_formats format = format_data & 0xffffff; + if (!format || format >= VIRGL_FORMAT_MAX) { + vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_FORMAT, format_data); + return EINVAL; + } + + enum pipe_texture_target pipe_target = (format_data >> 24) & 0xff; + if (pipe_target >= PIPE_MAX_TEXTURE_TYPES) { + vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_SAMPLER_VIEW_TARGET, + format_data); + return EINVAL; + } + + struct vrend_resource *res = vrend_renderer_ctx_res_lookup(ctx, res_handle); + if (!res) { + vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_RESOURCE, res_handle); + return EINVAL; + } + + uint32_t val0 = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_BUFFER_FIRST_ELEMENT); + uint32_t val1 = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_BUFFER_LAST_ELEMENT); + uint32_t swizzle_packed = get_buf_entry(buf, VIRGL_OBJ_SAMPLER_VIEW_SWIZZLE); + return vrend_create_sampler_view(ctx, handle, res, format, pipe_target, val0, val1,swizzle_packed); } static int vrend_decode_create_sampler_state(struct vrend_context *ctx, const uint32_t *buf, uint32_t handle, uint16_t length) diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index ef95062..4f2876d 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -2601,40 +2601,20 @@ static inline GLenum to_gl_swizzle(enum pipe_swizzle swizzle) int vrend_create_sampler_view(struct vrend_context *ctx, uint32_t handle, - uint32_t res_handle, uint32_t format, + struct vrend_resource *res, + enum virgl_formats format, enum pipe_texture_target pipe_target, uint32_t val0, uint32_t val1, uint32_t swizzle_packed) { struct vrend_sampler_view *view; - struct vrend_resource *res; int ret_handle; enum pipe_swizzle swizzle[4]; - res = vrend_renderer_ctx_res_lookup(ctx, res_handle); - if (!res) { - vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_RESOURCE, res_handle); - return EINVAL; - } - view = CALLOC_STRUCT(vrend_sampler_view); if (!view) return ENOMEM; pipe_reference_init(&view->reference, 1); - view->format = format & 0xffffff; - - if (!view->format || view->format >= VIRGL_FORMAT_MAX) { - vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_FORMAT, view->format); - FREE(view); - return EINVAL; - } - - uint32_t pipe_target = (format >> 24) & 0xff; - if (pipe_target >= PIPE_MAX_TEXTURE_TYPES) { - vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_SAMPLER_VIEW_TARGET, - view->format); - FREE(view); - return EINVAL; - } + view->format = format; view->target = tgsitargettogltarget(pipe_target, res->base.nr_samples); diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index b6a947c..c98b72d 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -236,10 +236,10 @@ int vrend_create_surface(struct vrend_context *ctx, uint32_t res_handle, uint32_t format, uint32_t val0, uint32_t val1, uint32_t nr_samples); -int vrend_create_sampler_view(struct vrend_context *ctx, - uint32_t handle, - uint32_t res_handle, uint32_t format, - uint32_t val0, uint32_t val1, uint32_t swizzle_packed); +int vrend_create_sampler_view(struct vrend_context *ctx, uint32_t handle, + struct vrend_resource *res, enum virgl_formats format, + enum pipe_texture_target pipe_target, uint32_t val0, uint32_t val1, + uint32_t swizzle_packed); int vrend_create_sampler_state(struct vrend_context *ctx, uint32_t handle, diff --git a/tests/test_virgl_cmd.c b/tests/test_virgl_cmd.c index 5d8b6e5..7971f88 100644 --- a/tests/test_virgl_cmd.c +++ b/tests/test_virgl_cmd.c @@ -1195,6 +1195,69 @@ START_TEST(virgl_decode_bind_sampler_states) } END_TEST +START_TEST(virgl_test_encode_sampler_view) +{ + struct virgl_context ctx; + int ret = testvirgl_init_ctx_cmdbuf(&ctx); + ck_assert_int_eq(ret, 0); + + struct pipe_sampler_view state = { + .format = VIRGL_FORMAT_B8G8R8A8_UNORM + }; + + struct virgl_resource res; + struct virgl_resource res2; + + /* init and create simple 2D resource */ + ret = testvirgl_create_backed_simple_2d_res(&res, 1, 50, 50); + ck_assert_int_eq(ret, 0); + + /* init and create simple 2D resource */ + ret = testvirgl_create_backed_simple_2d_res(&res2, 2, 50, 50); + ck_assert_int_eq(ret, 0); + + /* attach resource to context */ + virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle); + + /* Here we are using correct values, no error expected */ + ret = virgl_encode_sampler_view(&ctx, res.handle, + &res, + &state); + ck_assert_int_eq(ret, 0); + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, 0); + + /* Sending illegal format */ + state.format = VIRGL_FORMAT_NONE; + ret = virgl_encode_sampler_view(&ctx, res2.handle, + &res2, + &state); + ck_assert_int_eq(ret, 0); + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, EINVAL); + + /* Sending illegal format */ + state.format = VIRGL_FORMAT_MAX; + ret = virgl_encode_sampler_view(&ctx, res2.handle, + &res2, + &state); + ck_assert_int_eq(ret, 0); + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, EINVAL); + + /* Sending illegal sampler view target */ + state.format = VIRGL_FORMAT_B8G8R8A8_UNORM | PIPE_MAX_TEXTURE_TYPES << 24; + ret = virgl_encode_sampler_view(&ctx, res2.handle, + &res2, + &state); + ck_assert_int_eq(ret, 0); + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, EINVAL); + + testvirgl_fini_ctx_cmdbuf(&ctx); +} +END_TEST + static Suite *virgl_init_suite(void) { Suite *s; @@ -1213,6 +1276,7 @@ static Suite *virgl_init_suite(void) tcase_add_test(tc_core, virgl_decode_set_scissor_state); tcase_add_test(tc_core, virgl_decode_set_constant_buffer); tcase_add_test(tc_core, virgl_decode_bind_sampler_states); + tcase_add_test(tc_core, virgl_test_encode_sampler_view); suite_add_tcase(s, tc_core); return s; |