~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/intel/vulkan/tests/state_pool_no_free.c

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright © 2015 Intel Corporation
3
 
 *
4
 
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 
 * copy of this software and associated documentation files (the "Software"),
6
 
 * to deal in the Software without restriction, including without limitation
7
 
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 
 * and/or sell copies of the Software, and to permit persons to whom the
9
 
 * Software is furnished to do so, subject to the following conditions:
10
 
 *
11
 
 * The above copyright notice and this permission notice (including the next
12
 
 * paragraph) shall be included in all copies or substantial portions of the
13
 
 * Software.
14
 
 *
15
 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
 
 * IN THE SOFTWARE.
22
 
 */
23
 
 
24
 
#include <pthread.h>
25
 
 
26
 
#include "anv_private.h"
27
 
#include "test_common.h"
28
 
 
29
 
#define NUM_THREADS 16
30
 
#define STATES_PER_THREAD 1024
31
 
#define NUM_RUNS 64
32
 
 
33
 
struct job {
34
 
   pthread_t thread;
35
 
   unsigned id;
36
 
   struct anv_state_pool *pool;
37
 
   uint32_t offsets[STATES_PER_THREAD];
38
 
} jobs[NUM_THREADS];
39
 
 
40
 
pthread_barrier_t barrier;
41
 
 
42
 
static void *alloc_states(void *_job)
43
 
{
44
 
   struct job *job = _job;
45
 
 
46
 
   pthread_barrier_wait(&barrier);
47
 
 
48
 
   for (unsigned i = 0; i < STATES_PER_THREAD; i++) {
49
 
      struct anv_state state = anv_state_pool_alloc(job->pool, 16, 16);
50
 
      job->offsets[i] = state.offset;
51
 
   }
52
 
 
53
 
   return NULL;
54
 
}
55
 
 
56
 
static void run_test()
57
 
{
58
 
   struct anv_physical_device physical_device = { };
59
 
   struct anv_device device = {
60
 
      .physical = &physical_device,
61
 
   };
62
 
   struct anv_state_pool state_pool;
63
 
 
64
 
   pthread_mutex_init(&device.mutex, NULL);
65
 
   anv_bo_cache_init(&device.bo_cache, &device);
66
 
   anv_state_pool_init(&state_pool, &device, "test", 4096, 0, 64);
67
 
 
68
 
   pthread_barrier_init(&barrier, NULL, NUM_THREADS);
69
 
 
70
 
   for (unsigned i = 0; i < NUM_THREADS; i++) {
71
 
      jobs[i].pool = &state_pool;
72
 
      jobs[i].id = i;
73
 
      pthread_create(&jobs[i].thread, NULL, alloc_states, &jobs[i]);
74
 
   }
75
 
 
76
 
   for (unsigned i = 0; i < NUM_THREADS; i++)
77
 
      pthread_join(jobs[i].thread, NULL);
78
 
 
79
 
   /* A list of indices, one per thread */
80
 
   unsigned next[NUM_THREADS];
81
 
   memset(next, 0, sizeof(next));
82
 
 
83
 
   int highest = -1;
84
 
   while (true) {
85
 
      /* First, we find which thread has the highest next element */
86
 
      int thread_max = -1;
87
 
      int max_thread_idx = -1;
88
 
      for (unsigned i = 0; i < NUM_THREADS; i++) {
89
 
         if (next[i] >= STATES_PER_THREAD)
90
 
            continue;
91
 
 
92
 
         if (thread_max < jobs[i].offsets[next[i]]) {
93
 
            thread_max = jobs[i].offsets[next[i]];
94
 
            max_thread_idx = i;
95
 
         }
96
 
      }
97
 
 
98
 
      /* The only way this can happen is if all of the next[] values are at
99
 
       * BLOCKS_PER_THREAD, in which case, we're done.
100
 
       */
101
 
      if (thread_max == -1)
102
 
         break;
103
 
 
104
 
      /* That next element had better be higher than the previous highest */
105
 
      ASSERT(jobs[max_thread_idx].offsets[next[max_thread_idx]] > highest);
106
 
 
107
 
      highest = jobs[max_thread_idx].offsets[next[max_thread_idx]];
108
 
      next[max_thread_idx]++;
109
 
   }
110
 
 
111
 
   anv_state_pool_finish(&state_pool);
112
 
   anv_bo_cache_finish(&device.bo_cache);
113
 
   pthread_mutex_destroy(&device.mutex);
114
 
}
115
 
 
116
 
int main(void)
117
 
{
118
 
   for (unsigned i = 0; i < NUM_RUNS; i++)
119
 
      run_test();
120
 
}