mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 13:10:10 +01:00
gallium/u_tests: add a compute shader test that clears an image
This commit is contained in:
parent
3486fe655a
commit
0d17b685b1
1 changed files with 77 additions and 0 deletions
|
|
@ -787,6 +787,81 @@ test_texture_barrier(struct pipe_context *ctx, bool use_fbfetch,
|
|||
util_report_result_helper(pass, name);
|
||||
}
|
||||
|
||||
static void
|
||||
test_compute_clear_image(struct pipe_context *ctx)
|
||||
{
|
||||
struct cso_context *cso;
|
||||
struct pipe_resource *cb;
|
||||
struct pipe_sampler_view *view = NULL;
|
||||
const char *text;
|
||||
|
||||
cso = cso_create_context(ctx, 0);
|
||||
cb = util_create_texture2d(ctx->screen, 256, 256,
|
||||
PIPE_FORMAT_R8G8B8A8_UNORM, 1);
|
||||
|
||||
/* Compute shader. */
|
||||
text = "COMP\n"
|
||||
"PROPERTY CS_FIXED_BLOCK_WIDTH 8\n"
|
||||
"PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n"
|
||||
"PROPERTY CS_FIXED_BLOCK_DEPTH 1\n"
|
||||
"DCL SV[0], THREAD_ID\n"
|
||||
"DCL SV[1], BLOCK_ID\n"
|
||||
"DCL IMAGE[0], 2D, PIPE_FORMAT_R8G8B8A8_UNORM, WR\n"
|
||||
"DCL TEMP[0]\n"
|
||||
"IMM[0] UINT32 { 8, 8, 0, 0}\n"
|
||||
"IMM[1] FLT32 { 1, 0, 0, 0}\n"
|
||||
|
||||
/* TEMP[0].xy = SV[1] * IMM[0] + SV[0]; */
|
||||
"UMAD TEMP[0].xy, SV[1], IMM[0], SV[0]\n"
|
||||
"STORE IMAGE[0], TEMP[0], IMM[1], 2D, PIPE_FORMAT_R8G8B8A8_UNORM\n"
|
||||
"END\n";
|
||||
|
||||
struct tgsi_token tokens[1000];
|
||||
if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) {
|
||||
assert(0);
|
||||
util_report_result(FAIL);
|
||||
return;
|
||||
}
|
||||
|
||||
struct pipe_compute_state state = {};
|
||||
state.ir_type = PIPE_SHADER_IR_TGSI;
|
||||
state.prog = tokens;
|
||||
|
||||
void *compute_shader = ctx->create_compute_state(ctx, &state);
|
||||
cso_set_compute_shader_handle(cso, compute_shader);
|
||||
|
||||
/* Bind the image. */
|
||||
struct pipe_image_view image = {};
|
||||
image.resource = cb;
|
||||
image.shader_access = image.access = PIPE_IMAGE_ACCESS_READ_WRITE;
|
||||
image.format = cb->format;
|
||||
|
||||
ctx->set_shader_images(ctx, PIPE_SHADER_COMPUTE, 0, 1, &image);
|
||||
|
||||
/* Dispatch compute. */
|
||||
struct pipe_grid_info info = {};
|
||||
info.block[0] = 8;
|
||||
info.block[1] = 8;
|
||||
info.block[2] = 1;
|
||||
info.grid[0] = cb->width0 / 8;
|
||||
info.grid[1] = cb->height0 / 8;
|
||||
info.grid[2] = 1;
|
||||
|
||||
ctx->launch_grid(ctx, &info);
|
||||
|
||||
/* Check pixels. */
|
||||
static const float expected[] = {1.0, 0.0, 0.0, 0.0};
|
||||
bool pass = util_probe_rect_rgba(ctx, cb, 0, 0,
|
||||
cb->width0, cb->height0, expected);
|
||||
|
||||
/* Cleanup. */
|
||||
cso_destroy_context(cso);
|
||||
ctx->delete_compute_state(ctx, compute_shader);
|
||||
pipe_resource_reference(&cb, NULL);
|
||||
|
||||
util_report_result(pass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run all tests. This should be run with a clean context after
|
||||
* context_create.
|
||||
|
|
@ -808,6 +883,8 @@ util_run_tests(struct pipe_screen *screen)
|
|||
for (int i = 1; i <= 8; i = i * 2)
|
||||
test_texture_barrier(ctx, true, i);
|
||||
|
||||
test_compute_clear_image(ctx);
|
||||
|
||||
ctx->destroy(ctx);
|
||||
|
||||
puts("Done. Exiting..");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue