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