summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Gawin <filip.gawin@collabora.com>2023-09-07 13:38:24 +0200
committerMarge Bot <emma+marge@anholt.net>2023-09-08 15:12:42 +0000
commit8019cc5e4d4e5e5c53ad4a6cd927b35ecd3df1f0 (patch)
treeebc69db0d31f369d12736856b0cf178a4a9ee7ce
parent61d667766c3a77f89912036d76793695e7703ce5 (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.c34
-rw-r--r--src/vrend_renderer.c26
-rw-r--r--src/vrend_renderer.h8
-rw-r--r--tests/test_virgl_cmd.c64
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;