1 //
2 // Copyright (c) 2017 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //    http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 #ifndef _HARNESS_H_
17 #define _HARNESS_H_
18 
19 #define _CRT_SECURE_NO_WARNINGS
20 
21 #if defined (__MINGW32__)
22 #include <rpcsal.h>
23 typedef unsigned char UINT8;
24 #define __out
25 #define __in
26 #define __inout
27 #define __out_bcount_opt(size)
28 #define __in_opt
29 #define __in_ecount(size)
30 #define __in_ecount_opt(size)
31 #define __out_opt
32 #define __out_ecount(size)
33 #define __out_ecount_opt(size)
34 #define __in_bcount_opt(size)
35 #define __inout_opt
36 #endif
37 
38 #include <CL/cl.h>
39 #include <CL/cl_platform.h>
40 #include <CL/cl_d3d10.h>
41 #include <stdio.h>
42 #include "errorHelpers.h"
43 #include "kernelHelpers.h"
44 
45 // #define log_info(...) printf(__VA_ARGS__)
46 // #define log_error(...) printf(__VA_ARGS__)
47 
48 #define NonTestRequire(x, ...) \
49 do \
50 { \
51     if (!(x) ) \
52     { \
53         log_info("\n[assertion failed: %s at %s:%d]\n", #x, __FILE__, __LINE__); \
54         log_info("CATASTROPHIC NON-TEST ERROR: "); \
55         log_error(__VA_ARGS__); \
56         log_info("\n"); \
57         log_info("***FAILED***\n"); \
58         exit(1); \
59     } \
60 } while (0)
61 
62 #define TestRequire(x, ...) \
63     do \
64     { \
65         if (!(x) ) \
66         { \
67             log_info("\n[assertion failed: %s at %s:%d]\n", #x, __FILE__, __LINE__); \
68             log_info("ERROR: "); \
69             log_error(__VA_ARGS__); \
70             log_info("\n"); \
71             HarnessD3D10_TestFail(); \
72             goto Cleanup; \
73         } \
74     } while (0)
75 
76 #define TestPrint(...) \
77     do \
78     { \
79         log_error(__VA_ARGS__); \
80     } while (0)
81 
82 struct TextureFormat
83 {
84     DXGI_FORMAT format;
85     cl_channel_order channel_order;
86     cl_channel_type  channel_type;
87     UINT bytesPerPixel;
88     enum
89     {
90         GENERIC_FLOAT = 0,
91         GENERIC_UINT  = 1,
92         GENERIC_SINT  = 2,
93     } generic;
94 
95     const char *name_format;
96     const char *name_channel_order;
97     const char *name_channel_type;
98 };
99 extern TextureFormat formats[];
100 extern UINT formatCount;
101 
102 
103 #define MAX_REGISTERED_SUBRESOURCES 4 // limit to just make life easier
104 
105 struct BufferProperties
106 {
107     UINT ByteWidth;
108     UINT BindFlags;
109     D3D10_USAGE Usage;
110     UINT CPUAccess;
111     const char* name_BindFlags;
112     const char* name_Usage;
113     const char* name_CPUAccess;
114 };
115 
116 struct Texture2DSize
117 {
118     UINT Width;
119     UINT Height;
120     UINT MipLevels;
121     UINT ArraySize;
122     UINT SubResourceCount;
123     struct
124     {
125         UINT MipLevel;
126         UINT ArraySlice;
127     } subResources[MAX_REGISTERED_SUBRESOURCES];
128     UINT MiscFlags;
129 };
130 struct Texture3DSize
131 {
132     UINT Width;
133     UINT Height;
134     UINT Depth;
135     UINT MipLevels;
136     UINT SubResourceCount;
137     struct
138     {
139         UINT MipLevel;
140     } subResources[MAX_REGISTERED_SUBRESOURCES];
141     UINT MiscFlags;
142 };
143 
144 void HarnessD3D10_Initialize(cl_platform_id platform);
145 cl_int HarnessD3D10_CreateDevice(IDXGIAdapter* pAdapter, ID3D10Device **ppDevice);
146 void HarnessD3D10_DestroyDevice();
147 
148 void HarnessD3D10_TestBegin(const char* fmt, ...);
149 void HarnessD3D10_TestFail();
150 void HarnessD3D10_TestEnd();
151 void HarnessD3D10_TestStats();
152 
153 
154 void TestAdapterEnumeration(
155     cl_platform_id platform,
156     IDXGIAdapter* pAdapter,
157     ID3D10Device* pDevice,
158     cl_uint* num_devices);
159 
160 void TestAdapterDevices(
161     cl_platform_id platform,
162     IDXGIAdapter* pAdapter,
163     ID3D10Device* pDevice,
164     cl_uint num_devices);
165 
166 void TestDevice(
167     cl_device_id device,
168     ID3D10Device* pDevice);
169 
170 bool TestDeviceContextCreate(
171     cl_device_id device,
172     ID3D10Device* pDevice,
173     cl_context* out_context,
174     cl_command_queue* out_command_queue);
175 
176 void TestDeviceBuffer(
177     cl_context context,
178     cl_command_queue command_queue,
179     ID3D10Device* pDevice);
180 
181 void TestDeviceTexture2D(
182     cl_device_id device,
183     cl_context context,
184     cl_command_queue command_queue,
185     ID3D10Device* pDevice);
186 
187 void TestDeviceTexture3D(
188     cl_device_id device,
189     cl_context context,
190     cl_command_queue command_queue,
191     ID3D10Device* pDevice);
192 
193 void TestDeviceMisc(
194     cl_device_id device,
195     cl_context context,
196     cl_command_queue command_queue,
197     ID3D10Device* pDevice);
198 
199 cl_int HarnessD3D10_CreateKernelFromSource(
200     cl_kernel *outKernel,
201     cl_device_id device,
202     cl_context context,
203     const char *source,
204     const char *entrypoint);
205 
206 extern clGetDeviceIDsFromD3D10KHR_fn      clGetDeviceIDsFromD3D10KHR;
207 extern clCreateFromD3D10BufferKHR_fn      clCreateFromD3D10BufferKHR;
208 extern clCreateFromD3D10Texture2DKHR_fn   clCreateFromD3D10Texture2DKHR;
209 extern clCreateFromD3D10Texture3DKHR_fn   clCreateFromD3D10Texture3DKHR;
210 extern clEnqueueAcquireD3D10ObjectsKHR_fn clEnqueueAcquireD3D10ObjectsKHR;
211 extern clEnqueueReleaseD3D10ObjectsKHR_fn clEnqueueReleaseD3D10ObjectsKHR;
212 
213 #endif
214