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