aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/compute/skc/grid.h
blob: 006625efd1c6ae61ef5d9c1c7a81ebb7a15e47af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can
 * be found in the LICENSE file.
 *
 */

#pragma once

//
//
//

#include "handle.h"
#include "scheduler.h"

//
// The requirement is that every grid struct begin with an skc_grid_t
//

typedef struct skc_grid      * skc_grid_t;
typedef struct skc_grid_deps * skc_grid_deps_t;

//
//
//

typedef void (* skc_grid_pfn)(skc_grid_t const grid);

//
//
//

#define SKC_IS_GRID_INVALID(grid)  (grid == NULL)

//
//
//

#define SKC_GRID_DEPS_ATTACH(deps,addr,data,waiting_pfn,execute_pfn,dispose_pfn) \
  skc_grid_deps_attach(deps,addr,data,                                  \
                       waiting_pfn,execute_pfn,dispose_pfn,             \
                       #waiting_pfn,#execute_pfn,#dispose_pfn)          \
//
//
//

skc_grid_deps_t
skc_grid_deps_create(struct skc_runtime   * const runtime,
                     struct skc_scheduler * const scheduler,
                     skc_uint               const handle_pool_size);

void
skc_grid_deps_dispose(skc_grid_deps_t const deps);

//
//
//

#ifndef NDEBUG
void
skc_grid_deps_debug(struct skc_grid_deps const * const deps);
#endif

//
//
//

skc_grid_t
skc_grid_deps_attach(skc_grid_deps_t const deps,
                     skc_grid_t    * const addr,
                     void          * const data,
                     skc_grid_pfn          waiting_pfn,  // upon READY         > WAITING
                     skc_grid_pfn          execute_pfn,  // upon READY/WAITING > EXECUTING
                     skc_grid_pfn          dispose_pfn,  // upon EXECUTING     > COMPLETE
                     char    const * const waiting_name,
                     char    const * const execute_name,
                     char    const * const dispose_name);

#if 0
//
// Not using this yet -- needs to properly detach and reclaim a ready
// grid's resources
//
void
skc_grid_detach(skc_grid_t const grid);
#endif

//
//
//

void *
skc_grid_get_data(skc_grid_t const grid);

void
skc_grid_set_data(skc_grid_t const grid, void * const data);

//
//
//

void
skc_grid_map(skc_grid_t const grid, skc_handle_t const handle);

//
//
//

void
skc_grid_deps_force(skc_grid_deps_t      const deps,
                    skc_handle_t const * const handles,
                    skc_uint             const count);

void
skc_grid_deps_unmap(skc_grid_deps_t      const deps,
                    skc_handle_t const * const handles,
                    skc_uint             const count);

//
//
//

void
skc_grid_happens_after_grid(skc_grid_t const after,
                            skc_grid_t const before);

void
skc_grid_happens_after_handle(skc_grid_t   const after,
                              skc_handle_t const before);

//
// should be called by host
//

void
skc_grid_start(skc_grid_t const grid);

void
skc_grid_force(skc_grid_t const grid);

//
// should be called by the scheduler
//

void
skc_grid_complete(skc_grid_t const grid);

//
//
//

#if 0
//
// delete when ready
//
skc_grid_t
skc_grid_move(skc_grid_t         const grid,
              skc_grid_state_e * const state,
              skc_grid_t       * const addr,
              void             * const data);
#endif

//
//
//