1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #if defined( _WIN32 )
17*6467f958SSadaf Ebrahimi
18*6467f958SSadaf Ebrahimi #define _CRT_SECURE_NO_WARNINGS
19*6467f958SSadaf Ebrahimi #include <vector>
20*6467f958SSadaf Ebrahimi #include <algorithm>
21*6467f958SSadaf Ebrahimi #include "harness.h"
22*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
23*6467f958SSadaf Ebrahimi #include "harness/parseParameters.h"
24*6467f958SSadaf Ebrahimi
main(int argc,const char * argv[])25*6467f958SSadaf Ebrahimi int main(int argc, const char* argv[])
26*6467f958SSadaf Ebrahimi {
27*6467f958SSadaf Ebrahimi cl_int result;
28*6467f958SSadaf Ebrahimi cl_platform_id platform = NULL;
29*6467f958SSadaf Ebrahimi cl_uint num_devices_tested = 0;
30*6467f958SSadaf Ebrahimi
31*6467f958SSadaf Ebrahimi argc = parseCustomParam(argc, argv);
32*6467f958SSadaf Ebrahimi
33*6467f958SSadaf Ebrahimi // get the platforms to test
34*6467f958SSadaf Ebrahimi result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms.");
35*6467f958SSadaf Ebrahimi
36*6467f958SSadaf Ebrahimi HarnessD3D11_Initialize(platform);
37*6467f958SSadaf Ebrahimi
38*6467f958SSadaf Ebrahimi // for each adapter...
39*6467f958SSadaf Ebrahimi IDXGIFactory* pFactory = NULL;
40*6467f958SSadaf Ebrahimi HRESULT hr = CreateDXGIFactory(IID_IDXGIFactory, (void**)(&pFactory) );
41*6467f958SSadaf Ebrahimi NonTestRequire(SUCCEEDED(hr), "Failed to create DXGI factory.");
42*6467f958SSadaf Ebrahimi for (UINT adapter = 0;; ++adapter)
43*6467f958SSadaf Ebrahimi {
44*6467f958SSadaf Ebrahimi IDXGIAdapter* pAdapter = NULL;
45*6467f958SSadaf Ebrahimi ID3D11Device* pDevice = NULL;
46*6467f958SSadaf Ebrahimi ID3D11DeviceContext* pDC = NULL;
47*6467f958SSadaf Ebrahimi HRESULT hr = pFactory->EnumAdapters(adapter, &pAdapter);
48*6467f958SSadaf Ebrahimi if (FAILED(hr))
49*6467f958SSadaf Ebrahimi {
50*6467f958SSadaf Ebrahimi break;
51*6467f958SSadaf Ebrahimi }
52*6467f958SSadaf Ebrahimi
53*6467f958SSadaf Ebrahimi // print data about the adapter
54*6467f958SSadaf Ebrahimi DXGI_ADAPTER_DESC desc;
55*6467f958SSadaf Ebrahimi hr = pAdapter->GetDesc(&desc);
56*6467f958SSadaf Ebrahimi NonTestRequire(SUCCEEDED(hr), "IDXGIAdapter::GetDesc failed.");
57*6467f958SSadaf Ebrahimi
58*6467f958SSadaf Ebrahimi TestPrint("=====================================\n");
59*6467f958SSadaf Ebrahimi TestPrint("Testing DXGI Adapter and D3D11 Device\n");
60*6467f958SSadaf Ebrahimi TestPrint("Description=%ls, VendorID=%x, DeviceID=%x\n", desc.Description, desc.VendorId, desc.DeviceId);
61*6467f958SSadaf Ebrahimi TestPrint("=====================================\n");
62*6467f958SSadaf Ebrahimi
63*6467f958SSadaf Ebrahimi // run the test on the adapter
64*6467f958SSadaf Ebrahimi HarnessD3D11_CreateDevice(pAdapter, &pDevice, &pDC);
65*6467f958SSadaf Ebrahimi
66*6467f958SSadaf Ebrahimi cl_uint num_devices = 0;
67*6467f958SSadaf Ebrahimi
68*6467f958SSadaf Ebrahimi // test adapter and device enumeration
69*6467f958SSadaf Ebrahimi TestAdapterEnumeration(platform, pAdapter, pDevice, &num_devices);
70*6467f958SSadaf Ebrahimi
71*6467f958SSadaf Ebrahimi // if there were any devices found in enumeration, run the tests on them
72*6467f958SSadaf Ebrahimi if (num_devices)
73*6467f958SSadaf Ebrahimi {
74*6467f958SSadaf Ebrahimi TestAdapterDevices(platform, pAdapter, pDevice, pDC, num_devices);
75*6467f958SSadaf Ebrahimi }
76*6467f958SSadaf Ebrahimi num_devices_tested += num_devices;
77*6467f958SSadaf Ebrahimi
78*6467f958SSadaf Ebrahimi // destroy the D3D11 device
79*6467f958SSadaf Ebrahimi if (pDevice)
80*6467f958SSadaf Ebrahimi {
81*6467f958SSadaf Ebrahimi HarnessD3D11_DestroyDevice();
82*6467f958SSadaf Ebrahimi }
83*6467f958SSadaf Ebrahimi
84*6467f958SSadaf Ebrahimi pAdapter->Release();
85*6467f958SSadaf Ebrahimi }
86*6467f958SSadaf Ebrahimi pFactory->Release();
87*6467f958SSadaf Ebrahimi
88*6467f958SSadaf Ebrahimi // allow the test to be waived in automation
89*6467f958SSadaf Ebrahimi // NonTestRequire(num_devices_tested, "No D3D11 compatible cl_device_ids were found.");
90*6467f958SSadaf Ebrahimi
91*6467f958SSadaf Ebrahimi HarnessD3D11_TestStats();
92*6467f958SSadaf Ebrahimi }
93*6467f958SSadaf Ebrahimi
TestAdapterEnumeration(cl_platform_id platform,IDXGIAdapter * pAdapter,ID3D11Device * pDevice,cl_uint * num_devices)94*6467f958SSadaf Ebrahimi void TestAdapterEnumeration(
95*6467f958SSadaf Ebrahimi cl_platform_id platform,
96*6467f958SSadaf Ebrahimi IDXGIAdapter* pAdapter,
97*6467f958SSadaf Ebrahimi ID3D11Device* pDevice,
98*6467f958SSadaf Ebrahimi cl_uint* num_devices)
99*6467f958SSadaf Ebrahimi {
100*6467f958SSadaf Ebrahimi cl_uint num_adapter_devices = 0;
101*6467f958SSadaf Ebrahimi cl_device_id* adapter_devices = NULL;
102*6467f958SSadaf Ebrahimi
103*6467f958SSadaf Ebrahimi cl_uint num_device_devices = 0;
104*6467f958SSadaf Ebrahimi cl_device_id* device_devices = NULL;
105*6467f958SSadaf Ebrahimi
106*6467f958SSadaf Ebrahimi cl_int result;
107*6467f958SSadaf Ebrahimi
108*6467f958SSadaf Ebrahimi HarnessD3D11_TestBegin("cl_device_id Enumeration");
109*6467f958SSadaf Ebrahimi
110*6467f958SSadaf Ebrahimi // get the cl_device_ids for the adapter
111*6467f958SSadaf Ebrahimi {
112*6467f958SSadaf Ebrahimi result = clGetDeviceIDsFromD3D11KHR(
113*6467f958SSadaf Ebrahimi platform,
114*6467f958SSadaf Ebrahimi CL_D3D11_DXGI_ADAPTER_KHR,
115*6467f958SSadaf Ebrahimi pAdapter,
116*6467f958SSadaf Ebrahimi CL_ALL_DEVICES_FOR_D3D11_KHR,
117*6467f958SSadaf Ebrahimi 0,
118*6467f958SSadaf Ebrahimi NULL,
119*6467f958SSadaf Ebrahimi &num_adapter_devices);
120*6467f958SSadaf Ebrahimi TestRequire(
121*6467f958SSadaf Ebrahimi (result == CL_SUCCESS || result == CL_DEVICE_NOT_FOUND),
122*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR failed.");
123*6467f958SSadaf Ebrahimi
124*6467f958SSadaf Ebrahimi if (result == CL_DEVICE_NOT_FOUND)
125*6467f958SSadaf Ebrahimi {
126*6467f958SSadaf Ebrahimi TestPrint("No devices found for adapter.\n");
127*6467f958SSadaf Ebrahimi }
128*6467f958SSadaf Ebrahimi else
129*6467f958SSadaf Ebrahimi {
130*6467f958SSadaf Ebrahimi // if there were devices, query them
131*6467f958SSadaf Ebrahimi adapter_devices = new cl_device_id[num_adapter_devices];
132*6467f958SSadaf Ebrahimi result = clGetDeviceIDsFromD3D11KHR(
133*6467f958SSadaf Ebrahimi platform,
134*6467f958SSadaf Ebrahimi CL_D3D11_DXGI_ADAPTER_KHR,
135*6467f958SSadaf Ebrahimi pAdapter,
136*6467f958SSadaf Ebrahimi CL_ALL_DEVICES_FOR_D3D11_KHR,
137*6467f958SSadaf Ebrahimi num_adapter_devices,
138*6467f958SSadaf Ebrahimi adapter_devices,
139*6467f958SSadaf Ebrahimi NULL);
140*6467f958SSadaf Ebrahimi TestRequire(
141*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
142*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR failed.");
143*6467f958SSadaf Ebrahimi }
144*6467f958SSadaf Ebrahimi }
145*6467f958SSadaf Ebrahimi
146*6467f958SSadaf Ebrahimi // get the cl_device_ids for the device (if it was successfully created)
147*6467f958SSadaf Ebrahimi if (pDevice)
148*6467f958SSadaf Ebrahimi {
149*6467f958SSadaf Ebrahimi result = clGetDeviceIDsFromD3D11KHR(
150*6467f958SSadaf Ebrahimi platform,
151*6467f958SSadaf Ebrahimi CL_D3D11_DEVICE_KHR,
152*6467f958SSadaf Ebrahimi pDevice,
153*6467f958SSadaf Ebrahimi CL_ALL_DEVICES_FOR_D3D11_KHR,
154*6467f958SSadaf Ebrahimi 0,
155*6467f958SSadaf Ebrahimi NULL,
156*6467f958SSadaf Ebrahimi &num_device_devices);
157*6467f958SSadaf Ebrahimi TestRequire(
158*6467f958SSadaf Ebrahimi (result == CL_SUCCESS || result == CL_DEVICE_NOT_FOUND),
159*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR failed.");
160*6467f958SSadaf Ebrahimi
161*6467f958SSadaf Ebrahimi if (result == CL_DEVICE_NOT_FOUND)
162*6467f958SSadaf Ebrahimi {
163*6467f958SSadaf Ebrahimi TestPrint("No devices found for D3D device.\n");
164*6467f958SSadaf Ebrahimi }
165*6467f958SSadaf Ebrahimi else
166*6467f958SSadaf Ebrahimi {
167*6467f958SSadaf Ebrahimi // if there were devices, query them
168*6467f958SSadaf Ebrahimi device_devices = new cl_device_id[num_device_devices];
169*6467f958SSadaf Ebrahimi result = clGetDeviceIDsFromD3D11KHR(
170*6467f958SSadaf Ebrahimi platform,
171*6467f958SSadaf Ebrahimi CL_D3D11_DEVICE_KHR,
172*6467f958SSadaf Ebrahimi pDevice,
173*6467f958SSadaf Ebrahimi CL_ALL_DEVICES_FOR_D3D11_KHR,
174*6467f958SSadaf Ebrahimi num_device_devices,
175*6467f958SSadaf Ebrahimi device_devices,
176*6467f958SSadaf Ebrahimi NULL);
177*6467f958SSadaf Ebrahimi TestRequire(
178*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
179*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR failed.");
180*6467f958SSadaf Ebrahimi }
181*6467f958SSadaf Ebrahimi
182*6467f958SSadaf Ebrahimi }
183*6467f958SSadaf Ebrahimi
184*6467f958SSadaf Ebrahimi Cleanup:
185*6467f958SSadaf Ebrahimi
186*6467f958SSadaf Ebrahimi if (adapter_devices)
187*6467f958SSadaf Ebrahimi {
188*6467f958SSadaf Ebrahimi delete[] adapter_devices;
189*6467f958SSadaf Ebrahimi }
190*6467f958SSadaf Ebrahimi if (device_devices)
191*6467f958SSadaf Ebrahimi {
192*6467f958SSadaf Ebrahimi delete[] device_devices;
193*6467f958SSadaf Ebrahimi }
194*6467f958SSadaf Ebrahimi
195*6467f958SSadaf Ebrahimi *num_devices = num_device_devices;
196*6467f958SSadaf Ebrahimi
197*6467f958SSadaf Ebrahimi HarnessD3D11_TestEnd();
198*6467f958SSadaf Ebrahimi }
199*6467f958SSadaf Ebrahimi
TestAdapterDevices(cl_platform_id platform,IDXGIAdapter * pAdapter,ID3D11Device * pDevice,ID3D11DeviceContext * pDC,cl_uint num_devices_expected)200*6467f958SSadaf Ebrahimi void TestAdapterDevices(
201*6467f958SSadaf Ebrahimi cl_platform_id platform,
202*6467f958SSadaf Ebrahimi IDXGIAdapter* pAdapter,
203*6467f958SSadaf Ebrahimi ID3D11Device* pDevice,
204*6467f958SSadaf Ebrahimi ID3D11DeviceContext* pDC,
205*6467f958SSadaf Ebrahimi cl_uint num_devices_expected)
206*6467f958SSadaf Ebrahimi {
207*6467f958SSadaf Ebrahimi cl_int result;
208*6467f958SSadaf Ebrahimi cl_uint num_devices = 0;
209*6467f958SSadaf Ebrahimi cl_device_id* devices = NULL;
210*6467f958SSadaf Ebrahimi
211*6467f958SSadaf Ebrahimi devices = new cl_device_id[num_devices_expected];
212*6467f958SSadaf Ebrahimi NonTestRequire(
213*6467f958SSadaf Ebrahimi devices,
214*6467f958SSadaf Ebrahimi "Memory allocation failure.");
215*6467f958SSadaf Ebrahimi
216*6467f958SSadaf Ebrahimi result = clGetDeviceIDsFromD3D11KHR(
217*6467f958SSadaf Ebrahimi platform,
218*6467f958SSadaf Ebrahimi CL_D3D11_DEVICE_KHR,
219*6467f958SSadaf Ebrahimi pDevice,
220*6467f958SSadaf Ebrahimi CL_ALL_DEVICES_FOR_D3D11_KHR,
221*6467f958SSadaf Ebrahimi num_devices_expected,
222*6467f958SSadaf Ebrahimi devices,
223*6467f958SSadaf Ebrahimi &num_devices);
224*6467f958SSadaf Ebrahimi NonTestRequire(
225*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
226*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR failed.");
227*6467f958SSadaf Ebrahimi NonTestRequire(
228*6467f958SSadaf Ebrahimi (num_devices == num_devices_expected),
229*6467f958SSadaf Ebrahimi "clGetDeviceIDsFromD3D11KHR returned an unexpected number of devices.");
230*6467f958SSadaf Ebrahimi
231*6467f958SSadaf Ebrahimi for (cl_uint i = 0; i < num_devices; ++i)
232*6467f958SSadaf Ebrahimi {
233*6467f958SSadaf Ebrahimi TestDevice(devices[i], pDevice, pDC);
234*6467f958SSadaf Ebrahimi }
235*6467f958SSadaf Ebrahimi }
236*6467f958SSadaf Ebrahimi
TestDevice(cl_device_id device,ID3D11Device * pDevice,ID3D11DeviceContext * pDC)237*6467f958SSadaf Ebrahimi void TestDevice(
238*6467f958SSadaf Ebrahimi cl_device_id device,
239*6467f958SSadaf Ebrahimi ID3D11Device* pDevice,
240*6467f958SSadaf Ebrahimi ID3D11DeviceContext* pDC)
241*6467f958SSadaf Ebrahimi {
242*6467f958SSadaf Ebrahimi char device_name[1024];
243*6467f958SSadaf Ebrahimi cl_int result = CL_SUCCESS;
244*6467f958SSadaf Ebrahimi cl_context context = NULL;
245*6467f958SSadaf Ebrahimi cl_command_queue command_queue = NULL;
246*6467f958SSadaf Ebrahimi ID3D11Device* clDevice = NULL;
247*6467f958SSadaf Ebrahimi cl_uint prefer_shared_resources;
248*6467f958SSadaf Ebrahimi
249*6467f958SSadaf Ebrahimi result = clGetDeviceInfo(
250*6467f958SSadaf Ebrahimi device,
251*6467f958SSadaf Ebrahimi CL_DEVICE_NAME,
252*6467f958SSadaf Ebrahimi sizeof(device_name),
253*6467f958SSadaf Ebrahimi device_name,
254*6467f958SSadaf Ebrahimi NULL);
255*6467f958SSadaf Ebrahimi NonTestRequire(CL_SUCCESS == result, "clGetDeviceInfo with CL_DEVICE_NAME failed");
256*6467f958SSadaf Ebrahimi TestPrint("--------------------\n");
257*6467f958SSadaf Ebrahimi TestPrint("Testing cl_device_id\n");
258*6467f958SSadaf Ebrahimi TestPrint("Name=%s\n", device_name);
259*6467f958SSadaf Ebrahimi TestPrint("--------------------\n");
260*6467f958SSadaf Ebrahimi
261*6467f958SSadaf Ebrahimi if (!TestDeviceContextCreate(device, pDevice, &context, &command_queue) )
262*6467f958SSadaf Ebrahimi {
263*6467f958SSadaf Ebrahimi return;
264*6467f958SSadaf Ebrahimi }
265*6467f958SSadaf Ebrahimi
266*6467f958SSadaf Ebrahimi // make sure that we can query the shared resource preference
267*6467f958SSadaf Ebrahimi result = clGetContextInfo(
268*6467f958SSadaf Ebrahimi context,
269*6467f958SSadaf Ebrahimi CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR,
270*6467f958SSadaf Ebrahimi sizeof(prefer_shared_resources),
271*6467f958SSadaf Ebrahimi &prefer_shared_resources,
272*6467f958SSadaf Ebrahimi NULL);
273*6467f958SSadaf Ebrahimi NonTestRequire(CL_SUCCESS == result, "clGetContextInfo with CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR failed");
274*6467f958SSadaf Ebrahimi
275*6467f958SSadaf Ebrahimi // run buffer tests
276*6467f958SSadaf Ebrahimi TestDeviceBuffer(
277*6467f958SSadaf Ebrahimi context,
278*6467f958SSadaf Ebrahimi command_queue,
279*6467f958SSadaf Ebrahimi pDevice,
280*6467f958SSadaf Ebrahimi pDC);
281*6467f958SSadaf Ebrahimi
282*6467f958SSadaf Ebrahimi // run 2D texture tests
283*6467f958SSadaf Ebrahimi TestDeviceTexture2D(
284*6467f958SSadaf Ebrahimi device,
285*6467f958SSadaf Ebrahimi context,
286*6467f958SSadaf Ebrahimi command_queue,
287*6467f958SSadaf Ebrahimi pDevice,
288*6467f958SSadaf Ebrahimi pDC);
289*6467f958SSadaf Ebrahimi
290*6467f958SSadaf Ebrahimi // run 3D texture tests
291*6467f958SSadaf Ebrahimi TestDeviceTexture3D(
292*6467f958SSadaf Ebrahimi device,
293*6467f958SSadaf Ebrahimi context,
294*6467f958SSadaf Ebrahimi command_queue,
295*6467f958SSadaf Ebrahimi pDevice,
296*6467f958SSadaf Ebrahimi pDC);
297*6467f958SSadaf Ebrahimi
298*6467f958SSadaf Ebrahimi // run misc tests
299*6467f958SSadaf Ebrahimi TestDeviceMisc(
300*6467f958SSadaf Ebrahimi device,
301*6467f958SSadaf Ebrahimi context,
302*6467f958SSadaf Ebrahimi command_queue,
303*6467f958SSadaf Ebrahimi pDevice);
304*6467f958SSadaf Ebrahimi
305*6467f958SSadaf Ebrahimi clReleaseContext(context);
306*6467f958SSadaf Ebrahimi clReleaseCommandQueue(command_queue);
307*6467f958SSadaf Ebrahimi }
308*6467f958SSadaf Ebrahimi
TestDeviceContextCreate(cl_device_id device,ID3D11Device * pDevice,cl_context * out_context,cl_command_queue * out_command_queue)309*6467f958SSadaf Ebrahimi bool TestDeviceContextCreate(
310*6467f958SSadaf Ebrahimi cl_device_id device,
311*6467f958SSadaf Ebrahimi ID3D11Device* pDevice,
312*6467f958SSadaf Ebrahimi cl_context* out_context,
313*6467f958SSadaf Ebrahimi cl_command_queue* out_command_queue)
314*6467f958SSadaf Ebrahimi {
315*6467f958SSadaf Ebrahimi cl_int result = CL_SUCCESS;
316*6467f958SSadaf Ebrahimi cl_context context = NULL;
317*6467f958SSadaf Ebrahimi cl_command_queue command_queue = NULL;
318*6467f958SSadaf Ebrahimi
319*6467f958SSadaf Ebrahimi ID3D11Device* clDevice = NULL;
320*6467f958SSadaf Ebrahimi
321*6467f958SSadaf Ebrahimi bool succeeded = false;
322*6467f958SSadaf Ebrahimi
323*6467f958SSadaf Ebrahimi HarnessD3D11_TestBegin("Context creation");
324*6467f958SSadaf Ebrahimi
325*6467f958SSadaf Ebrahimi cl_context_properties properties[5];
326*6467f958SSadaf Ebrahimi
327*6467f958SSadaf Ebrahimi // create the context
328*6467f958SSadaf Ebrahimi properties[0] = (cl_context_properties)CL_CONTEXT_D3D11_DEVICE_KHR;
329*6467f958SSadaf Ebrahimi properties[1] = (cl_context_properties)pDevice;
330*6467f958SSadaf Ebrahimi properties[2] = (cl_context_properties)CL_CONTEXT_INTEROP_USER_SYNC;
331*6467f958SSadaf Ebrahimi properties[3] = (cl_context_properties)CL_TRUE;
332*6467f958SSadaf Ebrahimi properties[4] = (cl_context_properties)0;
333*6467f958SSadaf Ebrahimi context = clCreateContext(
334*6467f958SSadaf Ebrahimi properties,
335*6467f958SSadaf Ebrahimi 1,
336*6467f958SSadaf Ebrahimi &device,
337*6467f958SSadaf Ebrahimi NULL,
338*6467f958SSadaf Ebrahimi NULL,
339*6467f958SSadaf Ebrahimi &result);
340*6467f958SSadaf Ebrahimi TestRequire(
341*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
342*6467f958SSadaf Ebrahimi "clCreateContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
343*6467f958SSadaf Ebrahimi result = clReleaseContext(context);
344*6467f958SSadaf Ebrahimi TestRequire(
345*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
346*6467f958SSadaf Ebrahimi "clReleaseContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
347*6467f958SSadaf Ebrahimi
348*6467f958SSadaf Ebrahimi // create the context
349*6467f958SSadaf Ebrahimi properties[0] = (cl_context_properties)CL_CONTEXT_D3D11_DEVICE_KHR;
350*6467f958SSadaf Ebrahimi properties[1] = (cl_context_properties)pDevice;
351*6467f958SSadaf Ebrahimi properties[2] = (cl_context_properties)CL_CONTEXT_INTEROP_USER_SYNC;
352*6467f958SSadaf Ebrahimi properties[3] = (cl_context_properties)CL_FALSE;
353*6467f958SSadaf Ebrahimi properties[4] = (cl_context_properties)0;
354*6467f958SSadaf Ebrahimi context = clCreateContext(
355*6467f958SSadaf Ebrahimi properties,
356*6467f958SSadaf Ebrahimi 1,
357*6467f958SSadaf Ebrahimi &device,
358*6467f958SSadaf Ebrahimi NULL,
359*6467f958SSadaf Ebrahimi NULL,
360*6467f958SSadaf Ebrahimi &result);
361*6467f958SSadaf Ebrahimi TestRequire(
362*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
363*6467f958SSadaf Ebrahimi "clCreateContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
364*6467f958SSadaf Ebrahimi result = clReleaseContext(context);
365*6467f958SSadaf Ebrahimi TestRequire(
366*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
367*6467f958SSadaf Ebrahimi "clReleaseContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
368*6467f958SSadaf Ebrahimi
369*6467f958SSadaf Ebrahimi // create the context
370*6467f958SSadaf Ebrahimi properties[0] = (cl_context_properties)CL_CONTEXT_D3D11_DEVICE_KHR;
371*6467f958SSadaf Ebrahimi properties[1] = (cl_context_properties)pDevice;
372*6467f958SSadaf Ebrahimi properties[2] = (cl_context_properties)0;
373*6467f958SSadaf Ebrahimi context = clCreateContext(
374*6467f958SSadaf Ebrahimi properties,
375*6467f958SSadaf Ebrahimi 1,
376*6467f958SSadaf Ebrahimi &device,
377*6467f958SSadaf Ebrahimi NULL,
378*6467f958SSadaf Ebrahimi NULL,
379*6467f958SSadaf Ebrahimi &result);
380*6467f958SSadaf Ebrahimi TestRequire(
381*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
382*6467f958SSadaf Ebrahimi "clCreateContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
383*6467f958SSadaf Ebrahimi
384*6467f958SSadaf Ebrahimi // check CL_CONTEXT_D3D11_DEVICE_KHR
385*6467f958SSadaf Ebrahimi {
386*6467f958SSadaf Ebrahimi size_t param_value_size_ret;
387*6467f958SSadaf Ebrahimi result = clGetContextInfo(context, CL_CONTEXT_PROPERTIES, 0, NULL, ¶m_value_size_ret);
388*6467f958SSadaf Ebrahimi TestRequire(
389*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
390*6467f958SSadaf Ebrahimi "clGetContextInfo with CL_CONTEXT_PROPERTIES failed");
391*6467f958SSadaf Ebrahimi
392*6467f958SSadaf Ebrahimi TestRequire(
393*6467f958SSadaf Ebrahimi ((param_value_size_ret % sizeof(cl_context_properties)) == 0),
394*6467f958SSadaf Ebrahimi "param_value_size_ret is not a multiple of sizeof(cl_context_properties)");
395*6467f958SSadaf Ebrahimi
396*6467f958SSadaf Ebrahimi std::vector<cl_context_properties> contextProperties(param_value_size_ret / sizeof(cl_context_properties));
397*6467f958SSadaf Ebrahimi result = clGetContextInfo(context, CL_CONTEXT_PROPERTIES, param_value_size_ret, &contextProperties[0], NULL);
398*6467f958SSadaf Ebrahimi TestRequire(
399*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
400*6467f958SSadaf Ebrahimi "clGetContextInfo with CL_CONTEXT_PROPERTIES failed");
401*6467f958SSadaf Ebrahimi
402*6467f958SSadaf Ebrahimi TestRequire(contextProperties.size() % 2 == 1, "Property list size is not odd.");
403*6467f958SSadaf Ebrahimi TestRequire(contextProperties[contextProperties.size() - 1] == 0, "last property is not zero");
404*6467f958SSadaf Ebrahimi
405*6467f958SSadaf Ebrahimi std::vector<cl_context_properties>::const_iterator iter;
406*6467f958SSadaf Ebrahimi for (iter = contextProperties.begin(); *iter != 0; iter+=2)
407*6467f958SSadaf Ebrahimi {
408*6467f958SSadaf Ebrahimi if (CL_CONTEXT_D3D11_DEVICE_KHR == *iter)
409*6467f958SSadaf Ebrahimi {
410*6467f958SSadaf Ebrahimi TestRequire((ID3D11Device*)*(iter+1) == pDevice, "CL_CONTEXT_D3D11_DEVICE_KHR returned invalid value");
411*6467f958SSadaf Ebrahimi break;
412*6467f958SSadaf Ebrahimi }
413*6467f958SSadaf Ebrahimi }
414*6467f958SSadaf Ebrahimi
415*6467f958SSadaf Ebrahimi TestRequire((iter != contextProperties.end()), "CL_CONTEXT_PROPERTIES doesn't include CL_CONTEXT_D3D11_DEVICE_KHR");
416*6467f958SSadaf Ebrahimi }
417*6467f958SSadaf Ebrahimi
418*6467f958SSadaf Ebrahimi
419*6467f958SSadaf Ebrahimi // create the command queue
420*6467f958SSadaf Ebrahimi TestPrint("Creating a command queue.\n");
421*6467f958SSadaf Ebrahimi command_queue = clCreateCommandQueueWithProperties(
422*6467f958SSadaf Ebrahimi context,
423*6467f958SSadaf Ebrahimi device,
424*6467f958SSadaf Ebrahimi NULL,
425*6467f958SSadaf Ebrahimi &result);
426*6467f958SSadaf Ebrahimi TestRequire(
427*6467f958SSadaf Ebrahimi (result == CL_SUCCESS),
428*6467f958SSadaf Ebrahimi "clCreateContext with CL_CONTEXT_D3D11_DEVICE_KHR failed");
429*6467f958SSadaf Ebrahimi
430*6467f958SSadaf Ebrahimi succeeded = true;
431*6467f958SSadaf Ebrahimi
432*6467f958SSadaf Ebrahimi Cleanup:
433*6467f958SSadaf Ebrahimi
434*6467f958SSadaf Ebrahimi if (succeeded)
435*6467f958SSadaf Ebrahimi {
436*6467f958SSadaf Ebrahimi *out_context = context;
437*6467f958SSadaf Ebrahimi *out_command_queue = command_queue;
438*6467f958SSadaf Ebrahimi }
439*6467f958SSadaf Ebrahimi else
440*6467f958SSadaf Ebrahimi {
441*6467f958SSadaf Ebrahimi if (context)
442*6467f958SSadaf Ebrahimi {
443*6467f958SSadaf Ebrahimi clReleaseContext(context);
444*6467f958SSadaf Ebrahimi }
445*6467f958SSadaf Ebrahimi if (command_queue)
446*6467f958SSadaf Ebrahimi {
447*6467f958SSadaf Ebrahimi clReleaseCommandQueue(command_queue);
448*6467f958SSadaf Ebrahimi }
449*6467f958SSadaf Ebrahimi }
450*6467f958SSadaf Ebrahimi HarnessD3D11_TestEnd();
451*6467f958SSadaf Ebrahimi return succeeded;
452*6467f958SSadaf Ebrahimi }
453*6467f958SSadaf Ebrahimi
454*6467f958SSadaf Ebrahimi #else
455*6467f958SSadaf Ebrahimi
456*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
457*6467f958SSadaf Ebrahimi
main(int argc,char * argv[])458*6467f958SSadaf Ebrahimi int main(int argc, char* argv[])
459*6467f958SSadaf Ebrahimi {
460*6467f958SSadaf Ebrahimi log_info( "Windows-specific test skipped.\n" );
461*6467f958SSadaf Ebrahimi return 0;
462*6467f958SSadaf Ebrahimi }
463*6467f958SSadaf Ebrahimi
464*6467f958SSadaf Ebrahimi #endif
465