xref: /aosp_15_r20/external/mesa3d/src/microsoft/clc/compute_test.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <stdio.h>
25*61046927SAndroid Build Coastguard Worker #include <stdint.h>
26*61046927SAndroid Build Coastguard Worker #include <stdexcept>
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include <directx/d3d12.h>
29*61046927SAndroid Build Coastguard Worker #include <dxgi1_4.h>
30*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
31*61046927SAndroid Build Coastguard Worker #include <wrl.h>
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "clc_compiler.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker using std::runtime_error;
36*61046927SAndroid Build Coastguard Worker using Microsoft::WRL::ComPtr;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker inline D3D12_CPU_DESCRIPTOR_HANDLE
offset_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE handle,UINT offset)39*61046927SAndroid Build Coastguard Worker offset_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE handle, UINT offset)
40*61046927SAndroid Build Coastguard Worker {
41*61046927SAndroid Build Coastguard Worker    handle.ptr += offset;
42*61046927SAndroid Build Coastguard Worker    return handle;
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker inline size_t
align(size_t value,unsigned alignment)46*61046927SAndroid Build Coastguard Worker align(size_t value, unsigned alignment)
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker    assert(alignment > 0);
49*61046927SAndroid Build Coastguard Worker    return ((value + (alignment - 1)) / alignment) * alignment;
50*61046927SAndroid Build Coastguard Worker }
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker class ComputeTest : public ::testing::Test {
53*61046927SAndroid Build Coastguard Worker protected:
54*61046927SAndroid Build Coastguard Worker    struct Shader {
55*61046927SAndroid Build Coastguard Worker       std::shared_ptr<struct clc_binary> obj;
56*61046927SAndroid Build Coastguard Worker       std::shared_ptr<struct clc_parsed_spirv> metadata;
57*61046927SAndroid Build Coastguard Worker       std::shared_ptr<struct clc_dxil_object> dxil;
58*61046927SAndroid Build Coastguard Worker    };
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    static void
61*61046927SAndroid Build Coastguard Worker    enable_d3d12_debug_layer();
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    static IDXGIFactory4 *
64*61046927SAndroid Build Coastguard Worker    get_dxgi_factory();
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    static IDXGIAdapter1 *
67*61046927SAndroid Build Coastguard Worker    choose_adapter(IDXGIFactory4 *factory);
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    static ID3D12Device *
70*61046927SAndroid Build Coastguard Worker    create_device(IDXGIAdapter1 *adapter);
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    struct Resources {
addResources73*61046927SAndroid Build Coastguard Worker       void add(ComPtr<ID3D12Resource> res,
74*61046927SAndroid Build Coastguard Worker                D3D12_DESCRIPTOR_RANGE_TYPE type,
75*61046927SAndroid Build Coastguard Worker                unsigned spaceid,
76*61046927SAndroid Build Coastguard Worker                unsigned resid)
77*61046927SAndroid Build Coastguard Worker       {
78*61046927SAndroid Build Coastguard Worker          descs.push_back(res);
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker          if(!ranges.empty() &&
81*61046927SAndroid Build Coastguard Worker             ranges.back().RangeType == type &&
82*61046927SAndroid Build Coastguard Worker             ranges.back().RegisterSpace == spaceid &&
83*61046927SAndroid Build Coastguard Worker             ranges.back().BaseShaderRegister + ranges.back().NumDescriptors == resid) {
84*61046927SAndroid Build Coastguard Worker             ranges.back().NumDescriptors++;
85*61046927SAndroid Build Coastguard Worker             return;
86*61046927SAndroid Build Coastguard Worker          }
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker          D3D12_DESCRIPTOR_RANGE1 range;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker          range.RangeType = type;
91*61046927SAndroid Build Coastguard Worker          range.NumDescriptors = 1;
92*61046927SAndroid Build Coastguard Worker          range.BaseShaderRegister = resid;
93*61046927SAndroid Build Coastguard Worker          range.RegisterSpace = spaceid;
94*61046927SAndroid Build Coastguard Worker          range.OffsetInDescriptorsFromTableStart = descs.size() - 1;
95*61046927SAndroid Build Coastguard Worker          range.Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
96*61046927SAndroid Build Coastguard Worker          ranges.push_back(range);
97*61046927SAndroid Build Coastguard Worker       }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker       std::vector<D3D12_DESCRIPTOR_RANGE1> ranges;
100*61046927SAndroid Build Coastguard Worker       std::vector<ComPtr<ID3D12Resource>> descs;
101*61046927SAndroid Build Coastguard Worker    };
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12RootSignature>
104*61046927SAndroid Build Coastguard Worker    create_root_signature(const Resources &resources);
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12PipelineState>
107*61046927SAndroid Build Coastguard Worker    create_pipeline_state(ComPtr<ID3D12RootSignature> &root_sig,
108*61046927SAndroid Build Coastguard Worker                          const struct clc_dxil_object &dxil);
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
111*61046927SAndroid Build Coastguard Worker    create_buffer(int size, D3D12_HEAP_TYPE heap_type);
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
114*61046927SAndroid Build Coastguard Worker    create_upload_buffer_with_data(const void *data, size_t size);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
117*61046927SAndroid Build Coastguard Worker    create_sized_buffer_with_data(size_t buffer_size, const void *data,
118*61046927SAndroid Build Coastguard Worker                                  size_t data_size);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
create_buffer_with_data(const void * data,size_t size)121*61046927SAndroid Build Coastguard Worker    create_buffer_with_data(const void *data, size_t size)
122*61046927SAndroid Build Coastguard Worker    {
123*61046927SAndroid Build Coastguard Worker       return create_sized_buffer_with_data(size, data, size);
124*61046927SAndroid Build Coastguard Worker    }
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    void
127*61046927SAndroid Build Coastguard Worker    get_buffer_data(ComPtr<ID3D12Resource> res,
128*61046927SAndroid Build Coastguard Worker                    void *buf, size_t size);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    void
131*61046927SAndroid Build Coastguard Worker    resource_barrier(ComPtr<ID3D12Resource> &res,
132*61046927SAndroid Build Coastguard Worker                     D3D12_RESOURCE_STATES state_before,
133*61046927SAndroid Build Coastguard Worker                     D3D12_RESOURCE_STATES state_after);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    void
136*61046927SAndroid Build Coastguard Worker    execute_cmdlist();
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    void
139*61046927SAndroid Build Coastguard Worker    create_uav_buffer(ComPtr<ID3D12Resource> res,
140*61046927SAndroid Build Coastguard Worker                      size_t width, size_t byte_stride,
141*61046927SAndroid Build Coastguard Worker                      D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle);
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    void create_cbv(ComPtr<ID3D12Resource> res, size_t size,
144*61046927SAndroid Build Coastguard Worker                    D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
147*61046927SAndroid Build Coastguard Worker    add_uav_resource(Resources &resources, unsigned spaceid, unsigned resid,
148*61046927SAndroid Build Coastguard Worker                     const void *data = NULL, size_t num_elems = 0,
149*61046927SAndroid Build Coastguard Worker                     size_t elem_size = 0);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    ComPtr<ID3D12Resource>
152*61046927SAndroid Build Coastguard Worker    add_cbv_resource(Resources &resources, unsigned spaceid, unsigned resid,
153*61046927SAndroid Build Coastguard Worker                     const void *data, size_t size);
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    void
156*61046927SAndroid Build Coastguard Worker    SetUp() override;
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker    void
159*61046927SAndroid Build Coastguard Worker    TearDown() override;
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker    Shader
162*61046927SAndroid Build Coastguard Worker    compile(const std::vector<const char *> &sources,
163*61046927SAndroid Build Coastguard Worker            const std::vector<const char *> &compile_args = {},
164*61046927SAndroid Build Coastguard Worker            bool create_library = false);
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    Shader
167*61046927SAndroid Build Coastguard Worker    link(const std::vector<Shader> &sources,
168*61046927SAndroid Build Coastguard Worker         bool create_library = false);
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    Shader
171*61046927SAndroid Build Coastguard Worker    assemble(const char *source);
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    void
174*61046927SAndroid Build Coastguard Worker    configure(Shader &shader,
175*61046927SAndroid Build Coastguard Worker              const struct clc_runtime_kernel_conf *conf);
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker    void
178*61046927SAndroid Build Coastguard Worker    validate(Shader &shader);
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    template <typename T>
181*61046927SAndroid Build Coastguard Worker    Shader
specialize(Shader & shader,uint32_t id,T const & val)182*61046927SAndroid Build Coastguard Worker    specialize(Shader &shader, uint32_t id, T const& val)
183*61046927SAndroid Build Coastguard Worker    {
184*61046927SAndroid Build Coastguard Worker       Shader new_shader;
185*61046927SAndroid Build Coastguard Worker       new_shader.obj = std::shared_ptr<clc_binary>(new clc_binary{}, [](clc_binary *spirv)
186*61046927SAndroid Build Coastguard Worker          {
187*61046927SAndroid Build Coastguard Worker             clc_free_spirv(spirv);
188*61046927SAndroid Build Coastguard Worker             delete spirv;
189*61046927SAndroid Build Coastguard Worker          });
190*61046927SAndroid Build Coastguard Worker       if (!shader.metadata)
191*61046927SAndroid Build Coastguard Worker          configure(shader, NULL);
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker       clc_spirv_specialization spec;
194*61046927SAndroid Build Coastguard Worker       spec.id = id;
195*61046927SAndroid Build Coastguard Worker       memcpy(&spec.value, &val, sizeof(val));
196*61046927SAndroid Build Coastguard Worker       clc_spirv_specialization_consts consts;
197*61046927SAndroid Build Coastguard Worker       consts.specializations = &spec;
198*61046927SAndroid Build Coastguard Worker       consts.num_specializations = 1;
199*61046927SAndroid Build Coastguard Worker       if (!clc_specialize_spirv(shader.obj.get(), shader.metadata.get(), &consts, new_shader.obj.get()))
200*61046927SAndroid Build Coastguard Worker          throw runtime_error("failed to specialize");
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker       configure(new_shader, NULL);
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker       return new_shader;
205*61046927SAndroid Build Coastguard Worker    }
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    enum ShaderArgDirection {
208*61046927SAndroid Build Coastguard Worker       SHADER_ARG_INPUT = 1,
209*61046927SAndroid Build Coastguard Worker       SHADER_ARG_OUTPUT = 2,
210*61046927SAndroid Build Coastguard Worker       SHADER_ARG_INOUT = SHADER_ARG_INPUT | SHADER_ARG_OUTPUT,
211*61046927SAndroid Build Coastguard Worker    };
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker    class RawShaderArg {
214*61046927SAndroid Build Coastguard Worker    public:
RawShaderArg(enum ShaderArgDirection dir)215*61046927SAndroid Build Coastguard Worker       RawShaderArg(enum ShaderArgDirection dir) : dir(dir) { }
216*61046927SAndroid Build Coastguard Worker       virtual size_t get_elem_size() const = 0;
217*61046927SAndroid Build Coastguard Worker       virtual size_t get_num_elems() const = 0;
218*61046927SAndroid Build Coastguard Worker       virtual const void *get_data() const = 0;
219*61046927SAndroid Build Coastguard Worker       virtual void *get_data() = 0;
get_direction()220*61046927SAndroid Build Coastguard Worker       enum ShaderArgDirection get_direction() { return dir; }
221*61046927SAndroid Build Coastguard Worker    private:
222*61046927SAndroid Build Coastguard Worker       enum ShaderArgDirection dir;
223*61046927SAndroid Build Coastguard Worker    };
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker    class NullShaderArg : public RawShaderArg {
226*61046927SAndroid Build Coastguard Worker    public:
NullShaderArg()227*61046927SAndroid Build Coastguard Worker       NullShaderArg() : RawShaderArg(SHADER_ARG_INPUT) { }
get_elem_size()228*61046927SAndroid Build Coastguard Worker       size_t get_elem_size() const override { return 0; }
get_num_elems()229*61046927SAndroid Build Coastguard Worker       size_t get_num_elems() const override { return 0; }
get_data()230*61046927SAndroid Build Coastguard Worker       const void *get_data() const override { return NULL; }
get_data()231*61046927SAndroid Build Coastguard Worker       void *get_data() override { return NULL; }
232*61046927SAndroid Build Coastguard Worker    };
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker    template <typename T>
235*61046927SAndroid Build Coastguard Worker    class ShaderArg : public std::vector<T>, public RawShaderArg
236*61046927SAndroid Build Coastguard Worker    {
237*61046927SAndroid Build Coastguard Worker    public:
238*61046927SAndroid Build Coastguard Worker       ShaderArg(const T &v, enum ShaderArgDirection dir = SHADER_ARG_INOUT) :
239*61046927SAndroid Build Coastguard Worker          std::vector<T>({ v }), RawShaderArg(dir) { }
240*61046927SAndroid Build Coastguard Worker       ShaderArg(const std::vector<T> &v, enum ShaderArgDirection dir = SHADER_ARG_INOUT) :
241*61046927SAndroid Build Coastguard Worker          std::vector<T>(v), RawShaderArg(dir) { }
242*61046927SAndroid Build Coastguard Worker       ShaderArg(const std::initializer_list<T> v, enum ShaderArgDirection dir = SHADER_ARG_INOUT) :
243*61046927SAndroid Build Coastguard Worker          std::vector<T>(v), RawShaderArg(dir) { }
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker       ShaderArg<T>& operator =(const T &v)
246*61046927SAndroid Build Coastguard Worker       {
247*61046927SAndroid Build Coastguard Worker          this->clear();
248*61046927SAndroid Build Coastguard Worker          this->push_back(v);
249*61046927SAndroid Build Coastguard Worker          return *this;
250*61046927SAndroid Build Coastguard Worker       }
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker       operator T&() { return this->at(0); }
253*61046927SAndroid Build Coastguard Worker       operator const T&() const { return this->at(0); }
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker       ShaderArg<T>& operator =(const std::vector<T> &v)
256*61046927SAndroid Build Coastguard Worker       {
257*61046927SAndroid Build Coastguard Worker          *this = v;
258*61046927SAndroid Build Coastguard Worker          return *this;
259*61046927SAndroid Build Coastguard Worker       }
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker       ShaderArg<T>& operator =(std::initializer_list<T> v)
262*61046927SAndroid Build Coastguard Worker       {
263*61046927SAndroid Build Coastguard Worker          *this = v;
264*61046927SAndroid Build Coastguard Worker          return *this;
265*61046927SAndroid Build Coastguard Worker       }
266*61046927SAndroid Build Coastguard Worker 
get_elem_size()267*61046927SAndroid Build Coastguard Worker       size_t get_elem_size() const override { return sizeof(T); }
get_num_elems()268*61046927SAndroid Build Coastguard Worker       size_t get_num_elems() const override { return this->size(); }
get_data()269*61046927SAndroid Build Coastguard Worker       const void *get_data() const override { return this->data(); }
get_data()270*61046927SAndroid Build Coastguard Worker       void *get_data() override { return this->data(); }
271*61046927SAndroid Build Coastguard Worker    };
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker    struct CompileArgs
274*61046927SAndroid Build Coastguard Worker    {
275*61046927SAndroid Build Coastguard Worker       unsigned x, y, z;
276*61046927SAndroid Build Coastguard Worker       std::vector<const char *> compiler_command_line;
277*61046927SAndroid Build Coastguard Worker       clc_work_properties_data work_props;
278*61046927SAndroid Build Coastguard Worker    };
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker private:
gather_args(std::vector<RawShaderArg * > & args)281*61046927SAndroid Build Coastguard Worker    void gather_args(std::vector<RawShaderArg *> &args) { }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    template <typename T, typename... Rest>
gather_args(std::vector<RawShaderArg * > & args,T & arg,Rest &...rest)284*61046927SAndroid Build Coastguard Worker    void gather_args(std::vector<RawShaderArg *> &args, T &arg, Rest&... rest)
285*61046927SAndroid Build Coastguard Worker    {
286*61046927SAndroid Build Coastguard Worker       args.push_back(&arg);
287*61046927SAndroid Build Coastguard Worker       gather_args(args, rest...);
288*61046927SAndroid Build Coastguard Worker    }
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker    void run_shader_with_raw_args(Shader shader,
291*61046927SAndroid Build Coastguard Worker                                  const CompileArgs &compile_args,
292*61046927SAndroid Build Coastguard Worker                                  const std::vector<RawShaderArg *> &args);
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker protected:
295*61046927SAndroid Build Coastguard Worker    template <typename... Args>
run_shader(Shader shader,const CompileArgs & compile_args,Args &...args)296*61046927SAndroid Build Coastguard Worker    void run_shader(Shader shader,
297*61046927SAndroid Build Coastguard Worker                    const CompileArgs &compile_args,
298*61046927SAndroid Build Coastguard Worker                    Args&... args)
299*61046927SAndroid Build Coastguard Worker    {
300*61046927SAndroid Build Coastguard Worker       std::vector<RawShaderArg *> raw_args;
301*61046927SAndroid Build Coastguard Worker       gather_args(raw_args, args...);
302*61046927SAndroid Build Coastguard Worker       run_shader_with_raw_args(shader, compile_args, raw_args);
303*61046927SAndroid Build Coastguard Worker    }
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    template <typename... Args>
run_shader(const std::vector<const char * > & sources,unsigned x,unsigned y,unsigned z,Args &...args)306*61046927SAndroid Build Coastguard Worker    void run_shader(const std::vector<const char *> &sources,
307*61046927SAndroid Build Coastguard Worker                    unsigned x, unsigned y, unsigned z,
308*61046927SAndroid Build Coastguard Worker                    Args&... args)
309*61046927SAndroid Build Coastguard Worker    {
310*61046927SAndroid Build Coastguard Worker       std::vector<RawShaderArg *> raw_args;
311*61046927SAndroid Build Coastguard Worker       gather_args(raw_args, args...);
312*61046927SAndroid Build Coastguard Worker       CompileArgs compile_args = { x, y, z };
313*61046927SAndroid Build Coastguard Worker       run_shader_with_raw_args(compile(sources), compile_args, raw_args);
314*61046927SAndroid Build Coastguard Worker    }
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    template <typename... Args>
run_shader(const std::vector<const char * > & sources,const CompileArgs & compile_args,Args &...args)317*61046927SAndroid Build Coastguard Worker    void run_shader(const std::vector<const char *> &sources,
318*61046927SAndroid Build Coastguard Worker                    const CompileArgs &compile_args,
319*61046927SAndroid Build Coastguard Worker                    Args&... args)
320*61046927SAndroid Build Coastguard Worker    {
321*61046927SAndroid Build Coastguard Worker       std::vector<RawShaderArg *> raw_args;
322*61046927SAndroid Build Coastguard Worker       gather_args(raw_args, args...);
323*61046927SAndroid Build Coastguard Worker       run_shader_with_raw_args(
324*61046927SAndroid Build Coastguard Worker          compile(sources, compile_args.compiler_command_line),
325*61046927SAndroid Build Coastguard Worker          compile_args, raw_args);
326*61046927SAndroid Build Coastguard Worker    }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker    template <typename... Args>
run_shader(const char * source,unsigned x,unsigned y,unsigned z,Args &...args)329*61046927SAndroid Build Coastguard Worker    void run_shader(const char *source,
330*61046927SAndroid Build Coastguard Worker                    unsigned x, unsigned y, unsigned z,
331*61046927SAndroid Build Coastguard Worker                    Args&... args)
332*61046927SAndroid Build Coastguard Worker    {
333*61046927SAndroid Build Coastguard Worker       std::vector<RawShaderArg *> raw_args;
334*61046927SAndroid Build Coastguard Worker       gather_args(raw_args, args...);
335*61046927SAndroid Build Coastguard Worker       CompileArgs compile_args = { x, y, z };
336*61046927SAndroid Build Coastguard Worker       run_shader_with_raw_args(compile({ source }), compile_args, raw_args);
337*61046927SAndroid Build Coastguard Worker    }
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    IDXGIFactory4 *factory;
340*61046927SAndroid Build Coastguard Worker    IDXGIAdapter1 *adapter;
341*61046927SAndroid Build Coastguard Worker    ID3D12Device *dev;
342*61046927SAndroid Build Coastguard Worker    ID3D12Fence *cmdqueue_fence;
343*61046927SAndroid Build Coastguard Worker    ID3D12CommandQueue *cmdqueue;
344*61046927SAndroid Build Coastguard Worker    ID3D12CommandAllocator *cmdalloc;
345*61046927SAndroid Build Coastguard Worker    ID3D12GraphicsCommandList *cmdlist;
346*61046927SAndroid Build Coastguard Worker    ID3D12DescriptorHeap *uav_heap;
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    struct clc_libclc *compiler_ctx;
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    UINT uav_heap_incr;
351*61046927SAndroid Build Coastguard Worker    int fence_value;
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    HANDLE event;
354*61046927SAndroid Build Coastguard Worker    static PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE D3D12SerializeVersionedRootSignature;
355*61046927SAndroid Build Coastguard Worker };
356