[Mesa-dev] [PATCH v2] gallium/tests: fix build with clang compiler

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Dec 1 06:38:43 PST 2015



On 12/01/2015 02:44 PM, Serge Martin wrote:
> On Sunday 29 November 2015 15:23:37 Samuel Pitoiset wrote:
>> Nested functions are supported as an extension in GNU C, but Clang
>> don't support them.
>>
>> This fixes compilation errors when (manually) building compute.c,
>> or by setting --enable-gallium-tests to the configure script.
>>
>> Changes from v2:
>>   - fix typo
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75165
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/gallium/tests/trivial/compute.c | 643
>> +++++++++++++++++++++--------------- 1 file changed, 370 insertions(+), 273
>> deletions(-)
>>
>> diff --git a/src/gallium/tests/trivial/compute.c
>> b/src/gallium/tests/trivial/compute.c index bcdfb11..5472cf6 100644
>> --- a/src/gallium/tests/trivial/compute.c
>> +++ b/src/gallium/tests/trivial/compute.c
>> @@ -428,6 +428,35 @@ static void launch_grid(struct context *ctx, const uint
>> *block_layout, pipe->launch_grid(pipe, block_layout, grid_layout, pc,
>> input); }
>>
>> +/* test_system_values */
>> +static void test_system_values_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>
> there is 7 functions looking like
> static void test_*_init(void *p, int s, int x, int y)
> {
>          *(uint32_t *)p = 0xdeadbeef;
> }
>
> does it make sense to have something like
> static void test_default_init(void *p, int s, int x, int y)  ?

Yeah, this could save few LOC I assume.
I'll have a look.

>
>> +
>> +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"
>> @@ -461,44 +490,36 @@ static void test_system_values(struct context *ctx)
>>                   "  STORE RES[0].xyzw, TEMP[0], SV[3]\n"
>>                   "  RET\n"
>>                   "ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void 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;
>> -                }
>> -        }
>>
>>           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, init);
>> +                 76800, 0, test_system_values_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, expect, 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_init1(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -519,31 +540,33 @@ static void test_resource_access(struct context *ctx)
>>                   "       STORE RES[1].xyzw, TEMP[1], TEMP[0]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init0(void *p, int s, int x, int y) {
>> -                *(float *)p = 8.0 - (float)x;
>> -        }
>> -        void init1(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(float *)p = 8.0 - (float)((x + 4*y) & 0x3f);
>> -        }
>>
>>           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, init0);
>> +                 256, 0, test_resource_access_init0);
>>           init_tex(ctx, 1, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
>> -                 60, 12, init1);
>> +                 60, 12, test_resource_access_init1);
>>           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, expect, 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"
>> @@ -585,26 +608,31 @@ static void test_function_calls(struct context *ctx)
>>                   "21:  STORE RES[0].x, TEMP[2], TEMP[1].xxxx\n"
>>                   "22:  RET\n"
>>                   "23: ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 15 * y + x;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = (15 * y + x) < 4 ? 2 : 1 ;
>> -        }
>>
>>           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, init);
>> +                 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, expect, 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_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -621,35 +649,44 @@ static void test_input_global(struct context *ctx)
>>                   "       STORE RGLOBAL.x, TEMP[1].yyyy, TEMP[1]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef - (x == 0 ? 0x10001 + 2 * s :
>> 0); -        }
>>           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,
>> init); -        init_tex(ctx, 1, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
>> 32, 0, init); -        init_tex(ctx, 2, PIPE_BUFFER, true,
>> PIPE_FORMAT_R32_FLOAT, 32, 0, init); -        init_tex(ctx, 3, PIPE_BUFFER,
>> true, PIPE_FORMAT_R32_FLOAT, 32, 0, init); +        init_tex(ctx, 0,
>> PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0, +
>> test_input_global_init);
>> +        init_tex(ctx, 1, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
>> +                 test_input_global_init);
>> +        init_tex(ctx, 2, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
>> +                 test_input_global_init);
>> +        init_tex(ctx, 3, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT, 32, 0,
>> +                 test_input_global_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, expect, NULL);
>> -        check_tex(ctx, 1, expect, NULL);
>> -        check_tex(ctx, 2, expect, NULL);
>> -        check_tex(ctx, 3, expect, NULL);
>> +        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_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -691,26 +728,31 @@ static void test_private(struct context *ctx)
>>                   "       ENDLOOP\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = (x / 32) + x % 32;
>> -        }
>>
>>           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, init);
>> +                 32768, 0, test_private_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, expect, 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_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -778,26 +820,42 @@ static void test_local(struct context *ctx)
>>                   "       STORE RES[0].x, TEMP[1], TEMP[0]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = x & 0x20 ? 2 : 1;
>> -        }
>>
>>           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, init);
>> +                 4096, 0, test_local_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, expect, 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"
>> @@ -818,36 +876,19 @@ static void test_sample(struct context *ctx)
>>                   "       STORE RES[0].xyzw, TEMP[0], TEMP[1]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(float *)p = s ? 1 : x * y;
>> -        }
>> -        void 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;
>> -                }
>> -        }
>>
>>           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, init);
>> +                 128, 32, test_sample_init);
>>           init_tex(ctx, 1, PIPE_TEXTURE_2D, true, PIPE_FORMAT_R32_FLOAT,
>> -                 512, 32, init);
>> +                 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, expect, NULL);
>> +        check_tex(ctx, 1, test_sample_expect, NULL);
>>           destroy_sampler_states(ctx);
>>           destroy_sampler_views(ctx);
>>           destroy_compute_resources(ctx);
>> @@ -855,6 +896,17 @@ static void test_sample(struct context *ctx)
>>           destroy_prog(ctx);
>>   }
>>
>> +/* test_many_kern */
>> +static void test_many_kern_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -883,29 +935,34 @@ static void test_many_kern(struct context *ctx)
>>                   "       STORE RES[0].x, TEMP[0], IMM[0].wwww\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = x;
>> -        }
>>
>>           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, init);
>> +                 16, 0, test_many_kern_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, expect, 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"
>> @@ -922,28 +979,36 @@ static void test_constant(struct context *ctx)
>>                   "       STORE RES[1].x, TEMP[0], TEMP[1]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(float *)p = s ? 0xdeadbeef : 8.0 - (float)x;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(float *)p = 8.0 - (float)x;
>> -        }
>>
>>           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, init);
>> +                 256, 0, test_constant_init);
>>           init_tex(ctx, 1, PIPE_BUFFER, true, PIPE_FORMAT_R32_FLOAT,
>> -                 256, 0, init);
>> +                 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, expect, 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"
>> @@ -961,35 +1026,27 @@ static void test_resource_indirect(struct context
>> *ctx) "       STORE RES[0].x, TEMP[0], TEMP[1]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void 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;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -           *(uint32_t *)p = 2 * x + (x % 2 ? 1 : 0);
>> -        }
>>
>>           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, init);
>> +                 256, 0, test_resource_indirect_init);
>>           init_tex(ctx, 1, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
>> -                 256, 0, init);
>> +                 256, 0, test_resource_indirect_init);
>>           init_tex(ctx, 2, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
>> -                 256, 0, init);
>> +                 256, 0, test_resource_indirect_init);
>>           init_tex(ctx, 3, PIPE_BUFFER, false, PIPE_FORMAT_R32_FLOAT,
>> -                 256, 0, init);
>> +                 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, expect, 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,
>> @@ -1023,6 +1080,47 @@ enum pipe_format surface_fmts[] = {
>>           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_write_4f(surface_fmts[i], v, 0, p, 0, 0, 0, 1, 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_write_4i(surface_fmts[i], v, 0, p, 0, 0, 0, 1, 1);
>> +}
>> +
>> +static void test_surface_ld_init1(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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_read_4f(surface_fmts[i], w, 0, v, 0, 0, 0, 1, 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_read_4i(surface_fmts[i], w, 0, v, 0, 0, 0, 1, 1);
>> +        *(uint32_t *)p = w[x % 4];
>> +}
>> +
>>   static void test_surface_ld(struct context *ctx)
>>   {
>>           const char *src = "COMP\n"
>> @@ -1040,33 +1138,6 @@ static void test_surface_ld(struct context *ctx)
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>>           int i = 0;
>> -        void init0f(void *p, int s, int x, int y) {
>> -                float v[] = { 1.0, -.75, .50, -.25 };
>> -                util_format_write_4f(surface_fmts[i], v, 0,
>> -                                     p, 0, 0, 0, 1, 1);
>> -        }
>> -        void init0i(void *p, int s, int x, int y) {
>> -                int v[] = { 0xffffffff, 0xffff, 0xff, 0xf };
>> -                util_format_write_4i(surface_fmts[i], v, 0,
>> -                                     p, 0, 0, 0, 1, 1);
>> -        }
>> -        void init1(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expectf(void *p, int s, int x, int y) {
>> -                float v[4], w[4];
>> -                init0f(v, s, x / 4, y);
>> -                util_format_read_4f(surface_fmts[i], w, 0,
>> -                                    v, 0, 0, 0, 1, 1);
>> -                *(float *)p = w[x % 4];
>> -        }
>> -        void expecti(void *p, int s, int x, int y) {
>> -                int32_t v[4], w[4];
>> -                init0i(v, s, x / 4, y);
>> -                util_format_read_4i(surface_fmts[i], w, 0,
>> -                                    v, 0, 0, 0, 1, 1);
>> -                *(uint32_t *)p = w[x % 4];
>> -        }
>>
>>           printf("- %s\n", __func__);
>>
>> @@ -1085,14 +1156,14 @@ static void test_surface_ld(struct context *ctx)
>>                   }
>>
>>                   init_tex(ctx, 0, PIPE_TEXTURE_2D, true, surface_fmts[i],
>> -                         128, 32, (is_int ? init0i : init0f));
>> +                         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, init1);
>> +                         512, 32, test_surface_ld_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 ? expecti : expectf), 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);
>> @@ -1101,6 +1172,73 @@ static void test_surface_ld(struct context *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_write_4f(surface_fmts[i], vf, 0, p, 0, 0, 0, 1, 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_write_4i(surface_fmts[i], v, 0, p, 0, 0, 0, 1, 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_write_4ui(surface_fmts[i], v, 0, p, 0, 0, 0, 1, 1);
>> +}
>> +
>> +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 (abs(((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"
>> @@ -1118,60 +1256,6 @@ static void test_surface_st(struct context *ctx)
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>>           int i = 0;
>> -        void init0f(void *p, int s, int x, int y) {
>> -                float v[] = { 1.0, -.75, 0.5, -.25 };
>> -                *(float *)p = v[x % 4];
>> -        }
>> -        void init0i(void *p, int s, int x, int y) {
>> -                int v[] = { 0xffffffff, 0xffff, 0xff, 0xf };
>> -                *(int32_t *)p = v[x % 4];
>> -        }
>> -        void init1(void *p, int s, int x, int y) {
>> -                memset(p, 1, util_format_get_blocksize(surface_fmts[i]));
>> -        }
>> -        void expectf(void *p, int s, int x, int y) {
>> -                float vf[4];
>> -                int j;
>> -
>> -                for (j = 0; j < 4; j++)
>> -                        init0f(&vf[j], s, 4 * x + j, y);
>> -                util_format_write_4f(surface_fmts[i], vf, 0,
>> -                                     p, 0, 0, 0, 1, 1);
>> -        }
>> -        void expects(void *p, int s, int x, int y) {
>> -                int32_t v[4];
>> -                int j;
>> -
>> -                for (j = 0; j < 4; j++)
>> -                        init0i(&v[j], s, 4 * x + j, y);
>> -                util_format_write_4i(surface_fmts[i], v, 0,
>> -                                     p, 0, 0, 0, 1, 1);
>> -        }
>> -        void expectu(void *p, int s, int x, int y) {
>> -                uint32_t v[4];
>> -                int j;
>> -
>> -                for (j = 0; j < 4; j++)
>> -                        init0i(&v[j], s, 4 * x + j, y);
>> -                util_format_write_4ui(surface_fmts[i], v, 0,
>> -                                      p, 0, 0, 0, 1, 1);
>> -        }
>> -        bool check(void *x, void *y, int sz) {
>> -                int 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 (abs(((uint32_t *)x)[j] -
>> -                                        ((uint32_t *)y)[j]) > 1)
>> -                                        return false;
>> -                        return true;
>> -                } else {
>> -                        return !memcmp(x, y, sz);
>> -                }
>> -        }
>>
>>           printf("- %s\n", __func__);
>>
>> @@ -1192,16 +1276,16 @@ static void test_surface_st(struct context *ctx)
>>                   }
>>
>>                   init_tex(ctx, 0, PIPE_TEXTURE_2D, true,
>> PIPE_FORMAT_R32_FLOAT, -                         512, 32, (is_int ? init0i
>> : init0f));
>> +                         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, init1);
>> +                         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 ? expects :
>> -                                   is_int && !is_signed ? expectu :
>> -                                   expectf), check);
>> +                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);
>> @@ -1210,6 +1294,17 @@ static void test_surface_st(struct context *ctx)
>>           destroy_prog(ctx);
>>   }
>>
>> +/* test_barrier */
>> +static void test_barrier_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -1259,26 +1354,62 @@ static void test_barrier(struct context *ctx)
>>                   "       STORE RES[0].x, TEMP[1], TEMP[0]\n"
>>                   "       RET\n"
>>                   "    ENDSUB\n";
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 31;
>> -        }
>>
>>           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, init);
>> +                 4096, 0, test_barrier_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, expect, 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"
>> @@ -1381,58 +1512,31 @@ static void test_atom_ops(struct context *ctx, bool
>> global) "       RET\n"
>>                   "    ENDSUB\n";
>>
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xbad;
>> -        }
>> -        void 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;
>> -                }
>> -        }
>> -
>>           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, init);
>> +                 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, expect, 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_init(void *p, int s, int x, int y)
>> +{
>> +        *(uint32_t *)p = 0xdeadbeef;
>> +}
>> +
>> +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"
>> @@ -1551,22 +1655,15 @@ static void test_atom_race(struct context *ctx, bool
>> global) "       RET\n"
>>                   "    ENDSUB\n";
>>
>> -        void init(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = 0xdeadbeef;
>> -        }
>> -        void expect(void *p, int s, int x, int y) {
>> -                *(uint32_t *)p = x & 0x20 ? 0x11111111 : 0xffffffff;
>> -        }
>> -
>>           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, init);
>> +                 4096, 0, test_atom_race_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, expect, NULL);
>> +        check_tex(ctx, 0, test_atom_race_expect, NULL);
>>           destroy_compute_resources(ctx);
>>           destroy_tex(ctx);
>>           destroy_prog(ctx);
>

-- 
-Samuel


More information about the mesa-dev mailing list