gallium/tests: drop compute test
authorKarol Herbst <kherbst@redhat.com>
Sat, 1 Oct 2022 13:22:41 +0000 (15:22 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 2 Nov 2022 23:36:56 +0000 (23:36 +0000)
The TGSIs don't compile and are rather an annoyence when touching gallium
APIs.

Originally they were written with adding CL support to TGSI, but that
never panned out.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18581>

src/gallium/tests/trivial/compute.c [deleted file]
src/gallium/tests/trivial/meson.build

diff --git a/src/gallium/tests/trivial/compute.c b/src/gallium/tests/trivial/compute.c
deleted file mode 100644 (file)
index 1def218..0000000
+++ /dev/null
@@ -1,1693 +0,0 @@
-/*
- * Copyright (C) 2011 Francisco Jerez.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <inttypes.h>
-#include "pipe/p_state.h"
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_shader_tokens.h"
-#include "util/u_memory.h"
-#include "util/u_inlines.h"
-#include "util/u_sampler.h"
-#include "util/format/u_format.h"
-#include "tgsi/tgsi_text.h"
-#include "pipe-loader/pipe_loader.h"
-
-#define MAX_RESOURCES 4
-
-struct context {
-        struct pipe_loader_device *dev;
-        struct pipe_screen *screen;
-        struct pipe_context *pipe;
-        void *hwcs;
-        void *hwsmp[MAX_RESOURCES];
-        struct pipe_resource *tex[MAX_RESOURCES];
-        bool tex_rw[MAX_RESOURCES];
-        struct pipe_sampler_view *view[MAX_RESOURCES];
-        struct pipe_surface *surf[MAX_RESOURCES];
-};
-
-#define DUMP_COMPUTE_PARAM(p, c) do {                                   \
-                uint64_t __v[4];                                        \
-                int __i, __n;                                           \
-                                                                        \
-                __n = ctx->screen->get_compute_param(ctx->screen,       \
-                                                     PIPE_SHADER_IR_TGSI, \
-                                                     c, __v);           \
-                printf("%s: {", #c);                                    \
-                                                                        \
-                for (__i = 0; __i < __n / sizeof(*__v); ++__i)          \
-                        printf(" %"PRIu64, __v[__i]);                   \
-                                                                        \
-                printf(" }\n");                                         \
-        } while (0)
-
-static void init_ctx(struct context *ctx)
-{
-        ASSERTED int ret;
-
-        ret = pipe_loader_probe(&ctx->dev, 1);
-        assert(ret);
-
-        ctx->screen = pipe_loader_create_screen(ctx->dev);
-        assert(ctx->screen);
-
-        ctx->pipe = ctx->screen->context_create(ctx->screen, NULL, 0);
-        assert(ctx->pipe);
-
-        DUMP_COMPUTE_PARAM(p, PIPE_COMPUTE_CAP_GRID_DIMENSION);
-        DUMP_COMPUTE_PARAM(p, PIPE_COMPUTE_CAP_MAX_GRID_SIZE);
-        DUMP_COMPUTE_PARAM(p, PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE);
-}
-
-static void destroy_ctx(struct context *ctx)
-{
-        ctx->pipe->destroy(ctx->pipe);
-        ctx->screen->destroy(ctx->screen);
-        pipe_loader_release(&ctx->dev, 1);
-        FREE(ctx);
-}
-
-static char *
-preprocess_prog(struct context *ctx, const char *src, const char *defs)
-{
-        const char header[] =
-                "#define RGLOBAL        RES[32767]\n"
-                "#define RLOCAL         RES[32766]\n"
-                "#define RPRIVATE       RES[32765]\n"
-                "#define RINPUT         RES[32764]\n";
-        char cmd[512];
-        char tmp[] = "/tmp/test-compute.tgsi-XXXXXX";
-        char *buf;
-        int fd, ret;
-        struct stat st;
-        FILE *p;
-
-        /* Open a temporary file */
-        fd = mkstemp(tmp);
-        assert(fd >= 0);
-        snprintf(cmd, sizeof(cmd), "cpp -P -nostdinc -undef %s > %s",
-                 defs ? defs : "", tmp);
-
-        /* Preprocess */
-        p = popen(cmd, "w");
-        fwrite(header, strlen(header), 1, p);
-        fwrite(src, strlen(src), 1, p);
-        ret = pclose(p);
-        assert(!ret);
-
-        /* Read back */
-        ret = fstat(fd, &st);
-        assert(!ret);
-
-        buf = malloc(st.st_size + 1);
-        ret = read(fd, buf, st.st_size);
-        assert(ret == st.st_size);
-        buf[ret] = 0;
-
-        /* Clean up */
-        close(fd);
-        unlink(tmp);
-
-        return buf;
-}
-
-static void init_prog(struct context *ctx, unsigned local_sz,
-                      unsigned private_sz, unsigned input_sz,
-                      const char *src, const char *defs)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct tgsi_token prog[1024];
-        struct pipe_compute_state cs = {
-                .ir_type = PIPE_SHADER_IR_TGSI,
-                .prog = prog,
-                .req_local_mem = local_sz,
-                .req_private_mem = private_sz,
-                .req_input_mem = input_sz
-        };
-        char *psrc = preprocess_prog(ctx, src, defs);
-        ASSERTED int ret;
-
-        ret = tgsi_text_translate(psrc, prog, ARRAY_SIZE(prog));
-        assert(ret);
-        free(psrc);
-
-        ctx->hwcs = pipe->create_compute_state(pipe, &cs);
-        assert(ctx->hwcs);
-
-        pipe->bind_compute_state(pipe, ctx->hwcs);
-}
-
-static void destroy_prog(struct context *ctx)
-{
-        struct pipe_context *pipe = ctx->pipe;
-
-        pipe->delete_compute_state(pipe, ctx->hwcs);
-        ctx->hwcs = NULL;
-}
-
-static void init_tex(struct context *ctx, int slot,
-                     enum pipe_texture_target target, bool rw,
-                     enum pipe_format format, int w, int h,
-                     void (*init)(void *, int, int, int))
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_resource **tex = &ctx->tex[slot];
-        struct pipe_resource ttex = {
-                .target = target,
-                .format = format,
-                .width0 = w,
-                .height0 = h,
-                .depth0 = 1,
-                .array_size = 1,
-                .bind = (PIPE_BIND_SAMPLER_VIEW |
-                         PIPE_BIND_COMPUTE_RESOURCE |
-                         PIPE_BIND_GLOBAL)
-        };
-        int dx = util_format_get_blocksize(format);
-        int dy = util_format_get_stride(format, w);
-        int nx = (target == PIPE_BUFFER ? (w / dx) :
-                  util_format_get_nblocksx(format, w));
-        int ny = (target == PIPE_BUFFER ? 1 :
-                  util_format_get_nblocksy(format, h));
-        struct pipe_transfer *xfer;
-        char *map;
-        int x, y;
-
-        *tex = ctx->screen->resource_create(ctx->screen, &ttex);
-        assert(*tex);
-
-        map = pipe->texture_map(pipe, *tex, 0, PIPE_MAP_WRITE,
-                                  &(struct pipe_box) { .width = w,
-                                                  .height = h,
-                                                  .depth = 1 }, &xfer);
-        assert(xfer);
-        assert(map);
-
-        for (y = 0; y < ny; ++y) {
-                for (x = 0; x < nx; ++x) {
-                        init(map + y * dy + x * dx, slot, x, y);
-                }
-        }
-
-        pipe->texture_unmap(pipe, xfer);
-
-        ctx->tex_rw[slot] = rw;
-}
-
-static bool default_check(void *x, void *y, int sz) {
-        return !memcmp(x, y, sz);
-}
-
-static void check_tex(struct context *ctx, int slot,
-                      void (*expect)(void *, int, int, int),
-                      bool (*check)(void *, void *, int))
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_resource *tex = ctx->tex[slot];
-        int dx = util_format_get_blocksize(tex->format);
-        int dy = util_format_get_stride(tex->format, tex->width0);
-        int nx = (tex->target == PIPE_BUFFER ? (tex->width0 / dx) :
-                  util_format_get_nblocksx(tex->format, tex->width0));
-        int ny = (tex->target == PIPE_BUFFER ? 1 :
-                  util_format_get_nblocksy(tex->format, tex->height0));
-        struct pipe_transfer *xfer;
-        char *map;
-        int x = 0, y, i;
-        int err = 0;
-
-        if (!check)
-                check = default_check;
-
-        map = pipe->texture_map(pipe, tex, 0, PIPE_MAP_READ,
-                                  &(struct pipe_box) { .width = tex->width0,
-                                        .height = tex->height0,
-                                        .depth = 1 }, &xfer);
-        assert(xfer);
-        assert(map);
-
-        for (y = 0; y < ny; ++y) {
-                for (x = 0; x < nx; ++x) {
-                        uint32_t exp[4];
-                        uint32_t *res = (uint32_t *)(map + y * dy + x * dx);
-
-                        expect(exp, slot, x, y);
-                        if (check(res, exp, dx) || (++err) > 20)
-                                continue;
-
-                        if (dx < 4) {
-                                uint32_t u = 0, v = 0;
-
-                                for (i = 0; i < dx; i++) {
-                                        u |= ((uint8_t *)exp)[i] << (8 * i);
-                                        v |= ((uint8_t *)res)[i] << (8 * i);
-                                }
-                                printf("(%d, %d): got 0x%x, expected 0x%x\n",
-                                       x, y, v, u);
-                        } else {
-                                for (i = 0; i < dx / 4; i++) {
-                                        printf("(%d, %d)[%d]: got 0x%x/%f,"
-                                               " expected 0x%x/%f\n", x, y, i,
-                                               res[i], ((float *)res)[i],
-                                               exp[i], ((float *)exp)[i]);
-                                }
-                        }
-                }
-        }
-
-        pipe->texture_unmap(pipe, xfer);
-
-        if (err)
-                printf("(%d, %d): \x1b[31mFAIL\x1b[0m (%d)\n", x, y, err);
-        else
-                printf("(%d, %d): \x1b[32mOK\x1b[0m\n", x, y);
-}
-
-static void destroy_tex(struct context *ctx)
-{
-        int i;
-
-        for (i = 0; i < MAX_RESOURCES; ++i) {
-                if (ctx->tex[i])
-                        pipe_resource_reference(&ctx->tex[i], NULL);
-        }
-}
-
-static void init_sampler_views(struct context *ctx, const int *slots)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_sampler_view tview;
-        int i;
-
-        for (i = 0; *slots >= 0; ++i, ++slots) {
-                u_sampler_view_default_template(&tview, ctx->tex[*slots],
-                                                ctx->tex[*slots]->format);
-
-                ctx->view[i] = pipe->create_sampler_view(pipe, ctx->tex[*slots],
-                                                         &tview);
-                assert(ctx->view[i]);
-        }
-
-        pipe->set_sampler_views(pipe, PIPE_SHADER_COMPUTE, 0, i, 0, false, ctx->view);
-}
-
-static void destroy_sampler_views(struct context *ctx)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        int i;
-
-        pipe->set_sampler_views(pipe, PIPE_SHADER_COMPUTE, 0, 0, MAX_RESOURCES, false, NULL);
-
-        for (i = 0; i < MAX_RESOURCES; ++i) {
-                if (ctx->view[i]) {
-                        pipe->sampler_view_destroy(pipe, ctx->view[i]);
-                        ctx->view[i] = NULL;
-                }
-        }
-}
-
-static void init_compute_resources(struct context *ctx, const int *slots)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        int i;
-
-        for (i = 0; *slots >= 0; ++i, ++slots) {
-                struct pipe_surface tsurf = {
-                        .format = ctx->tex[*slots]->format,
-                        .writable = ctx->tex_rw[*slots]
-                };
-
-                if (ctx->tex[*slots]->target == PIPE_BUFFER)
-                        tsurf.u.buf.last_element = ctx->tex[*slots]->width0 - 1;
-
-                ctx->surf[i] = pipe->create_surface(pipe, ctx->tex[*slots],
-                                                    &tsurf);
-                assert(ctx->surf[i]);
-        }
-
-        pipe->set_compute_resources(pipe, 0, i, ctx->surf);
-}
-
-static void destroy_compute_resources(struct context *ctx)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        int i;
-
-        pipe->set_compute_resources(pipe, 0, MAX_RESOURCES, NULL);
-
-        for (i = 0; i < MAX_RESOURCES; ++i) {
-                if (ctx->surf[i]) {
-                        pipe->surface_destroy(pipe, ctx->surf[i]);
-                        ctx->surf[i] = NULL;
-                }
-        }
-}
-
-static void init_sampler_states(struct context *ctx, int n)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_sampler_state smp = {0};
-        int i;
-
-        for (i = 0; i < n; ++i) {
-                ctx->hwsmp[i] = pipe->create_sampler_state(pipe, &smp);
-                assert(ctx->hwsmp[i]);
-        }
-
-        pipe->bind_sampler_states(pipe, PIPE_SHADER_COMPUTE, 0, i, ctx->hwsmp);
-}
-
-static void destroy_sampler_states(struct context *ctx)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        int i;
-
-        pipe->bind_sampler_states(pipe, PIPE_SHADER_COMPUTE,
-                                 0, MAX_RESOURCES, NULL);
-
-        for (i = 0; i < MAX_RESOURCES; ++i) {
-                if (ctx->hwsmp[i]) {
-                        pipe->delete_sampler_state(pipe, ctx->hwsmp[i]);
-                        ctx->hwsmp[i] = NULL;
-                }
-        }
-}
-
-static void init_globals(struct context *ctx, const int *slots,
-                         uint32_t **handles)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_resource *res[MAX_RESOURCES];
-        int i;
-
-        for (i = 0; *slots >= 0; ++i, ++slots)
-                res[i] = ctx->tex[*slots];
-
-        pipe->set_global_binding(pipe, 0, i, res, handles);
-}
-
-static void destroy_globals(struct context *ctx)
-{
-        struct pipe_context *pipe = ctx->pipe;
-
-        pipe->set_global_binding(pipe, 0, MAX_RESOURCES, NULL, NULL);
-}
-
-static void launch_grid(struct context *ctx, const uint *block_layout,
-                        const uint *grid_layout, uint32_t pc,
-                        void *input)
-{
-        struct pipe_context *pipe = ctx->pipe;
-        struct pipe_grid_info info;
-        int i;
-
-        for (i = 0; i < 3; i++) {
-                info.block[i] = block_layout[i];
-                info.grid[i] = grid_layout[i];
-        }
-        info.pc = pc;
-        info.input = input;
-
-        pipe->launch_grid(pipe, &info);
-}
-
-static void test_default_init(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 0xdeadbeef;
-}
-
-/* test_system_values */
-static void test_system_values_expect(void *p, int s, int x, int y)
-{
-        int id = x / 16, sv = (x % 16) / 4, c = x % 4;
-        int tid[] = { id % 20, (id % 240) / 20, id / 240, 0 };
-        int bsz[] = { 4, 3, 5, 1};
-        int gsz[] = { 5, 4, 1, 1};
-
-        switch (sv) {
-        case 0:
-                *(uint32_t *)p = tid[c] / bsz[c];
-                break;
-        case 1:
-                *(uint32_t *)p = bsz[c];
-                break;
-        case 2:
-                *(uint32_t *)p = gsz[c];
-                break;
-        case 3:
-                *(uint32_t *)p = tid[c] % bsz[c];
-                break;
-        }
-}
-
-static void test_system_values(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL SV[1], BLOCK_SIZE[0]\n"
-                "DCL SV[2], GRID_SIZE[0]\n"
-                "DCL SV[3], THREAD_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 64, 0, 0, 0 }\n"
-                "IMM UINT32 { 16, 0, 0, 0 }\n"
-                "IMM UINT32 { 0, 0, 0, 0 }\n"
-                "\n"
-                "BGNSUB"
-                "  UMUL TEMP[0], SV[0], SV[1]\n"
-                "  UADD TEMP[0], TEMP[0], SV[3]\n"
-                "  UMUL TEMP[1], SV[1], SV[2]\n"
-                "  UMUL TEMP[0].w, TEMP[0], TEMP[1].zzzz\n"
-                "  UMUL TEMP[0].zw, TEMP[0], TEMP[1].yyyy\n"
-                "  UMUL TEMP[0].yzw, TEMP[0], TEMP[1].xxxx\n"
-                "  UADD TEMP[0].xy, TEMP[0].xyxy, TEMP[0].zwzw\n"
-                "  UADD TEMP[0].x, TEMP[0].xxxx, TEMP[0].yyyy\n"
-                "  UMUL TEMP[0].x, TEMP[0], IMM[0]\n"
-                "  STORE RES[0].xyzw, TEMP[0], SV[0]\n"
-                "  UADD TEMP[0].x, TEMP[0], IMM[1]\n"
-                "  STORE RES[0].xyzw, TEMP[0], SV[1]\n"
-                "  UADD TEMP[0].x, TEMP[0], IMM[1]\n"
-                "  STORE RES[0].xyzw, TEMP[0], SV[2]\n"
-                "  UADD TEMP[0].x, TEMP[0], IMM[1]\n"
-                "  STORE RES[0].xyzw, TEMP[0], SV[3]\n"
-                "  RET\n"
-                "ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 76800, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){4, 3, 5}, (uint []){5, 4, 1}, 0, NULL);
-        check_tex(ctx, 0, test_system_values_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_resource_access */
-static void test_resource_access_init0(void *p, int s, int x, int y)
-{
-        *(float *)p = 8.0 - (float)x;
-}
-
-static void test_resource_access_expect(void *p, int s, int x, int y)
-{
-        *(float *)p = 8.0 - (float)((x + 4 * y) & 0x3f);
-}
-
-static void test_resource_access(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL RES[1], 2D, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 15, 0, 0, 0 }\n"
-                "IMM UINT32 { 16, 1, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UADD TEMP[0].x, SV[0].xxxx, SV[0].yyyy\n"
-                "       AND TEMP[0].x, TEMP[0], IMM[0]\n"
-                "       UMUL TEMP[0].x, TEMP[0], IMM[1]\n"
-                "       LOAD TEMP[0].xyzw, RES[0], TEMP[0]\n"
-                "       UMUL TEMP[1], SV[0], IMM[1]\n"
-                "       STORE RES[1].xyzw, TEMP[1], TEMP[0]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_resource_access_init0);
-        init_tex(ctx, 1, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                 60, 12, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, 1, -1 });
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){15, 12, 1}, 0, NULL);
-        check_tex(ctx, 1, test_resource_access_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_function_calls */
-static void test_function_calls_init(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 15 * y + x;
-}
-
-static void test_function_calls_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = (15 * y + x) < 4 ? 2 : 1 ;
-}
-
-static void test_function_calls(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], 2D, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL SV[1], BLOCK_SIZE[0]\n"
-                "DCL SV[2], GRID_SIZE[0]\n"
-                "DCL SV[3], THREAD_ID[0]\n"
-                "DCL TEMP[0]\n"
-                "DCL TEMP[1]\n"
-                "DCL TEMP[2], LOCAL\n"
-                "IMM UINT32 { 0, 11, 22, 33 }\n"
-                "IMM FLT32 { 11, 33, 55, 99 }\n"
-                "IMM UINT32 { 4, 1, 0, 0 }\n"
-                "IMM UINT32 { 12, 0, 0, 0 }\n"
-                "\n"
-                "00: BGNSUB\n"
-                "01:  UMUL TEMP[0].x, TEMP[0], TEMP[0]\n"
-                "02:  UADD TEMP[1].x, TEMP[1], IMM[2].yyyy\n"
-                "03:  USLT TEMP[0].x, TEMP[0], IMM[0]\n"
-                "04:  RET\n"
-                "05: ENDSUB\n"
-                "06: BGNSUB\n"
-                "07:  UMUL TEMP[0].x, TEMP[0], TEMP[0]\n"
-                "08:  UADD TEMP[1].x, TEMP[1], IMM[2].yyyy\n"
-                "09:  USLT TEMP[0].x, TEMP[0], IMM[0].yyyy\n"
-                "10:  IF TEMP[0].xxxx\n"
-                "11:   CAL :0\n"
-                "12:  ENDIF\n"
-                "13:  RET\n"
-                "14: ENDSUB\n"
-                "15: BGNSUB\n"
-                "16:  UMUL TEMP[2], SV[0], SV[1]\n"
-                "17:  UADD TEMP[2], TEMP[2], SV[3]\n"
-                "18:  UMUL TEMP[2], TEMP[2], IMM[2]\n"
-                "00:  MOV TEMP[1].x, IMM[2].wwww\n"
-                "19:  LOAD TEMP[0].x, RES[0].xxxx, TEMP[2]\n"
-                "20:  CAL :6\n"
-                "21:  STORE RES[0].x, TEMP[2], TEMP[1].xxxx\n"
-                "22:  RET\n"
-                "23: ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                 15, 12, test_function_calls_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){3, 3, 3}, (uint []){5, 4, 1}, 15, NULL);
-        check_tex(ctx, 0, test_function_calls_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_input_global */
-static void test_input_global_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 0xdeadbeef - (x == 0 ? 0x10001 + 2 * s : 0);
-}
-
-static void test_input_global(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL SV[0], THREAD_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 8, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0], SV[0], IMM[0]\n"
-                "       LOAD TEMP[1].xy, RINPUT, TEMP[0]\n"
-                "       LOAD TEMP[0].x, RGLOBAL, TEMP[1].yyyy\n"
-                "       UADD TEMP[1].x, TEMP[0], -TEMP[1]\n"
-                "       STORE RGLOBAL.x, TEMP[1].yyyy, TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-        uint32_t input[8] = { 0x10001, 0x10002, 0x10003, 0x10004,
-                              0x10005, 0x10006, 0x10007, 0x10008 };
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 32, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
-                 test_default_init);
-        init_tex(ctx, 1, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
-                 test_default_init);
-        init_tex(ctx, 2, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
-                 test_default_init);
-        init_tex(ctx, 3, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
-                 test_default_init);
-        init_globals(ctx, (int []){ 0, 1, 2, 3, -1 },
-                     (uint32_t *[]){ &input[1], &input[3],
-                                     &input[5], &input[7] });
-        launch_grid(ctx, (uint []){4, 1, 1}, (uint []){1, 1, 1}, 0, input);
-        check_tex(ctx, 0, test_input_global_expect, NULL);
-        check_tex(ctx, 1, test_input_global_expect, NULL);
-        check_tex(ctx, 2, test_input_global_expect, NULL);
-        check_tex(ctx, 3, test_input_global_expect, NULL);
-        destroy_globals(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_private */
-static void test_private_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = (x / 32) + x % 32;
-}
-
-static void test_private(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL SV[1], BLOCK_SIZE[0]\n"
-                "DCL SV[2], THREAD_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "DCL TEMP[2], LOCAL\n"
-                "IMM UINT32 { 128, 0, 0, 0 }\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, SV[0], SV[1]\n"
-                "       UADD TEMP[0].x, TEMP[0], SV[2]\n"
-                "       MOV TEMP[1].x, IMM[0].wwww\n"
-                "       BGNLOOP\n"
-                "               USEQ TEMP[2].x, TEMP[1], IMM[0]\n"
-                "               IF TEMP[2]\n"
-                "                       BRK\n"
-                "               ENDIF\n"
-                "               UDIV TEMP[2].x, TEMP[1], IMM[1]\n"
-                "               UADD TEMP[2].x, TEMP[2], TEMP[0]\n"
-                "               STORE RPRIVATE.x, TEMP[1], TEMP[2]\n"
-                "               UADD TEMP[1].x, TEMP[1], IMM[1]\n"
-                "       ENDLOOP\n"
-                "       MOV TEMP[1].x, IMM[0].wwww\n"
-                "       UMUL TEMP[0].x, TEMP[0], IMM[0]\n"
-                "       BGNLOOP\n"
-                "               USEQ TEMP[2].x, TEMP[1], IMM[0]\n"
-                "               IF TEMP[2]\n"
-                "                       BRK\n"
-                "               ENDIF\n"
-                "               LOAD TEMP[2].x, RPRIVATE, TEMP[1]\n"
-                "               STORE RES[0].x, TEMP[0], TEMP[2]\n"
-                "               UADD TEMP[0].x, TEMP[0], IMM[1]\n"
-                "               UADD TEMP[1].x, TEMP[1], IMM[1]\n"
-                "       ENDLOOP\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 128, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 32768, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){16, 1, 1}, (uint []){16, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_private_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_local */
-static void test_local_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = x & 0x20 ? 2 : 1;
-}
-
-static void test_local(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL SV[1], BLOCK_SIZE[0]\n"
-                "DCL SV[2], THREAD_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "DCL TEMP[2], LOCAL\n"
-                "IMM UINT32 { 1, 0, 0, 0 }\n"
-                "IMM UINT32 { 2, 0, 0, 0 }\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "IMM UINT32 { 32, 0, 0, 0 }\n"
-                "IMM UINT32 { 128, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, SV[2], IMM[2]\n"
-                "       STORE RLOCAL.x, TEMP[0], IMM[0].wwww\n"
-                "       MFENCE RLOCAL\n"
-                "       USLT TEMP[1].x, SV[2], IMM[3]\n"
-                "       IF TEMP[1]\n"
-                "               UADD TEMP[1].x, TEMP[0], IMM[4]\n"
-                "               BGNLOOP\n"
-                "                       LOAD TEMP[2].x, RLOCAL, TEMP[1]\n"
-                "                       USEQ TEMP[2].x, TEMP[2], IMM[0]\n"
-                "                       IF TEMP[2]\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "               STORE RLOCAL.x, TEMP[0], IMM[0]\n"
-                "               MFENCE RLOCAL\n"
-                "               BGNLOOP\n"
-                "                       LOAD TEMP[2].x, RLOCAL, TEMP[1]\n"
-                "                       USEQ TEMP[2].x, TEMP[2], IMM[1]\n"
-                "                       IF TEMP[2]\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "       ELSE\n"
-                "               UADD TEMP[1].x, TEMP[0], -IMM[4]\n"
-                "               BGNLOOP\n"
-                "                       LOAD TEMP[2].x, RLOCAL, TEMP[1]\n"
-                "                       USEQ TEMP[2].x, TEMP[2], IMM[0].wwww\n"
-                "                       IF TEMP[2]\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "               STORE RLOCAL.x, TEMP[0], IMM[0]\n"
-                "               MFENCE RLOCAL\n"
-                "               BGNLOOP\n"
-                "                       LOAD TEMP[2].x, RLOCAL, TEMP[1]\n"
-                "                       USEQ TEMP[2].x, TEMP[2], IMM[0]\n"
-                "                       IF TEMP[2]\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "               STORE RLOCAL.x, TEMP[0], IMM[1]\n"
-                "               MFENCE RLOCAL\n"
-                "       ENDIF\n"
-                "       UMUL TEMP[1].x, SV[0], SV[1]\n"
-                "       UMUL TEMP[1].x, TEMP[1], IMM[2]\n"
-                "       UADD TEMP[1].x, TEMP[1], TEMP[0]\n"
-                "       LOAD TEMP[0].x, RLOCAL, TEMP[0]\n"
-                "       STORE RES[0].x, TEMP[1], TEMP[0]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 256, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 4096, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){64, 1, 1}, (uint []){16, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_local_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_sample */
-static void test_sample_init(void *p, int s, int x, int y)
-{
-        *(float *)p = s ? 1 : x * y;
-}
-
-static void test_sample_expect(void *p, int s, int x, int y)
-{
-        switch (x % 4) {
-        case 0:
-                *(float *)p = x / 4 * y;
-                break;
-        case 1:
-        case 2:
-                *(float *)p = 0;
-                break;
-        case 3:
-                *(float *)p = 1;
-                break;
-        }
-}
-
-static void test_sample(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL SVIEW[0], 2D, FLOAT\n"
-                "DCL RES[0], 2D, RAW, WR\n"
-                "DCL SAMP[0]\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 16, 1, 0, 0 }\n"
-                "IMM FLT32 { 128, 32, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       I2F TEMP[1], SV[0]\n"
-                "       DIV TEMP[1], TEMP[1], IMM[1]\n"
-                "       SAMPLE TEMP[1], TEMP[1], SVIEW[0], SAMP[0]\n"
-                "       UMUL TEMP[0], SV[0], IMM[0]\n"
-                "       STORE RES[0].xyzw, TEMP[0], TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                 128, 32, test_sample_init);
-        init_tex(ctx, 1, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                 512, 32, test_sample_init);
-        init_compute_resources(ctx, (int []) { 1, -1 });
-        init_sampler_views(ctx, (int []) { 0, -1 });
-        init_sampler_states(ctx, 2);
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){128, 32, 1}, 0, NULL);
-        check_tex(ctx, 1, test_sample_expect, NULL);
-        destroy_sampler_states(ctx);
-        destroy_sampler_views(ctx);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_many_kern */
-static void test_many_kern_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = x;
-}
-
-static void test_many_kern(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL TEMP[0], LOCAL\n"
-                "IMM UINT32 { 0, 1, 2, 3 }\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, IMM[0].xxxx, IMM[1].xxxx\n"
-                "       STORE RES[0].x, TEMP[0], IMM[0].xxxx\n"
-                "       RET\n"
-                "    ENDSUB\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, IMM[0].yyyy, IMM[1].xxxx\n"
-                "       STORE RES[0].x, TEMP[0], IMM[0].yyyy\n"
-                "       RET\n"
-                "    ENDSUB\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, IMM[0].zzzz, IMM[1].xxxx\n"
-                "       STORE RES[0].x, TEMP[0], IMM[0].zzzz\n"
-                "       RET\n"
-                "    ENDSUB\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, IMM[0].wwww, IMM[1].xxxx\n"
-                "       STORE RES[0].x, TEMP[0], IMM[0].wwww\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 16, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){1, 1, 1}, 0, NULL);
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){1, 1, 1}, 5, NULL);
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){1, 1, 1}, 10, NULL);
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){1, 1, 1}, 15, NULL);
-        check_tex(ctx, 0, test_many_kern_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_constant */
-static void test_constant_init(void *p, int s, int x, int y)
-{
-        *(float *)p = s ? 0xdeadbeef : 8.0 - (float)x;
-}
-
-static void test_constant_expect(void *p, int s, int x, int y)
-{
-        *(float *)p = 8.0 - (float)x;
-}
-
-static void test_constant(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW\n"
-                "DCL RES[1], BUFFER, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, SV[0], IMM[0]\n"
-                "       LOAD TEMP[1].x, RES[0], TEMP[0]\n"
-                "       STORE RES[1].x, TEMP[0], TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_constant_init);
-        init_tex(ctx, 1, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_constant_init);
-        init_compute_resources(ctx, (int []) { 0, 1, -1 });
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){64, 1, 1}, 0, NULL);
-        check_tex(ctx, 1, test_constant_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_resource_indirect */
-static void test_resource_indirect_init(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = s == 0 ? 0xdeadbeef :
-                s == 1 ? x % 2 :
-                s == 2 ? 2 * x :
-                2 * x + 1;
-}
-
-static void test_resource_indirect_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 2 * x + (x % 2 ? 1 : 0);
-}
-
-static void test_resource_indirect(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL RES[1..3], BUFFER, RAW\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, SV[0], IMM[0]\n"
-                "       LOAD TEMP[1].x, RES[1], TEMP[0]\n"
-                "       LOAD TEMP[1].x, RES[TEMP[1].x+2], TEMP[0]\n"
-                "       STORE RES[0].x, TEMP[0], TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_resource_indirect_init);
-        init_tex(ctx, 1, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_resource_indirect_init);
-        init_tex(ctx, 2, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_resource_indirect_init);
-        init_tex(ctx, 3, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
-                 256, 0, test_resource_indirect_init);
-        init_compute_resources(ctx, (int []) { 0, 1, 2, 3, -1 });
-        launch_grid(ctx, (uint []){1, 1, 1}, (uint []){64, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_resource_indirect_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_surface_ld */
-enum pipe_format surface_fmts[] = {
-        PIPE_FORMAT_B8G8R8A8_UNORM,
-        PIPE_FORMAT_B8G8R8X8_UNORM,
-        PIPE_FORMAT_A8R8G8B8_UNORM,
-        PIPE_FORMAT_X8R8G8B8_UNORM,
-        PIPE_FORMAT_X8R8G8B8_UNORM,
-        PIPE_FORMAT_L8_UNORM,
-        PIPE_FORMAT_A8_UNORM,
-        PIPE_FORMAT_I8_UNORM,
-        PIPE_FORMAT_L8A8_UNORM,
-        PIPE_FORMAT_R32_FLOAT,
-        PIPE_FORMAT_R32G32_FLOAT,
-        PIPE_FORMAT_R32G32B32A32_FLOAT,
-        PIPE_FORMAT_R32_UNORM,
-        PIPE_FORMAT_R32G32_UNORM,
-        PIPE_FORMAT_R32G32B32A32_UNORM,
-        PIPE_FORMAT_R32_SNORM,
-        PIPE_FORMAT_R32G32_SNORM,
-        PIPE_FORMAT_R32G32B32A32_SNORM,
-        PIPE_FORMAT_R8_UINT,
-        PIPE_FORMAT_R8G8_UINT,
-        PIPE_FORMAT_R8G8B8A8_UINT,
-        PIPE_FORMAT_R8_SINT,
-        PIPE_FORMAT_R8G8_SINT,
-        PIPE_FORMAT_R8G8B8A8_SINT,
-        PIPE_FORMAT_R32_UINT,
-        PIPE_FORMAT_R32G32_UINT,
-        PIPE_FORMAT_R32G32B32A32_UINT,
-        PIPE_FORMAT_R32_SINT,
-        PIPE_FORMAT_R32G32_SINT,
-        PIPE_FORMAT_R32G32B32A32_SINT
-};
-
-static void test_surface_ld_init0f(void *p, int s, int x, int y)
-{
-        float v[] = { 1.0, -.75, .50, -.25 };
-        int i = 0;
-
-        util_format_pack_rgba(surface_fmts[i], p, v, 1);
-}
-
-static void test_surface_ld_init0i(void *p, int s, int x, int y)
-{
-        int v[] = { 0xffffffff, 0xffff, 0xff, 0xf };
-        int i = 0;
-
-        util_format_pack_rgba(surface_fmts[i], p, v, 1);
-}
-
-static void test_surface_ld_expectf(void *p, int s, int x, int y)
-{
-        float v[4], w[4];
-        int i = 0;
-
-        test_surface_ld_init0f(v, s, x / 4, y);
-        util_format_unpack_rgba(surface_fmts[i], w, v, 1);
-        *(float *)p = w[x % 4];
-}
-
-static void test_surface_ld_expecti(void *p, int s, int x, int y)
-{
-        int32_t v[4], w[4];
-        int i = 0;
-
-        test_surface_ld_init0i(v, s, x / 4, y);
-        util_format_unpack_rgba(surface_fmts[i], w, v, 1);
-        *(uint32_t *)p = w[x % 4];
-}
-
-static void test_surface_ld(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], 2D\n"
-                "DCL RES[1], 2D, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 16, 1, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       LOAD TEMP[1], RES[0], SV[0]\n"
-                "       UMUL TEMP[0], SV[0], IMM[0]\n"
-                "       STORE RES[1].xyzw, TEMP[0], TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-        int i = 0;
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-
-        for (i = 0; i < ARRAY_SIZE(surface_fmts); i++) {
-                bool is_int = util_format_is_pure_integer(surface_fmts[i]);
-
-                printf("   - %s\n", util_format_name(surface_fmts[i]));
-
-                if (!ctx->screen->is_format_supported(ctx->screen,
-                       surface_fmts[i], PIPE_TEXTURE_2D, 1, 1,
-                       PIPE_BIND_COMPUTE_RESOURCE)) {
-                   printf("(unsupported)\n");
-                   continue;
-                }
-
-                init_tex(ctx, 0, PIPE_TEXTURE_2D, true, surface_fmts[i],
-                         128, 32, (is_int ? test_surface_ld_init0i : test_surface_ld_init0f));
-                init_tex(ctx, 1, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                         512, 32, test_default_init);
-                init_compute_resources(ctx, (int []) { 0, 1, -1 });
-                init_sampler_states(ctx, 2);
-                launch_grid(ctx, (uint []){1, 1, 1}, (uint []){128, 32, 1}, 0,
-                            NULL);
-                check_tex(ctx, 1, (is_int ? test_surface_ld_expecti : test_surface_ld_expectf), NULL);
-                destroy_sampler_states(ctx);
-                destroy_compute_resources(ctx);
-                destroy_tex(ctx);
-        }
-
-        destroy_prog(ctx);
-}
-
-/* test_surface_st */
-static void test_surface_st_init0f(void *p, int s, int x, int y)
-{
-        float v[] = { 1.0, -.75, 0.5, -.25 };
-        *(float *)p = v[x % 4];
-}
-
-static void test_surface_st_init0i(void *p, int s, int x, int y)
-{
-        int v[] = { 0xffffffff, 0xffff, 0xff, 0xf };
-        *(int32_t *)p = v[x % 4];
-}
-
-static void test_surface_st_init1(void *p, int s, int x, int y)
-{
-        int i = 0;
-        memset(p, 1, util_format_get_blocksize(surface_fmts[i]));
-}
-
-static void test_surface_st_expectf(void *p, int s, int x, int y)
-{
-        float vf[4];
-        int i = 0, j;
-
-        for (j = 0; j < 4; j++)
-                test_surface_st_init0f(&vf[j], s, 4 * x + j, y);
-        util_format_pack_rgba(surface_fmts[i], p, vf, 1);
-}
-
-static void test_surface_st_expects(void *p, int s, int x, int y)
-{
-        int32_t v[4];
-        int i = 0, j;
-
-        for (j = 0; j < 4; j++)
-                test_surface_st_init0i(&v[j], s, 4 * x + j, y);
-        util_format_pack_rgba(surface_fmts[i], p, v, 1);
-}
-
-static void test_surface_st_expectu(void *p, int s, int x, int y)
-{
-        uint32_t v[4];
-        int i = 0, j;
-
-        for (j = 0; j < 4; j++)
-                test_surface_st_init0i(&v[j], s, 4 * x + j, y);
-        util_format_pack_rgba(surface_fmts[i], p, v, 1);
-}
-
-static unsigned absdiff(uint32_t a, uint32_t b)
-{
-        return (a > b) ? (a - b) : (b - a);
-}
-
-static bool test_surface_st_check(void *x, void *y, int sz)
-{
-        int i = 0, j;
-
-        if (util_format_is_float(surface_fmts[i])) {
-                return fabs(*(float *)x - *(float *)y) < 3.92156863e-3;
-
-        } else if ((sz % 4) == 0) {
-                for (j = 0; j < sz / 4; j++)
-                        if (absdiff(((uint32_t *)x)[j],
-                                    ((uint32_t *)y)[j]) > 1)
-                                return false;
-                return true;
-        } else {
-                return !memcmp(x, y, sz);
-        }
-}
-
-static void test_surface_st(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], 2D, RAW\n"
-                "DCL RES[1], 2D, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "IMM UINT32 { 16, 1, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0], SV[0], IMM[0]\n"
-                "       LOAD TEMP[1], RES[0], TEMP[0]\n"
-                "       STORE RES[1], SV[0], TEMP[1]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-        int i = 0;
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 0, 0, 0, src, NULL);
-
-        for (i = 0; i < ARRAY_SIZE(surface_fmts); i++) {
-                bool is_signed = (util_format_description(surface_fmts[i])
-                                  ->channel[0].type == UTIL_FORMAT_TYPE_SIGNED);
-                bool is_int = util_format_is_pure_integer(surface_fmts[i]);
-
-                printf("   - %s\n", util_format_name(surface_fmts[i]));
-
-                if (!ctx->screen->is_format_supported(ctx->screen,
-                       surface_fmts[i], PIPE_TEXTURE_2D, 1, 1,
-                       PIPE_BIND_COMPUTE_RESOURCE)) {
-                   printf("(unsupported)\n");
-                   continue;
-                }
-
-                init_tex(ctx, 0, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
-                         512, 32, (is_int ? test_surface_st_init0i : test_surface_st_init0f));
-                init_tex(ctx, 1, PIPE_TEXTURE_2D, true, surface_fmts[i],
-                         128, 32, test_surface_st_init1);
-                init_compute_resources(ctx, (int []) { 0, 1, -1 });
-                init_sampler_states(ctx, 2);
-                launch_grid(ctx, (uint []){1, 1, 1}, (uint []){128, 32, 1}, 0,
-                            NULL);
-                check_tex(ctx, 1, (is_int && is_signed ? test_surface_st_expects :
-                                   is_int && !is_signed ? test_surface_st_expectu :
-                                   test_surface_st_expectf), test_surface_st_check);
-                destroy_sampler_states(ctx);
-                destroy_compute_resources(ctx);
-                destroy_tex(ctx);
-        }
-
-        destroy_prog(ctx);
-}
-
-/* test_barrier */
-static void test_barrier_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 31;
-}
-
-static void test_barrier(struct context *ctx)
-{
-        const char *src = "COMP\n"
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "DCL SV[0], BLOCK_ID[0]\n"
-                "DCL SV[1], BLOCK_SIZE[0]\n"
-                "DCL SV[2], THREAD_ID[0]\n"
-                "DCL TEMP[0], LOCAL\n"
-                "DCL TEMP[1], LOCAL\n"
-                "DCL TEMP[2], LOCAL\n"
-                "DCL TEMP[3], LOCAL\n"
-                "IMM UINT32 { 1, 0, 0, 0 }\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "IMM UINT32 { 32, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL TEMP[0].x, SV[2], IMM[1]\n"
-                "       MOV TEMP[1].x, IMM[0].wwww\n"
-                "       BGNLOOP\n"
-                "               BARRIER\n"
-                "               STORE RLOCAL.x, TEMP[0], TEMP[1]\n"
-                "               BARRIER\n"
-                "               MOV TEMP[2].x, IMM[0].wwww\n"
-                "               BGNLOOP\n"
-                "                       UMUL TEMP[3].x, TEMP[2], IMM[1]\n"
-                "                       LOAD TEMP[3].x, RLOCAL, TEMP[3]\n"
-                "                       USNE TEMP[3].x, TEMP[3], TEMP[1]\n"
-                "                       IF TEMP[3]\n"
-                "                               END\n"
-                "                       ENDIF\n"
-                "                       UADD TEMP[2].x, TEMP[2], IMM[0]\n"
-                "                       USEQ TEMP[3].x, TEMP[2], SV[1]\n"
-                "                       IF TEMP[3]\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "               UADD TEMP[1].x, TEMP[1], IMM[0]\n"
-                "               USEQ TEMP[2].x, TEMP[1], IMM[2]\n"
-                "               IF TEMP[2]\n"
-                "                       BRK\n"
-                "               ENDIF\n"
-                "       ENDLOOP\n"
-                "       UMUL TEMP[1].x, SV[0], SV[1]\n"
-                "       UMUL TEMP[1].x, TEMP[1], IMM[1]\n"
-                "       UADD TEMP[1].x, TEMP[1], TEMP[0]\n"
-                "       LOAD TEMP[0].x, RLOCAL, TEMP[0]\n"
-                "       STORE RES[0].x, TEMP[1], TEMP[0]\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s\n", __func__);
-
-        init_prog(ctx, 256, 0, 0, src, NULL);
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 4096, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){64, 1, 1}, (uint []){16, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_barrier_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_atom_ops */
-static void test_atom_ops_init(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = 0xbad;
-}
-
-static void test_atom_ops_expect(void *p, int s, int x, int y)
-{
-        switch (x) {
-        case 0:
-                *(uint32_t *)p = 0xce6c8eef;
-                break;
-        case 1:
-                *(uint32_t *)p = 0xdeadbeef;
-                break;
-        case 2:
-                *(uint32_t *)p = 0x11111111;
-                break;
-        case 3:
-                *(uint32_t *)p = 0x10011001;
-                break;
-        case 4:
-                *(uint32_t *)p = 0xdfbdbfff;
-                break;
-        case 5:
-                *(uint32_t *)p = 0x11111111;
-                break;
-        case 6:
-                *(uint32_t *)p = 0x11111111;
-                break;
-        case 7:
-                *(uint32_t *)p = 0xdeadbeef;
-                break;
-        case 8:
-                *(uint32_t *)p = 0xdeadbeef;
-                break;
-        case 9:
-                *(uint32_t *)p = 0x11111111;
-                break;
-        }
-}
-
-static void test_atom_ops(struct context *ctx, bool global)
-{
-        const char *src = "COMP\n"
-                "#ifdef TARGET_GLOBAL\n"
-                "#define target RES[0]\n"
-                "#else\n"
-                "#define target RLOCAL\n"
-                "#endif\n"
-                ""
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                "#define threadid SV[0]\n"
-                "DCL threadid, THREAD_ID[0]\n"
-                ""
-                "#define offset TEMP[0]\n"
-                "DCL offset, LOCAL\n"
-                "#define tmp TEMP[1]\n"
-                "DCL tmp, LOCAL\n"
-                ""
-                "#define k0 IMM[0]\n"
-                "IMM UINT32 { 0, 0, 0, 0 }\n"
-                "#define k1 IMM[1]\n"
-                "IMM UINT32 { 1, 0, 0, 0 }\n"
-                "#define k2 IMM[2]\n"
-                "IMM UINT32 { 2, 0, 0, 0 }\n"
-                "#define k3 IMM[3]\n"
-                "IMM UINT32 { 3, 0, 0, 0 }\n"
-                "#define k4 IMM[4]\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "#define k5 IMM[5]\n"
-                "IMM UINT32 { 5, 0, 0, 0 }\n"
-                "#define k6 IMM[6]\n"
-                "IMM UINT32 { 6, 0, 0, 0 }\n"
-                "#define k7 IMM[7]\n"
-                "IMM UINT32 { 7, 0, 0, 0 }\n"
-                "#define k8 IMM[8]\n"
-                "IMM UINT32 { 8, 0, 0, 0 }\n"
-                "#define k9 IMM[9]\n"
-                "IMM UINT32 { 9, 0, 0, 0 }\n"
-                "#define korig IMM[10].xxxx\n"
-                "#define karg IMM[10].yyyy\n"
-                "IMM UINT32 { 3735928559, 286331153, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       UMUL offset.x, threadid, k4\n"
-                "       STORE target.x, offset, korig\n"
-                "       USEQ tmp.x, threadid, k0\n"
-                "       IF tmp\n"
-                "               ATOMUADD tmp.x, target, offset, karg\n"
-                "               ATOMUADD tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k1\n"
-                "       IF tmp\n"
-                "               ATOMXCHG tmp.x, target, offset, karg\n"
-                "               ATOMXCHG tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k2\n"
-                "       IF tmp\n"
-                "               ATOMCAS tmp.x, target, offset, korig, karg\n"
-                "               ATOMCAS tmp.x, target, offset, tmp, k0\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k3\n"
-                "       IF tmp\n"
-                "               ATOMAND tmp.x, target, offset, karg\n"
-                "               ATOMAND tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k4\n"
-                "       IF tmp\n"
-                "               ATOMOR tmp.x, target, offset, karg\n"
-                "               ATOMOR tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k5\n"
-                "       IF tmp\n"
-                "               ATOMXOR tmp.x, target, offset, karg\n"
-                "               ATOMXOR tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k6\n"
-                "       IF tmp\n"
-                "               ATOMUMIN tmp.x, target, offset, karg\n"
-                "               ATOMUMIN tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k7\n"
-                "       IF tmp\n"
-                "               ATOMUMAX tmp.x, target, offset, karg\n"
-                "               ATOMUMAX tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k8\n"
-                "       IF tmp\n"
-                "               ATOMIMIN tmp.x, target, offset, karg\n"
-                "               ATOMIMIN tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "       USEQ tmp.x, threadid, k9\n"
-                "       IF tmp\n"
-                "               ATOMIMAX tmp.x, target, offset, karg\n"
-                "               ATOMIMAX tmp.x, target, offset, tmp\n"
-                "       ENDIF\n"
-                "#ifdef TARGET_LOCAL\n"
-                "       LOAD tmp.x, RLOCAL, offset\n"
-                "       STORE RES[0].x, offset, tmp\n"
-                "#endif\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s (%s)\n", __func__, global ? "global" : "local");
-
-        init_prog(ctx, 40, 0, 0, src,
-                  (global ? "-DTARGET_GLOBAL" : "-DTARGET_LOCAL"));
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 40, 0, test_atom_ops_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){10, 1, 1}, (uint []){1, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_atom_ops_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-/* test_atom_race */
-static void test_atom_race_expect(void *p, int s, int x, int y)
-{
-        *(uint32_t *)p = x & 0x20 ? 0x11111111 : 0xffffffff;
-}
-
-static void test_atom_race(struct context *ctx, bool global)
-{
-        const char *src = "COMP\n"
-                "#ifdef TARGET_GLOBAL\n"
-                "#define target RES[0]\n"
-                "#else\n"
-                "#define target RLOCAL\n"
-                "#endif\n"
-                ""
-                "DCL RES[0], BUFFER, RAW, WR\n"
-                ""
-                "#define blockid SV[0]\n"
-                "DCL blockid, BLOCK_ID[0]\n"
-                "#define blocksz SV[1]\n"
-                "DCL blocksz, BLOCK_SIZE[0]\n"
-                "#define threadid SV[2]\n"
-                "DCL threadid, THREAD_ID[0]\n"
-                ""
-                "#define offset TEMP[0]\n"
-                "DCL offset, LOCAL\n"
-                "#define arg TEMP[1]\n"
-                "DCL arg, LOCAL\n"
-                "#define count TEMP[2]\n"
-                "DCL count, LOCAL\n"
-                "#define vlocal TEMP[3]\n"
-                "DCL vlocal, LOCAL\n"
-                "#define vshared TEMP[4]\n"
-                "DCL vshared, LOCAL\n"
-                "#define last TEMP[5]\n"
-                "DCL last, LOCAL\n"
-                "#define tmp0 TEMP[6]\n"
-                "DCL tmp0, LOCAL\n"
-                "#define tmp1 TEMP[7]\n"
-                "DCL tmp1, LOCAL\n"
-                ""
-                "#define k0 IMM[0]\n"
-                "IMM UINT32 { 0, 0, 0, 0 }\n"
-                "#define k1 IMM[1]\n"
-                "IMM UINT32 { 1, 0, 0, 0 }\n"
-                "#define k4 IMM[2]\n"
-                "IMM UINT32 { 4, 0, 0, 0 }\n"
-                "#define k32 IMM[3]\n"
-                "IMM UINT32 { 32, 0, 0, 0 }\n"
-                "#define k128 IMM[4]\n"
-                "IMM UINT32 { 128, 0, 0, 0 }\n"
-                "#define kdeadcafe IMM[5]\n"
-                "IMM UINT32 { 3735931646, 0, 0, 0 }\n"
-                "#define kallowed_set IMM[6]\n"
-                "IMM UINT32 { 559035650, 0, 0, 0 }\n"
-                "#define k11111111 IMM[7]\n"
-                "IMM UINT32 { 286331153, 0, 0, 0 }\n"
-                "\n"
-                "    BGNSUB\n"
-                "       MOV offset.x, threadid\n"
-                "#ifdef TARGET_GLOBAL\n"
-                "       UMUL tmp0.x, blockid, blocksz\n"
-                "       UADD offset.x, offset, tmp0\n"
-                "#endif\n"
-                "       UMUL offset.x, offset, k4\n"
-                "       USLT tmp0.x, threadid, k32\n"
-                "       STORE target.x, offset, k0\n"
-                "       BARRIER\n"
-                "       IF tmp0\n"
-                "               MOV vlocal.x, k0\n"
-                "               MOV arg.x, kdeadcafe\n"
-                "               BGNLOOP\n"
-                "                       INEG arg.x, arg\n"
-                "                       ATOMUADD vshared.x, target, offset, arg\n"
-                "                       SFENCE target\n"
-                "                       USNE tmp0.x, vshared, vlocal\n"
-                "                       IF tmp0\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "                       UADD vlocal.x, vlocal, arg\n"
-                "               ENDLOOP\n"
-                "               UADD vlocal.x, vshared, arg\n"
-                "               LOAD vshared.x, target, offset\n"
-                "               USEQ tmp0.x, vshared, vlocal\n"
-                "               STORE target.x, offset, tmp0\n"
-                "       ELSE\n"
-                "               UADD offset.x, offset, -k128\n"
-                "               MOV count.x, k0\n"
-                "               MOV last.x, k0\n"
-                "               BGNLOOP\n"
-                "                       LOAD vshared.x, target, offset\n"
-                "                       USEQ tmp0.x, vshared, kallowed_set.xxxx\n"
-                "                       USEQ tmp1.x, vshared, kallowed_set.yyyy\n"
-                "                       OR tmp0.x, tmp0, tmp1\n"
-                "                       IF tmp0\n"
-                "                               USEQ tmp0.x, vshared, last\n"
-                "                               IF tmp0\n"
-                "                                       CONT\n"
-                "                               ENDIF\n"
-                "                               MOV last.x, vshared\n"
-                "                       ELSE\n"
-                "                               END\n"
-                "                       ENDIF\n"
-                "                       UADD count.x, count, k1\n"
-                "                       USEQ tmp0.x, count, k128\n"
-                "                       IF tmp0\n"
-                "                               BRK\n"
-                "                       ENDIF\n"
-                "               ENDLOOP\n"
-                "               ATOMXCHG tmp0.x, target, offset, k11111111\n"
-                "               UADD offset.x, offset, k128\n"
-                "               ATOMXCHG tmp0.x, target, offset, k11111111\n"
-                "               SFENCE target\n"
-                "       ENDIF\n"
-                "#ifdef TARGET_LOCAL\n"
-                "       LOAD tmp0.x, RLOCAL, offset\n"
-                "       UMUL tmp1.x, blockid, blocksz\n"
-                "       UMUL tmp1.x, tmp1, k4\n"
-                "       UADD offset.x, offset, tmp1\n"
-                "       STORE RES[0].x, offset, tmp0\n"
-                "#endif\n"
-                "       RET\n"
-                "    ENDSUB\n";
-
-        printf("- %s (%s)\n", __func__, global ? "global" : "local");
-
-        init_prog(ctx, 256, 0, 0, src,
-                  (global ? "-DTARGET_GLOBAL" : "-DTARGET_LOCAL"));
-        init_tex(ctx, 0, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
-                 4096, 0, test_default_init);
-        init_compute_resources(ctx, (int []) { 0, -1 });
-        launch_grid(ctx, (uint []){64, 1, 1}, (uint []){16, 1, 1}, 0, NULL);
-        check_tex(ctx, 0, test_atom_race_expect, NULL);
-        destroy_compute_resources(ctx);
-        destroy_tex(ctx);
-        destroy_prog(ctx);
-}
-
-int main(int argc, char *argv[])
-{
-        struct context *ctx = CALLOC_STRUCT(context);
-
-        unsigned tests = (argc > 1) ? strtoul(argv[1], NULL, 0) : ~0;
-
-        init_ctx(ctx);
-
-        if (tests & (1 << 0))
-           test_system_values(ctx);
-        if (tests & (1 << 1))
-           test_resource_access(ctx);
-        if (tests & (1 << 2))
-           test_function_calls(ctx);
-        if (tests & (1 << 3))
-           test_input_global(ctx);
-        if (tests & (1 << 4))
-           test_private(ctx);
-        if (tests & (1 << 5))
-           test_local(ctx);
-        if (tests & (1 << 6))
-           test_sample(ctx);
-        if (tests & (1 << 7))
-           test_many_kern(ctx);
-        if (tests & (1 << 8))
-           test_constant(ctx);
-        if (tests & (1 << 9))
-           test_resource_indirect(ctx);
-        if (tests & (1 << 10))
-           test_surface_ld(ctx);
-        if (tests & (1 << 11))
-           test_surface_st(ctx);
-        if (tests & (1 << 12))
-           test_barrier(ctx);
-        if (tests & (1 << 13))
-           test_atom_ops(ctx, true);
-        if (tests & (1 << 14))
-           test_atom_race(ctx, true);
-        if (tests & (1 << 15))
-           test_atom_ops(ctx, false);
-        if (tests & (1 << 16))
-           test_atom_race(ctx, false);
-
-        destroy_ctx(ctx);
-
-        return 0;
-}
index a54e71d..a2286af 100644 (file)
@@ -18,7 +18,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-foreach t : ['compute', 'tri', 'quad-tex']
+foreach t : ['tri', 'quad-tex']
   executable(
     t,
     '@0@.c'.format(t),