From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/util/u_tests.c | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)
diff --git a/src/gallium/auxiliary/util/u_tests.c b/src/gallium/auxiliary/util/u_tests.c index e7d11ce117e..32c543027cb 100644 --- a/src/gallium/auxiliary/util/u_tests.c +++ b/src/gallium/auxiliary/util/u_tests.c @@ -778,35 +778,97 @@ test_texture_barrier(struct pipe_context *ctx, bool use_fbfetch, /* Cleanup. */ cso_destroy_context(cso); ctx->delete_vs_state(ctx, vs); ctx->delete_fs_state(ctx, fs); pipe_sampler_view_reference(&view, NULL); pipe_resource_reference(&cb, NULL); util_report_result_helper(pass, name); } +/* Write a value into a texture, or read and check a value inside a texture, + * while using a user-specified stride. + */ +static bool +test_one_transfer(struct pipe_context *ctx, struct pipe_resource *tex, + unsigned x, unsigned y, unsigned value, + unsigned user_stride, bool read) +{ + struct pipe_transfer *transfer = NULL; + struct pipe_box box; + uint32_t *map; + + assert(y >= 1); + u_box_2d(x, y - 1, 1, 2, &box); + map = ctx->transfer_map(ctx, tex, 0, + read ? PIPE_TRANSFER_READ : PIPE_TRANSFER_WRITE, + &box, user_stride, &transfer); + + if (transfer->stride != user_stride) { + ctx->transfer_unmap(ctx, transfer); + return false; + } + + if (read) { + if (map[transfer->stride / 4] != value) { + ctx->transfer_unmap(ctx, transfer); + return false; + } + } else { + map[transfer->stride / 4] = value; + } + + ctx->transfer_unmap(ctx, transfer); + return true; +} + +static void +test_transfer_user_stride(struct pipe_context *ctx) +{ + struct pipe_screen *screen = ctx->screen; + struct pipe_resource *tex = + util_create_texture2d(screen, 320, 240, PIPE_FORMAT_R8G8B8A8_UNORM, 1); + unsigned stride = + screen->get_param(screen, PIPE_CAP_TRANSFER_USER_STRIDE_ALIGNMENT); + bool status = true; + + /* Write pixels. Strides are in the ascending order. */ + for (unsigned i = 0; i < 20; i++) { + status = status && test_one_transfer(ctx, tex, 2 + i, 2 + i, i + 1, + stride * (i + 1), false); + } + /* Read pixels and compare values. Strides are in the descending order. */ + for (unsigned i = 0; i < 20; i++) { + status = status && test_one_transfer(ctx, tex, 2 + i, 2 + i, i + 1, + stride * (20 - i), true); + } + + pipe_resource_reference(&tex, NULL); + util_report_result(status); +} + /** * Run all tests. This should be run with a clean context after * context_create. */ void util_run_tests(struct pipe_screen *screen) { struct pipe_context *ctx = screen->context_create(screen, NULL, 0); null_fragment_shader(ctx); tgsi_vs_window_space_position(ctx); null_sampler_view(ctx, TGSI_TEXTURE_2D); null_sampler_view(ctx, TGSI_TEXTURE_BUFFER); util_test_constant_buffer(ctx, NULL); test_sync_file_fences(ctx); + test_transfer_user_stride(ctx); for (int i = 1; i <= 8; i = i * 2) test_texture_barrier(ctx, false, i); for (int i = 1; i <= 8; i = i * 2) test_texture_barrier(ctx, true, i); ctx->destroy(ctx); puts("Done. Exiting.."); exit(0); -- 2.17.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev