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 #define INITGUID
17*6467f958SSadaf Ebrahimi #include "harness.h"
18*6467f958SSadaf Ebrahimi #include <vector>
19*6467f958SSadaf Ebrahimi
20*6467f958SSadaf Ebrahimi #include <tchar.h>
21*6467f958SSadaf Ebrahimi
22*6467f958SSadaf Ebrahimi /*
23*6467f958SSadaf Ebrahimi * OpenCL state
24*6467f958SSadaf Ebrahimi */
25*6467f958SSadaf Ebrahimi
26*6467f958SSadaf Ebrahimi clGetDeviceIDsFromD3D10KHR_fn clGetDeviceIDsFromD3D10KHR = NULL;
27*6467f958SSadaf Ebrahimi clCreateFromD3D10BufferKHR_fn clCreateFromD3D10BufferKHR = NULL;
28*6467f958SSadaf Ebrahimi clCreateFromD3D10Texture2DKHR_fn clCreateFromD3D10Texture2DKHR = NULL;
29*6467f958SSadaf Ebrahimi clCreateFromD3D10Texture3DKHR_fn clCreateFromD3D10Texture3DKHR = NULL;
30*6467f958SSadaf Ebrahimi clEnqueueAcquireD3D10ObjectsKHR_fn clEnqueueAcquireD3D10ObjectsKHR = NULL;
31*6467f958SSadaf Ebrahimi clEnqueueReleaseD3D10ObjectsKHR_fn clEnqueueReleaseD3D10ObjectsKHR = NULL;
32*6467f958SSadaf Ebrahimi
33*6467f958SSadaf Ebrahimi #define INITPFN(x) \
34*6467f958SSadaf Ebrahimi x = (x ## _fn)clGetExtensionFunctionAddressForPlatform(platform, #x); NonTestRequire(x, "Failed to get function pointer for %s", #x);
35*6467f958SSadaf Ebrahimi
36*6467f958SSadaf Ebrahimi void
HarnessD3D10_ExtensionCheck()37*6467f958SSadaf Ebrahimi HarnessD3D10_ExtensionCheck()
38*6467f958SSadaf Ebrahimi {
39*6467f958SSadaf Ebrahimi bool extensionPresent = false;
40*6467f958SSadaf Ebrahimi cl_int result = CL_SUCCESS;
41*6467f958SSadaf Ebrahimi cl_platform_id platform = NULL;
42*6467f958SSadaf Ebrahimi size_t set_size;
43*6467f958SSadaf Ebrahimi
44*6467f958SSadaf Ebrahimi HarnessD3D10_TestBegin("Extension query");
45*6467f958SSadaf Ebrahimi
46*6467f958SSadaf Ebrahimi result = clGetPlatformIDs(1, &platform, NULL);
47*6467f958SSadaf Ebrahimi NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms.");
48*6467f958SSadaf Ebrahimi result = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, 0, NULL, &set_size);
49*6467f958SSadaf Ebrahimi NonTestRequire(result == CL_SUCCESS, "Failed to get size of extensions string.");
50*6467f958SSadaf Ebrahimi std::vector<char> extensions(set_size);
51*6467f958SSadaf Ebrahimi result = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, extensions.size(), extensions.data(), NULL);
52*6467f958SSadaf Ebrahimi NonTestRequire(result == CL_SUCCESS, "Failed to list extensions.");
53*6467f958SSadaf Ebrahimi extensionPresent = strstr(extensions.data(), "cl_khr_d3d10_sharing") ? true : false;
54*6467f958SSadaf Ebrahimi
55*6467f958SSadaf Ebrahimi if (!extensionPresent) {
56*6467f958SSadaf Ebrahimi // platform is required to report the extension only if all devices support it
57*6467f958SSadaf Ebrahimi cl_uint devicesCount;
58*6467f958SSadaf Ebrahimi result = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 0, NULL, &devicesCount);
59*6467f958SSadaf Ebrahimi NonTestRequire(result == CL_SUCCESS, "Failed to get devices count.");
60*6467f958SSadaf Ebrahimi std::vector<cl_device_id> devices(devicesCount);
61*6467f958SSadaf Ebrahimi result = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, devicesCount, &devices[0], NULL);
62*6467f958SSadaf Ebrahimi NonTestRequire(result == CL_SUCCESS, "Failed to get devices count.");
63*6467f958SSadaf Ebrahimi
64*6467f958SSadaf Ebrahimi for (cl_uint i = 0; i < devicesCount; i++) {
65*6467f958SSadaf Ebrahimi if (is_extension_available(devices[i], "cl_khr_d3d10_sharing")) {
66*6467f958SSadaf Ebrahimi extensionPresent = true;
67*6467f958SSadaf Ebrahimi break;
68*6467f958SSadaf Ebrahimi }
69*6467f958SSadaf Ebrahimi }
70*6467f958SSadaf Ebrahimi }
71*6467f958SSadaf Ebrahimi
72*6467f958SSadaf Ebrahimi OSVERSIONINFO osvi;
73*6467f958SSadaf Ebrahimi osvi.dwOSVersionInfoSize = sizeof(osvi);
74*6467f958SSadaf Ebrahimi GetVersionEx(&osvi);
75*6467f958SSadaf Ebrahimi if (osvi.dwMajorVersion <= 5)
76*6467f958SSadaf Ebrahimi {
77*6467f958SSadaf Ebrahimi TestRequire(!extensionPresent, "Extension should not be exported on Windows < 6");
78*6467f958SSadaf Ebrahimi }
79*6467f958SSadaf Ebrahimi else
80*6467f958SSadaf Ebrahimi {
81*6467f958SSadaf Ebrahimi TestRequire(extensionPresent, "Extension should be exported on Windows >= 6");
82*6467f958SSadaf Ebrahimi }
83*6467f958SSadaf Ebrahimi
84*6467f958SSadaf Ebrahimi Cleanup:
85*6467f958SSadaf Ebrahimi HarnessD3D10_TestEnd();
86*6467f958SSadaf Ebrahimi
87*6467f958SSadaf Ebrahimi // early-out of the extension is not present
88*6467f958SSadaf Ebrahimi if (!extensionPresent)
89*6467f958SSadaf Ebrahimi {
90*6467f958SSadaf Ebrahimi HarnessD3D10_TestStats();
91*6467f958SSadaf Ebrahimi }
92*6467f958SSadaf Ebrahimi }
93*6467f958SSadaf Ebrahimi
94*6467f958SSadaf Ebrahimi void
HarnessD3D10_Initialize(cl_platform_id platform)95*6467f958SSadaf Ebrahimi HarnessD3D10_Initialize(cl_platform_id platform)
96*6467f958SSadaf Ebrahimi {
97*6467f958SSadaf Ebrahimi HarnessD3D10_ExtensionCheck();
98*6467f958SSadaf Ebrahimi
99*6467f958SSadaf Ebrahimi // extract function pointers for exported functions
100*6467f958SSadaf Ebrahimi INITPFN(clGetDeviceIDsFromD3D10KHR);
101*6467f958SSadaf Ebrahimi INITPFN(clCreateFromD3D10BufferKHR);
102*6467f958SSadaf Ebrahimi INITPFN(clCreateFromD3D10Texture2DKHR);
103*6467f958SSadaf Ebrahimi INITPFN(clCreateFromD3D10Texture3DKHR);
104*6467f958SSadaf Ebrahimi INITPFN(clEnqueueAcquireD3D10ObjectsKHR);
105*6467f958SSadaf Ebrahimi INITPFN(clEnqueueReleaseD3D10ObjectsKHR);
106*6467f958SSadaf Ebrahimi }
107*6467f958SSadaf Ebrahimi
108*6467f958SSadaf Ebrahimi /*
109*6467f958SSadaf Ebrahimi * Window management
110*6467f958SSadaf Ebrahimi */
111*6467f958SSadaf Ebrahimi
112*6467f958SSadaf Ebrahimi static IDXGISwapChain* HarnessD3D10_pSwapChain = NULL;
113*6467f958SSadaf Ebrahimi static ID3D10Device* HarnessD3D10_pDevice = NULL;
114*6467f958SSadaf Ebrahimi static HWND HarnessD3D10_hWnd = NULL;
115*6467f958SSadaf Ebrahimi
HarnessD3D10_Proc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)116*6467f958SSadaf Ebrahimi static LRESULT WINAPI HarnessD3D10_Proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
117*6467f958SSadaf Ebrahimi {
118*6467f958SSadaf Ebrahimi switch(msg)
119*6467f958SSadaf Ebrahimi {
120*6467f958SSadaf Ebrahimi case WM_KEYDOWN:
121*6467f958SSadaf Ebrahimi return 0;
122*6467f958SSadaf Ebrahimi break;
123*6467f958SSadaf Ebrahimi case WM_DESTROY:
124*6467f958SSadaf Ebrahimi HarnessD3D10_hWnd = NULL;
125*6467f958SSadaf Ebrahimi PostQuitMessage(0);
126*6467f958SSadaf Ebrahimi return 0;
127*6467f958SSadaf Ebrahimi case WM_PAINT:
128*6467f958SSadaf Ebrahimi ValidateRect(hWnd, NULL);
129*6467f958SSadaf Ebrahimi return 0;
130*6467f958SSadaf Ebrahimi }
131*6467f958SSadaf Ebrahimi return DefWindowProc(hWnd, msg, wParam, lParam);
132*6467f958SSadaf Ebrahimi }
133*6467f958SSadaf Ebrahimi
HarnessD3D10_InteractiveLoop()134*6467f958SSadaf Ebrahimi static void HarnessD3D10_InteractiveLoop()
135*6467f958SSadaf Ebrahimi {
136*6467f958SSadaf Ebrahimi MSG msg;
137*6467f958SSadaf Ebrahimi while(PeekMessage(&msg,HarnessD3D10_hWnd,0,0,PM_REMOVE))
138*6467f958SSadaf Ebrahimi {
139*6467f958SSadaf Ebrahimi TranslateMessage(&msg);
140*6467f958SSadaf Ebrahimi DispatchMessage(&msg);
141*6467f958SSadaf Ebrahimi }
142*6467f958SSadaf Ebrahimi }
143*6467f958SSadaf Ebrahimi
HarnessD3D10_CreateDevice(IDXGIAdapter * pAdapter,ID3D10Device ** ppDevice)144*6467f958SSadaf Ebrahimi cl_int HarnessD3D10_CreateDevice(IDXGIAdapter* pAdapter, ID3D10Device **ppDevice)
145*6467f958SSadaf Ebrahimi {
146*6467f958SSadaf Ebrahimi HRESULT hr = S_OK;
147*6467f958SSadaf Ebrahimi unsigned int cuStatus = 1;
148*6467f958SSadaf Ebrahimi
149*6467f958SSadaf Ebrahimi *ppDevice = NULL;
150*6467f958SSadaf Ebrahimi
151*6467f958SSadaf Ebrahimi // create window
152*6467f958SSadaf Ebrahimi static WNDCLASSEX wc =
153*6467f958SSadaf Ebrahimi {
154*6467f958SSadaf Ebrahimi sizeof(WNDCLASSEX),
155*6467f958SSadaf Ebrahimi CS_CLASSDC,
156*6467f958SSadaf Ebrahimi HarnessD3D10_Proc,
157*6467f958SSadaf Ebrahimi 0L,
158*6467f958SSadaf Ebrahimi 0L,
159*6467f958SSadaf Ebrahimi GetModuleHandle(NULL),
160*6467f958SSadaf Ebrahimi NULL,
161*6467f958SSadaf Ebrahimi NULL,
162*6467f958SSadaf Ebrahimi NULL,
163*6467f958SSadaf Ebrahimi NULL,
164*6467f958SSadaf Ebrahimi _T( "cl_khr_d3d10_sharing_conformance" ),
165*6467f958SSadaf Ebrahimi NULL
166*6467f958SSadaf Ebrahimi };
167*6467f958SSadaf Ebrahimi RegisterClassEx(&wc);
168*6467f958SSadaf Ebrahimi HarnessD3D10_hWnd = CreateWindow(
169*6467f958SSadaf Ebrahimi _T( "cl_khr_d3d10_sharing_conformance" ),
170*6467f958SSadaf Ebrahimi _T( "cl_khr_d3d10_sharing_conformance" ),
171*6467f958SSadaf Ebrahimi WS_OVERLAPPEDWINDOW,
172*6467f958SSadaf Ebrahimi 0, 0, 256, 256,
173*6467f958SSadaf Ebrahimi NULL,
174*6467f958SSadaf Ebrahimi NULL,
175*6467f958SSadaf Ebrahimi wc.hInstance,
176*6467f958SSadaf Ebrahimi NULL);
177*6467f958SSadaf Ebrahimi NonTestRequire(0 != HarnessD3D10_hWnd, "Failed to create window");
178*6467f958SSadaf Ebrahimi
179*6467f958SSadaf Ebrahimi ShowWindow(HarnessD3D10_hWnd,SW_SHOWDEFAULT);
180*6467f958SSadaf Ebrahimi UpdateWindow(HarnessD3D10_hWnd);
181*6467f958SSadaf Ebrahimi
182*6467f958SSadaf Ebrahimi RECT rc;
183*6467f958SSadaf Ebrahimi GetClientRect(HarnessD3D10_hWnd, &rc);
184*6467f958SSadaf Ebrahimi UINT width = rc.right - rc.left;
185*6467f958SSadaf Ebrahimi UINT height = rc.bottom - rc.top;
186*6467f958SSadaf Ebrahimi
187*6467f958SSadaf Ebrahimi // Create device and swapchain
188*6467f958SSadaf Ebrahimi DXGI_SWAP_CHAIN_DESC sd;
189*6467f958SSadaf Ebrahimi ZeroMemory(&sd, sizeof(sd));
190*6467f958SSadaf Ebrahimi sd.BufferCount = 1;
191*6467f958SSadaf Ebrahimi sd.BufferDesc.Width = width;
192*6467f958SSadaf Ebrahimi sd.BufferDesc.Height = height;
193*6467f958SSadaf Ebrahimi sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
194*6467f958SSadaf Ebrahimi sd.BufferDesc.RefreshRate.Numerator = 60;
195*6467f958SSadaf Ebrahimi sd.BufferDesc.RefreshRate.Denominator = 1;
196*6467f958SSadaf Ebrahimi sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
197*6467f958SSadaf Ebrahimi sd.OutputWindow = HarnessD3D10_hWnd;
198*6467f958SSadaf Ebrahimi sd.SampleDesc.Count = 1;
199*6467f958SSadaf Ebrahimi sd.SampleDesc.Quality = 0;
200*6467f958SSadaf Ebrahimi sd.Windowed = TRUE;
201*6467f958SSadaf Ebrahimi hr = D3D10CreateDeviceAndSwapChain(
202*6467f958SSadaf Ebrahimi pAdapter,
203*6467f958SSadaf Ebrahimi D3D10_DRIVER_TYPE_HARDWARE,
204*6467f958SSadaf Ebrahimi NULL,
205*6467f958SSadaf Ebrahimi 0,
206*6467f958SSadaf Ebrahimi D3D10_SDK_VERSION,
207*6467f958SSadaf Ebrahimi &sd,
208*6467f958SSadaf Ebrahimi &HarnessD3D10_pSwapChain,
209*6467f958SSadaf Ebrahimi &HarnessD3D10_pDevice);
210*6467f958SSadaf Ebrahimi
211*6467f958SSadaf Ebrahimi if (FAILED(hr) ) {
212*6467f958SSadaf Ebrahimi return CL_DEVICE_NOT_FOUND;
213*6467f958SSadaf Ebrahimi }
214*6467f958SSadaf Ebrahimi
215*6467f958SSadaf Ebrahimi *ppDevice = HarnessD3D10_pDevice;
216*6467f958SSadaf Ebrahimi return CL_SUCCESS;
217*6467f958SSadaf Ebrahimi }
218*6467f958SSadaf Ebrahimi
HarnessD3D10_DestroyDevice()219*6467f958SSadaf Ebrahimi void HarnessD3D10_DestroyDevice()
220*6467f958SSadaf Ebrahimi {
221*6467f958SSadaf Ebrahimi HarnessD3D10_pSwapChain->Release();
222*6467f958SSadaf Ebrahimi HarnessD3D10_pDevice->Release();
223*6467f958SSadaf Ebrahimi
224*6467f958SSadaf Ebrahimi if (HarnessD3D10_hWnd) DestroyWindow(HarnessD3D10_hWnd);
225*6467f958SSadaf Ebrahimi HarnessD3D10_hWnd = 0;
226*6467f958SSadaf Ebrahimi }
227*6467f958SSadaf Ebrahimi
228*6467f958SSadaf Ebrahimi /*
229*6467f958SSadaf Ebrahimi *
230*6467f958SSadaf Ebrahimi * texture formats
231*6467f958SSadaf Ebrahimi *
232*6467f958SSadaf Ebrahimi */
233*6467f958SSadaf Ebrahimi
234*6467f958SSadaf Ebrahimi #define ADD_TEXTURE_FORMAT(x,y,z,a,b,g) { x, y, z, a*b/8, g, #x, #y, #z, }
235*6467f958SSadaf Ebrahimi TextureFormat formats[] =
236*6467f958SSadaf Ebrahimi {
237*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32B32A32_FLOAT , CL_RGBA , CL_FLOAT , 32, 4, TextureFormat::GENERIC_FLOAT ),
238*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32B32A32_UINT , CL_RGBA , CL_UNSIGNED_INT32 , 32, 4, TextureFormat::GENERIC_UINT ),
239*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32B32A32_SINT , CL_RGBA , CL_SIGNED_INT32 , 32, 4, TextureFormat::GENERIC_SINT ),
240*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16B16A16_FLOAT , CL_RGBA , CL_HALF_FLOAT , 16, 4, TextureFormat::GENERIC_FLOAT ),
241*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16B16A16_UNORM , CL_RGBA , CL_UNORM_INT16 , 16, 4, TextureFormat::GENERIC_FLOAT ),
242*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16B16A16_UINT , CL_RGBA , CL_UNSIGNED_INT16 , 16, 4, TextureFormat::GENERIC_UINT ),
243*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16B16A16_SNORM , CL_RGBA , CL_SNORM_INT16 , 16, 4, TextureFormat::GENERIC_FLOAT ),
244*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16B16A16_SINT , CL_RGBA , CL_SIGNED_INT16 , 16, 4, TextureFormat::GENERIC_SINT ),
245*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8B8A8_UNORM , CL_RGBA , CL_UNORM_INT8 , 8, 4, TextureFormat::GENERIC_FLOAT ),
246*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8B8A8_UINT , CL_RGBA , CL_UNSIGNED_INT8 , 8, 4, TextureFormat::GENERIC_UINT ),
247*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8B8A8_SNORM , CL_RGBA , CL_SNORM_INT8 , 8, 4, TextureFormat::GENERIC_FLOAT ),
248*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8B8A8_SINT , CL_RGBA , CL_SIGNED_INT8 , 8, 4, TextureFormat::GENERIC_SINT ),
249*6467f958SSadaf Ebrahimi
250*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32_FLOAT , CL_RG , CL_FLOAT , 32, 2, TextureFormat::GENERIC_FLOAT ),
251*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32_UINT , CL_RG , CL_UNSIGNED_INT32 , 32, 2, TextureFormat::GENERIC_UINT ),
252*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32G32_SINT , CL_RG , CL_SIGNED_INT32 , 32, 2, TextureFormat::GENERIC_SINT ),
253*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16_FLOAT , CL_RG , CL_HALF_FLOAT , 16, 2, TextureFormat::GENERIC_FLOAT ),
254*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16_UNORM , CL_RG , CL_UNORM_INT16 , 16, 2, TextureFormat::GENERIC_FLOAT ),
255*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16_UINT , CL_RG , CL_UNSIGNED_INT16 , 16, 2, TextureFormat::GENERIC_UINT ),
256*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16_SNORM , CL_RG , CL_SNORM_INT16 , 16, 2, TextureFormat::GENERIC_FLOAT ),
257*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16G16_SINT , CL_RG , CL_SIGNED_INT16 , 16, 2, TextureFormat::GENERIC_SINT ),
258*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8_UNORM , CL_RG , CL_UNORM_INT8 , 8, 2, TextureFormat::GENERIC_FLOAT ),
259*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8_UINT , CL_RG , CL_UNSIGNED_INT8 , 8, 2, TextureFormat::GENERIC_UINT ),
260*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8_SNORM , CL_RG , CL_SNORM_INT8 , 8, 2, TextureFormat::GENERIC_FLOAT ),
261*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8G8_SINT , CL_RG , CL_SIGNED_INT8 , 8, 2, TextureFormat::GENERIC_SINT ),
262*6467f958SSadaf Ebrahimi
263*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32_FLOAT , CL_R , CL_FLOAT , 32, 1, TextureFormat::GENERIC_FLOAT ),
264*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32_UINT , CL_R , CL_UNSIGNED_INT32 , 32, 1, TextureFormat::GENERIC_UINT ),
265*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R32_SINT , CL_R , CL_SIGNED_INT32 , 32, 1, TextureFormat::GENERIC_SINT ),
266*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16_FLOAT , CL_R , CL_HALF_FLOAT , 16, 1, TextureFormat::GENERIC_FLOAT ),
267*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16_UNORM , CL_R , CL_UNORM_INT16 , 16, 1, TextureFormat::GENERIC_FLOAT ),
268*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16_UINT , CL_R , CL_UNSIGNED_INT16 , 16, 1, TextureFormat::GENERIC_UINT ),
269*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16_SNORM , CL_R , CL_SNORM_INT16 , 16, 1, TextureFormat::GENERIC_FLOAT ),
270*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R16_SINT , CL_R , CL_SIGNED_INT16 , 16, 1, TextureFormat::GENERIC_SINT ),
271*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8_UNORM , CL_R , CL_UNORM_INT8 , 8, 1, TextureFormat::GENERIC_FLOAT ),
272*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8_UINT , CL_R , CL_UNSIGNED_INT8 , 8, 1, TextureFormat::GENERIC_UINT ),
273*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8_SNORM , CL_R , CL_SNORM_INT8 , 8, 1, TextureFormat::GENERIC_FLOAT ),
274*6467f958SSadaf Ebrahimi ADD_TEXTURE_FORMAT( DXGI_FORMAT_R8_SINT , CL_R , CL_SIGNED_INT8 , 8, 1, TextureFormat::GENERIC_SINT ),
275*6467f958SSadaf Ebrahimi };
276*6467f958SSadaf Ebrahimi UINT formatCount = sizeof(formats)/sizeof(formats[0]);
277*6467f958SSadaf Ebrahimi
278*6467f958SSadaf Ebrahimi /*
279*6467f958SSadaf Ebrahimi *
280*6467f958SSadaf Ebrahimi * Logging and error reporting
281*6467f958SSadaf Ebrahimi *
282*6467f958SSadaf Ebrahimi */
283*6467f958SSadaf Ebrahimi
284*6467f958SSadaf Ebrahimi static struct
285*6467f958SSadaf Ebrahimi {
286*6467f958SSadaf Ebrahimi cl_int testCount;
287*6467f958SSadaf Ebrahimi cl_int passCount;
288*6467f958SSadaf Ebrahimi
289*6467f958SSadaf Ebrahimi cl_int nonTestFailures;
290*6467f958SSadaf Ebrahimi cl_int inTest;
291*6467f958SSadaf Ebrahimi cl_int currentTestPass;
292*6467f958SSadaf Ebrahimi
293*6467f958SSadaf Ebrahimi char currentTestName[1024];
294*6467f958SSadaf Ebrahimi } HarnessD3D10_testStats = {0};
295*6467f958SSadaf Ebrahimi
HarnessD3D10_TestBegin(const char * fmt,...)296*6467f958SSadaf Ebrahimi void HarnessD3D10_TestBegin(const char* fmt, ...)
297*6467f958SSadaf Ebrahimi {
298*6467f958SSadaf Ebrahimi va_list ap;
299*6467f958SSadaf Ebrahimi
300*6467f958SSadaf Ebrahimi va_start(ap, fmt);
301*6467f958SSadaf Ebrahimi vsprintf(HarnessD3D10_testStats.currentTestName, fmt, ap);
302*6467f958SSadaf Ebrahimi va_end(ap);
303*6467f958SSadaf Ebrahimi
304*6467f958SSadaf Ebrahimi TestPrint("[%s] ... ", HarnessD3D10_testStats.currentTestName);
305*6467f958SSadaf Ebrahimi
306*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.inTest = 1;
307*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.currentTestPass = 1;
308*6467f958SSadaf Ebrahimi }
309*6467f958SSadaf Ebrahimi
HarnessD3D10_TestFail()310*6467f958SSadaf Ebrahimi void HarnessD3D10_TestFail()
311*6467f958SSadaf Ebrahimi {
312*6467f958SSadaf Ebrahimi if (HarnessD3D10_testStats.inTest)
313*6467f958SSadaf Ebrahimi {
314*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.currentTestPass = 0;
315*6467f958SSadaf Ebrahimi }
316*6467f958SSadaf Ebrahimi else
317*6467f958SSadaf Ebrahimi {
318*6467f958SSadaf Ebrahimi ++HarnessD3D10_testStats.nonTestFailures;
319*6467f958SSadaf Ebrahimi }
320*6467f958SSadaf Ebrahimi }
321*6467f958SSadaf Ebrahimi
HarnessD3D10_TestEnd()322*6467f958SSadaf Ebrahimi void HarnessD3D10_TestEnd()
323*6467f958SSadaf Ebrahimi {
324*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.inTest = 0;
325*6467f958SSadaf Ebrahimi
326*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.testCount += 1;
327*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.passCount += HarnessD3D10_testStats.currentTestPass;
328*6467f958SSadaf Ebrahimi
329*6467f958SSadaf Ebrahimi TestPrint("%s\n",
330*6467f958SSadaf Ebrahimi HarnessD3D10_testStats.currentTestPass ? "PASSED" : "FAILED");
331*6467f958SSadaf Ebrahimi }
332*6467f958SSadaf Ebrahimi
HarnessD3D10_TestStats()333*6467f958SSadaf Ebrahimi void HarnessD3D10_TestStats()
334*6467f958SSadaf Ebrahimi {
335*6467f958SSadaf Ebrahimi TestPrint("PASSED %d of %d tests.\n", HarnessD3D10_testStats.passCount, HarnessD3D10_testStats.testCount);
336*6467f958SSadaf Ebrahimi if (HarnessD3D10_testStats.testCount > HarnessD3D10_testStats.passCount)
337*6467f958SSadaf Ebrahimi {
338*6467f958SSadaf Ebrahimi TestPrint("***FAILED***\n");
339*6467f958SSadaf Ebrahimi exit(1);
340*6467f958SSadaf Ebrahimi }
341*6467f958SSadaf Ebrahimi else
342*6467f958SSadaf Ebrahimi {
343*6467f958SSadaf Ebrahimi TestPrint("&&&& cl_khr_d3d10_sharing test PASSED\n");
344*6467f958SSadaf Ebrahimi }
345*6467f958SSadaf Ebrahimi exit(0);
346*6467f958SSadaf Ebrahimi }
347*6467f958SSadaf Ebrahimi
348*6467f958SSadaf Ebrahimi /*
349*6467f958SSadaf Ebrahimi *
350*6467f958SSadaf Ebrahimi * Helper function
351*6467f958SSadaf Ebrahimi *
352*6467f958SSadaf Ebrahimi */
353*6467f958SSadaf Ebrahimi
HarnessD3D10_CreateKernelFromSource(cl_kernel * outKernel,cl_device_id device,cl_context context,const char * source,const char * entrypoint)354*6467f958SSadaf Ebrahimi cl_int HarnessD3D10_CreateKernelFromSource(
355*6467f958SSadaf Ebrahimi cl_kernel *outKernel,
356*6467f958SSadaf Ebrahimi cl_device_id device,
357*6467f958SSadaf Ebrahimi cl_context context,
358*6467f958SSadaf Ebrahimi const char *source,
359*6467f958SSadaf Ebrahimi const char *entrypoint)
360*6467f958SSadaf Ebrahimi {
361*6467f958SSadaf Ebrahimi cl_int status;
362*6467f958SSadaf Ebrahimi cl_program program = NULL;
363*6467f958SSadaf Ebrahimi cl_kernel kernel = NULL;
364*6467f958SSadaf Ebrahimi
365*6467f958SSadaf Ebrahimi // compile program
366*6467f958SSadaf Ebrahimi {
367*6467f958SSadaf Ebrahimi const char *sourceTexts[] = {source};
368*6467f958SSadaf Ebrahimi size_t sourceLengths[] = {strlen(source) };
369*6467f958SSadaf Ebrahimi
370*6467f958SSadaf Ebrahimi status = create_single_kernel_helper(context, &program, &kernel, 1,
371*6467f958SSadaf Ebrahimi &sourceTexts[0], entrypoint);
372*6467f958SSadaf Ebrahimi TestRequire(
373*6467f958SSadaf Ebrahimi CL_SUCCESS == status,
374*6467f958SSadaf Ebrahimi "clCreateProgramWithSource failed");
375*6467f958SSadaf Ebrahimi }
376*6467f958SSadaf Ebrahimi
377*6467f958SSadaf Ebrahimi clReleaseProgram(program);
378*6467f958SSadaf Ebrahimi *outKernel = kernel;
379*6467f958SSadaf Ebrahimi
380*6467f958SSadaf Ebrahimi Cleanup:
381*6467f958SSadaf Ebrahimi
382*6467f958SSadaf Ebrahimi return CL_SUCCESS;
383*6467f958SSadaf Ebrahimi }
384*6467f958SSadaf Ebrahimi
385*6467f958SSadaf Ebrahimi
386*6467f958SSadaf Ebrahimi
387