xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/d3d11/texture2d.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 _CRT_SECURE_NO_WARNINGS
17*6467f958SSadaf Ebrahimi #include "harness.h"
18*6467f958SSadaf Ebrahimi #include <vector>
19*6467f958SSadaf Ebrahimi 
20*6467f958SSadaf Ebrahimi Texture2DSize texture2DSizes[] =
21*6467f958SSadaf Ebrahimi {
22*6467f958SSadaf Ebrahimi     {
23*6467f958SSadaf Ebrahimi         4, // Width
24*6467f958SSadaf Ebrahimi         4, // Height
25*6467f958SSadaf Ebrahimi         1, // MipLevels
26*6467f958SSadaf Ebrahimi         1, // ArraySize
27*6467f958SSadaf Ebrahimi         1, // SubResourceCount
28*6467f958SSadaf Ebrahimi         {  // SubResources
29*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
30*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
31*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
32*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
33*6467f958SSadaf Ebrahimi         },
34*6467f958SSadaf Ebrahimi         0, // MiscFlags
35*6467f958SSadaf Ebrahimi     },
36*6467f958SSadaf Ebrahimi     {
37*6467f958SSadaf Ebrahimi         15, // Width
38*6467f958SSadaf Ebrahimi         37, // Height
39*6467f958SSadaf Ebrahimi         2, // MipLevels
40*6467f958SSadaf Ebrahimi         1, // ArraySize
41*6467f958SSadaf Ebrahimi         2, // SubResourceCount
42*6467f958SSadaf Ebrahimi         {  // SubResources
43*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
44*6467f958SSadaf Ebrahimi             {1, 0}, // MipLevel, ArraySlice
45*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
46*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
47*6467f958SSadaf Ebrahimi         },
48*6467f958SSadaf Ebrahimi         0, // MiscFlags
49*6467f958SSadaf Ebrahimi     },
50*6467f958SSadaf Ebrahimi     {
51*6467f958SSadaf Ebrahimi         65, // Width
52*6467f958SSadaf Ebrahimi         17, // Height
53*6467f958SSadaf Ebrahimi         1, // MipLevels
54*6467f958SSadaf Ebrahimi         1, // ArraySize
55*6467f958SSadaf Ebrahimi         1, // SubResourceCount
56*6467f958SSadaf Ebrahimi         {  // SubResources
57*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
58*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
59*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
60*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
61*6467f958SSadaf Ebrahimi         },
62*6467f958SSadaf Ebrahimi         D3D11_RESOURCE_MISC_SHARED, // MiscFlags
63*6467f958SSadaf Ebrahimi     },
64*6467f958SSadaf Ebrahimi 
65*6467f958SSadaf Ebrahimi     {
66*6467f958SSadaf Ebrahimi         127, // Width
67*6467f958SSadaf Ebrahimi         125, // Height
68*6467f958SSadaf Ebrahimi         4, // MipLevels
69*6467f958SSadaf Ebrahimi         1, // ArraySize
70*6467f958SSadaf Ebrahimi         4, // SubResourceCount
71*6467f958SSadaf Ebrahimi         {  // SubResources
72*6467f958SSadaf Ebrahimi             {3, 0}, // MipLevel, ArraySlice
73*6467f958SSadaf Ebrahimi             {2, 0}, // MipLevel, ArraySlice
74*6467f958SSadaf Ebrahimi             {1, 0}, // MipLevel, ArraySlice
75*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
76*6467f958SSadaf Ebrahimi         },
77*6467f958SSadaf Ebrahimi         0, // MiscFlags
78*6467f958SSadaf Ebrahimi     },
79*6467f958SSadaf Ebrahimi     {
80*6467f958SSadaf Ebrahimi         128, // Width
81*6467f958SSadaf Ebrahimi         128, // Height
82*6467f958SSadaf Ebrahimi         4, // MipLevels
83*6467f958SSadaf Ebrahimi         6, // ArraySize
84*6467f958SSadaf Ebrahimi         4, // SubResourceCount
85*6467f958SSadaf Ebrahimi         {  // SubResources
86*6467f958SSadaf Ebrahimi             {0, 1}, // MipLevel, ArraySlice
87*6467f958SSadaf Ebrahimi             {1, 0}, // MipLevel, ArraySlice
88*6467f958SSadaf Ebrahimi             {0, 2}, // MipLevel, ArraySlice
89*6467f958SSadaf Ebrahimi             {3, 5}, // MipLevel, ArraySlice
90*6467f958SSadaf Ebrahimi         },
91*6467f958SSadaf Ebrahimi         0, // MiscFlags
92*6467f958SSadaf Ebrahimi     },
93*6467f958SSadaf Ebrahimi     {
94*6467f958SSadaf Ebrahimi         256, // Width
95*6467f958SSadaf Ebrahimi         256, // Height
96*6467f958SSadaf Ebrahimi         0, // MipLevels
97*6467f958SSadaf Ebrahimi         256, // ArraySize
98*6467f958SSadaf Ebrahimi         4, // SubResourceCount
99*6467f958SSadaf Ebrahimi         {  // SubResources
100*6467f958SSadaf Ebrahimi             {0,   0}, // MipLevel, ArraySlice
101*6467f958SSadaf Ebrahimi             {1, 255}, // MipLevel, ArraySlice
102*6467f958SSadaf Ebrahimi             {2, 127}, // MipLevel, ArraySlice
103*6467f958SSadaf Ebrahimi             {3, 128}, // MipLevel, ArraySlice
104*6467f958SSadaf Ebrahimi         },
105*6467f958SSadaf Ebrahimi         0, // MiscFlags
106*6467f958SSadaf Ebrahimi     },
107*6467f958SSadaf Ebrahimi     {
108*6467f958SSadaf Ebrahimi         258, // Width
109*6467f958SSadaf Ebrahimi         511, // Height
110*6467f958SSadaf Ebrahimi         1, // MipLevels
111*6467f958SSadaf Ebrahimi         1, // ArraySize
112*6467f958SSadaf Ebrahimi         1, // SubResourceCount
113*6467f958SSadaf Ebrahimi         {  // SubResources
114*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
115*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
116*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
117*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
118*6467f958SSadaf Ebrahimi         },
119*6467f958SSadaf Ebrahimi         0, // MiscFlags
120*6467f958SSadaf Ebrahimi     },
121*6467f958SSadaf Ebrahimi     {
122*6467f958SSadaf Ebrahimi         767, // Width
123*6467f958SSadaf Ebrahimi         1025, // Height
124*6467f958SSadaf Ebrahimi         4, // MipLevels
125*6467f958SSadaf Ebrahimi         1, // ArraySize
126*6467f958SSadaf Ebrahimi         1, // SubResourceCount
127*6467f958SSadaf Ebrahimi         {  // SubResources
128*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
129*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
130*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
131*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
132*6467f958SSadaf Ebrahimi         },
133*6467f958SSadaf Ebrahimi         0, // MiscFlags
134*6467f958SSadaf Ebrahimi     },
135*6467f958SSadaf Ebrahimi     {
136*6467f958SSadaf Ebrahimi         2048, // Width
137*6467f958SSadaf Ebrahimi         2048, // Height
138*6467f958SSadaf Ebrahimi         1, // MipLevels
139*6467f958SSadaf Ebrahimi         1, // ArraySize
140*6467f958SSadaf Ebrahimi         1, // SubResourceCount
141*6467f958SSadaf Ebrahimi         {  // SubResources
142*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
143*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
144*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
145*6467f958SSadaf Ebrahimi             {0, 0}, // MipLevel, ArraySlice
146*6467f958SSadaf Ebrahimi         },
147*6467f958SSadaf Ebrahimi         0, // MiscFlags
148*6467f958SSadaf Ebrahimi     },
149*6467f958SSadaf Ebrahimi };
150*6467f958SSadaf Ebrahimi UINT texture2DSizeCount = sizeof(texture2DSizes)/sizeof(texture2DSizes[0]);
151*6467f958SSadaf Ebrahimi 
152*6467f958SSadaf Ebrahimi const char *
153*6467f958SSadaf Ebrahimi texture2DPatterns[2][2] =
154*6467f958SSadaf Ebrahimi {
155*6467f958SSadaf Ebrahimi     {"aAbBcCdDeEfFgGhHiIjJ", "AaBbCcDdEeFfGgHhIiJj"},
156*6467f958SSadaf Ebrahimi     {"zZyYxXwWvVuUtTsSrRqQ", "ZzYyXxWwVvUuTtSsRrQq"},
157*6467f958SSadaf Ebrahimi };
158*6467f958SSadaf Ebrahimi 
SubTestTexture2D(cl_context context,cl_command_queue command_queue,cl_kernel kernel,ID3D11Device * pDevice,ID3D11DeviceContext * pDC,const TextureFormat * format,const Texture2DSize * size)159*6467f958SSadaf Ebrahimi void SubTestTexture2D(
160*6467f958SSadaf Ebrahimi     cl_context context,
161*6467f958SSadaf Ebrahimi     cl_command_queue command_queue,
162*6467f958SSadaf Ebrahimi     cl_kernel kernel,
163*6467f958SSadaf Ebrahimi     ID3D11Device* pDevice,
164*6467f958SSadaf Ebrahimi     ID3D11DeviceContext* pDC,
165*6467f958SSadaf Ebrahimi     const TextureFormat* format,
166*6467f958SSadaf Ebrahimi     const Texture2DSize* size)
167*6467f958SSadaf Ebrahimi {
168*6467f958SSadaf Ebrahimi     ID3D11Texture2D* pTexture = NULL;
169*6467f958SSadaf Ebrahimi     HRESULT hr = S_OK;
170*6467f958SSadaf Ebrahimi     cl_image_format clFormat;
171*6467f958SSadaf Ebrahimi     cl_int result = CL_SUCCESS;
172*6467f958SSadaf Ebrahimi 
173*6467f958SSadaf Ebrahimi     HarnessD3D11_TestBegin("2D Texture: Format=%s, Width=%d, Height=%d, MipLevels=%d, ArraySize=%d",
174*6467f958SSadaf Ebrahimi         format->name_format,
175*6467f958SSadaf Ebrahimi         size->Width,
176*6467f958SSadaf Ebrahimi         size->Height,
177*6467f958SSadaf Ebrahimi         size->MipLevels,
178*6467f958SSadaf Ebrahimi         size->ArraySize);
179*6467f958SSadaf Ebrahimi 
180*6467f958SSadaf Ebrahimi     struct
181*6467f958SSadaf Ebrahimi     {
182*6467f958SSadaf Ebrahimi         cl_mem mem;
183*6467f958SSadaf Ebrahimi         UINT subResource;
184*6467f958SSadaf Ebrahimi         UINT width;
185*6467f958SSadaf Ebrahimi         UINT height;
186*6467f958SSadaf Ebrahimi     }
187*6467f958SSadaf Ebrahimi     subResourceInfo[4];
188*6467f958SSadaf Ebrahimi 
189*6467f958SSadaf Ebrahimi     cl_event events[4] = {NULL, NULL, NULL, NULL};
190*6467f958SSadaf Ebrahimi 
191*6467f958SSadaf Ebrahimi     // create the D3D11 resources
192*6467f958SSadaf Ebrahimi     {
193*6467f958SSadaf Ebrahimi         D3D11_TEXTURE2D_DESC desc;
194*6467f958SSadaf Ebrahimi         memset(&desc, 0, sizeof(desc) );
195*6467f958SSadaf Ebrahimi         desc.Width      = size->Width;
196*6467f958SSadaf Ebrahimi         desc.Height     = size->Height;
197*6467f958SSadaf Ebrahimi         desc.MipLevels  = size->MipLevels;
198*6467f958SSadaf Ebrahimi         desc.ArraySize  = size->ArraySize;
199*6467f958SSadaf Ebrahimi         desc.Format     = format->format;
200*6467f958SSadaf Ebrahimi         desc.SampleDesc.Count = 1;
201*6467f958SSadaf Ebrahimi         desc.SampleDesc.Quality = 0;
202*6467f958SSadaf Ebrahimi         desc.Usage = D3D11_USAGE_DEFAULT;
203*6467f958SSadaf Ebrahimi         desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
204*6467f958SSadaf Ebrahimi         desc.CPUAccessFlags = 0;
205*6467f958SSadaf Ebrahimi         desc.MiscFlags = 0;
206*6467f958SSadaf Ebrahimi 
207*6467f958SSadaf Ebrahimi         hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture);
208*6467f958SSadaf Ebrahimi         TestRequire(SUCCEEDED(hr), "ID3D11Device::CreateTexture2D failed (non-OpenCL D3D error, but test is invalid).");
209*6467f958SSadaf Ebrahimi     }
210*6467f958SSadaf Ebrahimi 
211*6467f958SSadaf Ebrahimi     // initialize some useful variables
212*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
213*6467f958SSadaf Ebrahimi     {
214*6467f958SSadaf Ebrahimi         // compute the expected values for the subresource
215*6467f958SSadaf Ebrahimi         subResourceInfo[i].subResource = D3D11CalcSubresource(
216*6467f958SSadaf Ebrahimi             size->subResources[i].MipLevel,
217*6467f958SSadaf Ebrahimi             size->subResources[i].ArraySlice,
218*6467f958SSadaf Ebrahimi             size->MipLevels);
219*6467f958SSadaf Ebrahimi         subResourceInfo[i].width = size->Width;
220*6467f958SSadaf Ebrahimi         subResourceInfo[i].height = size->Height;
221*6467f958SSadaf Ebrahimi         for (UINT j = 0; j < size->subResources[i].MipLevel; ++j) {
222*6467f958SSadaf Ebrahimi             subResourceInfo[i].width /= 2;
223*6467f958SSadaf Ebrahimi             subResourceInfo[i].height /= 2;
224*6467f958SSadaf Ebrahimi         }
225*6467f958SSadaf Ebrahimi         subResourceInfo[i].mem = NULL;
226*6467f958SSadaf Ebrahimi     }
227*6467f958SSadaf Ebrahimi 
228*6467f958SSadaf Ebrahimi     // copy a pattern into the corners of the image, coordinates
229*6467f958SSadaf Ebrahimi     // (0,0), (w,0-1), (0,h-1), (w-1,h-1)
230*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
231*6467f958SSadaf Ebrahimi     for (UINT x = 0; x < 2; ++x)
232*6467f958SSadaf Ebrahimi     for (UINT y = 0; y < 2; ++y)
233*6467f958SSadaf Ebrahimi     {
234*6467f958SSadaf Ebrahimi         // create the staging buffer
235*6467f958SSadaf Ebrahimi         ID3D11Texture2D* pStagingBuffer = NULL;
236*6467f958SSadaf Ebrahimi         {
237*6467f958SSadaf Ebrahimi             D3D11_TEXTURE2D_DESC desc = {0};
238*6467f958SSadaf Ebrahimi             desc.Width      = 1;
239*6467f958SSadaf Ebrahimi             desc.Height     = 1;
240*6467f958SSadaf Ebrahimi             desc.MipLevels  = 1;
241*6467f958SSadaf Ebrahimi             desc.ArraySize  = 1;
242*6467f958SSadaf Ebrahimi             desc.Format     = format->format;
243*6467f958SSadaf Ebrahimi             desc.SampleDesc.Count = 1;
244*6467f958SSadaf Ebrahimi             desc.SampleDesc.Quality = 0;
245*6467f958SSadaf Ebrahimi             desc.Usage = D3D11_USAGE_STAGING;
246*6467f958SSadaf Ebrahimi             desc.BindFlags = 0;
247*6467f958SSadaf Ebrahimi             desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
248*6467f958SSadaf Ebrahimi             desc.MiscFlags = 0;
249*6467f958SSadaf Ebrahimi             hr = pDevice->CreateTexture2D(&desc, NULL, &pStagingBuffer);
250*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "ID3D11Device::CreateTexture2D failed (non-OpenCL D3D error, but test is invalid).");
251*6467f958SSadaf Ebrahimi         }
252*6467f958SSadaf Ebrahimi 
253*6467f958SSadaf Ebrahimi         // write the data to the staging buffer
254*6467f958SSadaf Ebrahimi         {
255*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE mappedTexture;
256*6467f958SSadaf Ebrahimi             hr = pDC->Map(
257*6467f958SSadaf Ebrahimi                 pStagingBuffer,
258*6467f958SSadaf Ebrahimi                 0,
259*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
260*6467f958SSadaf Ebrahimi                 0,
261*6467f958SSadaf Ebrahimi                 &mappedTexture);
262*6467f958SSadaf Ebrahimi             memcpy(mappedTexture.pData, texture2DPatterns[x][y], format->bytesPerPixel);
263*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
264*6467f958SSadaf Ebrahimi         }
265*6467f958SSadaf Ebrahimi 
266*6467f958SSadaf Ebrahimi         // copy the data to to the texture
267*6467f958SSadaf Ebrahimi         {
268*6467f958SSadaf Ebrahimi             D3D11_BOX box = {0};
269*6467f958SSadaf Ebrahimi             box.front   = 0; box.back    = 1;
270*6467f958SSadaf Ebrahimi             box.top     = 0; box.bottom  = 1;
271*6467f958SSadaf Ebrahimi             box.left    = 0; box.right   = 1;
272*6467f958SSadaf Ebrahimi             pDC->CopySubresourceRegion(
273*6467f958SSadaf Ebrahimi                 pTexture,
274*6467f958SSadaf Ebrahimi                 subResourceInfo[i].subResource,
275*6467f958SSadaf Ebrahimi                 x ? subResourceInfo[i].width  - 1 : 0,
276*6467f958SSadaf Ebrahimi                 y ? subResourceInfo[i].height - 1 : 0,
277*6467f958SSadaf Ebrahimi                 0,
278*6467f958SSadaf Ebrahimi                 pStagingBuffer,
279*6467f958SSadaf Ebrahimi                 0,
280*6467f958SSadaf Ebrahimi                 &box);
281*6467f958SSadaf Ebrahimi         }
282*6467f958SSadaf Ebrahimi 
283*6467f958SSadaf Ebrahimi         pStagingBuffer->Release();
284*6467f958SSadaf Ebrahimi     }
285*6467f958SSadaf Ebrahimi 
286*6467f958SSadaf Ebrahimi     // create the cl_mem objects for the resources and verify its sanity
287*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
288*6467f958SSadaf Ebrahimi     {
289*6467f958SSadaf Ebrahimi         // create a cl_mem for the resource
290*6467f958SSadaf Ebrahimi         subResourceInfo[i].mem = clCreateFromD3D11Texture2DKHR(
291*6467f958SSadaf Ebrahimi             context,
292*6467f958SSadaf Ebrahimi             0,
293*6467f958SSadaf Ebrahimi             pTexture,
294*6467f958SSadaf Ebrahimi             subResourceInfo[i].subResource,
295*6467f958SSadaf Ebrahimi             &result);
296*6467f958SSadaf Ebrahimi         if (CL_IMAGE_FORMAT_NOT_SUPPORTED == result)
297*6467f958SSadaf Ebrahimi         {
298*6467f958SSadaf Ebrahimi             goto Cleanup;
299*6467f958SSadaf Ebrahimi         }
300*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clCreateFromD3D11Texture2DKHR failed");
301*6467f958SSadaf Ebrahimi 
302*6467f958SSadaf Ebrahimi         // query resource pointer and verify
303*6467f958SSadaf Ebrahimi         ID3D11Resource* clResource = NULL;
304*6467f958SSadaf Ebrahimi         result = clGetMemObjectInfo(
305*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
306*6467f958SSadaf Ebrahimi             CL_MEM_D3D11_RESOURCE_KHR,
307*6467f958SSadaf Ebrahimi             sizeof(clResource),
308*6467f958SSadaf Ebrahimi             &clResource,
309*6467f958SSadaf Ebrahimi             NULL);
310*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetMemObjectInfo for CL_MEM_D3D11_RESOURCE_KHR failed.");
311*6467f958SSadaf Ebrahimi         TestRequire(clResource == pTexture, "clGetMemObjectInfo for CL_MEM_D3D11_RESOURCE_KHR returned incorrect value.");
312*6467f958SSadaf Ebrahimi 
313*6467f958SSadaf Ebrahimi         // query subresource and verify
314*6467f958SSadaf Ebrahimi         UINT clSubResource;
315*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
316*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
317*6467f958SSadaf Ebrahimi             CL_IMAGE_D3D11_SUBRESOURCE_KHR,
318*6467f958SSadaf Ebrahimi             sizeof(clSubResource),
319*6467f958SSadaf Ebrahimi             &clSubResource,
320*6467f958SSadaf Ebrahimi             NULL);
321*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_D3D11_SUBRESOURCE_KHR failed");
322*6467f958SSadaf Ebrahimi         TestRequire(clSubResource == subResourceInfo[i].subResource, "clGetImageInfo for CL_IMAGE_D3D11_SUBRESOURCE_KHR returned incorrect value.");
323*6467f958SSadaf Ebrahimi 
324*6467f958SSadaf Ebrahimi         // query format and verify
325*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
326*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
327*6467f958SSadaf Ebrahimi             CL_IMAGE_FORMAT,
328*6467f958SSadaf Ebrahimi             sizeof(clFormat),
329*6467f958SSadaf Ebrahimi             &clFormat,
330*6467f958SSadaf Ebrahimi             NULL);
331*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_FORMAT failed");
332*6467f958SSadaf Ebrahimi         TestRequire(clFormat.image_channel_order == format->channel_order, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel order.");
333*6467f958SSadaf Ebrahimi         TestRequire(clFormat.image_channel_data_type == format->channel_type, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel data type.");
334*6467f958SSadaf Ebrahimi 
335*6467f958SSadaf Ebrahimi         // query width
336*6467f958SSadaf Ebrahimi         size_t width;
337*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
338*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
339*6467f958SSadaf Ebrahimi             CL_IMAGE_WIDTH,
340*6467f958SSadaf Ebrahimi             sizeof(width),
341*6467f958SSadaf Ebrahimi             &width,
342*6467f958SSadaf Ebrahimi             NULL);
343*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_WIDTH failed");
344*6467f958SSadaf Ebrahimi         TestRequire(width == subResourceInfo[i].width, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
345*6467f958SSadaf Ebrahimi 
346*6467f958SSadaf Ebrahimi         // query height
347*6467f958SSadaf Ebrahimi         size_t height;
348*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
349*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
350*6467f958SSadaf Ebrahimi             CL_IMAGE_HEIGHT,
351*6467f958SSadaf Ebrahimi             sizeof(height),
352*6467f958SSadaf Ebrahimi             &height,
353*6467f958SSadaf Ebrahimi             NULL);
354*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_HEIGHT failed");
355*6467f958SSadaf Ebrahimi         TestRequire(height == subResourceInfo[i].height, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
356*6467f958SSadaf Ebrahimi 
357*6467f958SSadaf Ebrahimi     }
358*6467f958SSadaf Ebrahimi 
359*6467f958SSadaf Ebrahimi     // acquire the resources for OpenCL
360*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < 2; ++i)
361*6467f958SSadaf Ebrahimi     {
362*6467f958SSadaf Ebrahimi         cl_uint memCount = 0;
363*6467f958SSadaf Ebrahimi         cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
364*6467f958SSadaf Ebrahimi 
365*6467f958SSadaf Ebrahimi         // cut the registered sub-resources into two sets and send the acquire calls for them separately
366*6467f958SSadaf Ebrahimi         if (i == 0)
367*6467f958SSadaf Ebrahimi         {
368*6467f958SSadaf Ebrahimi             for(UINT j = 0; j < size->SubResourceCount/2; ++j)
369*6467f958SSadaf Ebrahimi             {
370*6467f958SSadaf Ebrahimi                 memToAcquire[memCount++] = subResourceInfo[j].mem;
371*6467f958SSadaf Ebrahimi             }
372*6467f958SSadaf Ebrahimi         }
373*6467f958SSadaf Ebrahimi         else
374*6467f958SSadaf Ebrahimi         {
375*6467f958SSadaf Ebrahimi             for(UINT j = size->SubResourceCount/2; j < size->SubResourceCount; ++j)
376*6467f958SSadaf Ebrahimi             {
377*6467f958SSadaf Ebrahimi                 memToAcquire[memCount++] = subResourceInfo[j].mem;
378*6467f958SSadaf Ebrahimi             }
379*6467f958SSadaf Ebrahimi         }
380*6467f958SSadaf Ebrahimi         if (!memCount) continue;
381*6467f958SSadaf Ebrahimi 
382*6467f958SSadaf Ebrahimi         // do the acquire
383*6467f958SSadaf Ebrahimi         result = clEnqueueAcquireD3D11ObjectsKHR(
384*6467f958SSadaf Ebrahimi             command_queue,
385*6467f958SSadaf Ebrahimi             memCount,
386*6467f958SSadaf Ebrahimi             memToAcquire,
387*6467f958SSadaf Ebrahimi             0,
388*6467f958SSadaf Ebrahimi             NULL,
389*6467f958SSadaf Ebrahimi             &events[0+i]);
390*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueAcquireD3D11ObjectsKHR failed.");
391*6467f958SSadaf Ebrahimi         TestRequire(events[0+i], "clEnqueueAcquireD3D11ObjectsKHR did not return an event.");
392*6467f958SSadaf Ebrahimi 
393*6467f958SSadaf Ebrahimi         // make sure the event type is correct
394*6467f958SSadaf Ebrahimi         cl_uint eventType = 0;
395*6467f958SSadaf Ebrahimi         result = clGetEventInfo(
396*6467f958SSadaf Ebrahimi             events[0+i],
397*6467f958SSadaf Ebrahimi             CL_EVENT_COMMAND_TYPE,
398*6467f958SSadaf Ebrahimi             sizeof(eventType),
399*6467f958SSadaf Ebrahimi             &eventType,
400*6467f958SSadaf Ebrahimi             NULL);
401*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetEventInfo for event created by clEnqueueAcquireD3D11ObjectsKHR failed.");
402*6467f958SSadaf Ebrahimi         TestRequire(eventType == CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR, "clGetEventInfo for CL_EVENT_COMMAND_TYPE was not CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR.");
403*6467f958SSadaf Ebrahimi     }
404*6467f958SSadaf Ebrahimi 
405*6467f958SSadaf Ebrahimi     // download the data using OpenCL & compare with the expected results
406*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
407*6467f958SSadaf Ebrahimi     {
408*6467f958SSadaf Ebrahimi         size_t origin[3] = {0,0,0};
409*6467f958SSadaf Ebrahimi         size_t region[3] = {subResourceInfo[i].width, subResourceInfo[i].height, 1};
410*6467f958SSadaf Ebrahimi         cl_mem tempImage;
411*6467f958SSadaf Ebrahimi         cl_image_desc image_desc = { 0 };
412*6467f958SSadaf Ebrahimi         image_desc.image_depth = 1;
413*6467f958SSadaf Ebrahimi         image_desc.image_height = subResourceInfo[i].height;
414*6467f958SSadaf Ebrahimi         image_desc.image_width = subResourceInfo[i].width;
415*6467f958SSadaf Ebrahimi         image_desc.image_type = CL_MEM_OBJECT_IMAGE2D;
416*6467f958SSadaf Ebrahimi 
417*6467f958SSadaf Ebrahimi         tempImage = clCreateImage(context, 0, &clFormat, &image_desc, NULL, &result);
418*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clCreateImage failed");
419*6467f958SSadaf Ebrahimi 
420*6467f958SSadaf Ebrahimi         result = clEnqueueCopyImage(command_queue, subResourceInfo[i].mem, tempImage,
421*6467f958SSadaf Ebrahimi                 origin, origin, region, 0, NULL, NULL);
422*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueCopyImage failed");
423*6467f958SSadaf Ebrahimi 
424*6467f958SSadaf Ebrahimi         // copy (0,0) to (1,1) and (w-1,h-1) to (w-2,h-2) using a kernel
425*6467f958SSadaf Ebrahimi         {
426*6467f958SSadaf Ebrahimi             result = clSetKernelArg(
427*6467f958SSadaf Ebrahimi                 kernel,
428*6467f958SSadaf Ebrahimi                 0,
429*6467f958SSadaf Ebrahimi                 sizeof(cl_mem),
430*6467f958SSadaf Ebrahimi                 (void *)&tempImage);
431*6467f958SSadaf Ebrahimi             result = clSetKernelArg(
432*6467f958SSadaf Ebrahimi                 kernel,
433*6467f958SSadaf Ebrahimi                 1,
434*6467f958SSadaf Ebrahimi                 sizeof(cl_mem),
435*6467f958SSadaf Ebrahimi                 (void *)&subResourceInfo[i].mem);
436*6467f958SSadaf Ebrahimi 
437*6467f958SSadaf Ebrahimi             TestRequire(CL_SUCCESS == result, "clSetKernelArg failed");
438*6467f958SSadaf Ebrahimi 
439*6467f958SSadaf Ebrahimi             size_t localWorkSize[] = {1};
440*6467f958SSadaf Ebrahimi             size_t globalWorkSize[] = {1};
441*6467f958SSadaf Ebrahimi             result = clEnqueueNDRangeKernel(
442*6467f958SSadaf Ebrahimi                 command_queue,
443*6467f958SSadaf Ebrahimi                 kernel,
444*6467f958SSadaf Ebrahimi                 1,
445*6467f958SSadaf Ebrahimi                 NULL,
446*6467f958SSadaf Ebrahimi                 globalWorkSize,
447*6467f958SSadaf Ebrahimi                 localWorkSize,
448*6467f958SSadaf Ebrahimi                 0,
449*6467f958SSadaf Ebrahimi                 NULL,
450*6467f958SSadaf Ebrahimi                 NULL);
451*6467f958SSadaf Ebrahimi             TestRequire(CL_SUCCESS == result, "clEnqueueNDRangeKernel failed");
452*6467f958SSadaf Ebrahimi         }
453*6467f958SSadaf Ebrahimi         // copy (w-1,0) to (w-2,1) and (0,h) to (1,h-2) using a memcpy
454*6467f958SSadaf Ebrahimi         for (UINT x = 0; x < 2; ++x)
455*6467f958SSadaf Ebrahimi         for (UINT y = 0; y < 2; ++y)
456*6467f958SSadaf Ebrahimi         {
457*6467f958SSadaf Ebrahimi             if (x == y)
458*6467f958SSadaf Ebrahimi             {
459*6467f958SSadaf Ebrahimi                 continue;
460*6467f958SSadaf Ebrahimi             }
461*6467f958SSadaf Ebrahimi 
462*6467f958SSadaf Ebrahimi             size_t src[3] =
463*6467f958SSadaf Ebrahimi             {
464*6467f958SSadaf Ebrahimi                 x ? subResourceInfo[i].width  - 1 : 0,
465*6467f958SSadaf Ebrahimi                 y ? subResourceInfo[i].height - 1 : 0,
466*6467f958SSadaf Ebrahimi                 0,
467*6467f958SSadaf Ebrahimi             };
468*6467f958SSadaf Ebrahimi             size_t dst[3] =
469*6467f958SSadaf Ebrahimi             {
470*6467f958SSadaf Ebrahimi                 x ? subResourceInfo[i].width  - 2 : 1,
471*6467f958SSadaf Ebrahimi                 y ? subResourceInfo[i].height - 2 : 1,
472*6467f958SSadaf Ebrahimi                 0,
473*6467f958SSadaf Ebrahimi             };
474*6467f958SSadaf Ebrahimi             size_t region[3] =
475*6467f958SSadaf Ebrahimi             {
476*6467f958SSadaf Ebrahimi                 1,
477*6467f958SSadaf Ebrahimi                 1,
478*6467f958SSadaf Ebrahimi                 1,
479*6467f958SSadaf Ebrahimi             };
480*6467f958SSadaf Ebrahimi             result = clEnqueueCopyImage(
481*6467f958SSadaf Ebrahimi                 command_queue,
482*6467f958SSadaf Ebrahimi                 subResourceInfo[i].mem,
483*6467f958SSadaf Ebrahimi                 subResourceInfo[i].mem,
484*6467f958SSadaf Ebrahimi                 src,
485*6467f958SSadaf Ebrahimi                 dst,
486*6467f958SSadaf Ebrahimi                 region,
487*6467f958SSadaf Ebrahimi                 0,
488*6467f958SSadaf Ebrahimi                 NULL,
489*6467f958SSadaf Ebrahimi                 NULL);
490*6467f958SSadaf Ebrahimi             TestRequire(result == CL_SUCCESS, "clEnqueueCopyImage failed.");
491*6467f958SSadaf Ebrahimi         }
492*6467f958SSadaf Ebrahimi         clReleaseMemObject(tempImage);
493*6467f958SSadaf Ebrahimi     }
494*6467f958SSadaf Ebrahimi 
495*6467f958SSadaf Ebrahimi     // release the resource from OpenCL
496*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < 2; ++i)
497*6467f958SSadaf Ebrahimi     {
498*6467f958SSadaf Ebrahimi         cl_uint memCount = 0;
499*6467f958SSadaf Ebrahimi         cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
500*6467f958SSadaf Ebrahimi 
501*6467f958SSadaf Ebrahimi         // cut the registered sub-resources into two sets and send the release calls for them separately
502*6467f958SSadaf Ebrahimi         if (i == 0)
503*6467f958SSadaf Ebrahimi         {
504*6467f958SSadaf Ebrahimi             for(UINT j = size->SubResourceCount/4; j < size->SubResourceCount; ++j)
505*6467f958SSadaf Ebrahimi             {
506*6467f958SSadaf Ebrahimi                 memToAcquire[memCount++] = subResourceInfo[j].mem;
507*6467f958SSadaf Ebrahimi             }
508*6467f958SSadaf Ebrahimi         }
509*6467f958SSadaf Ebrahimi         else
510*6467f958SSadaf Ebrahimi         {
511*6467f958SSadaf Ebrahimi             for(UINT j = 0; j < size->SubResourceCount/4; ++j)
512*6467f958SSadaf Ebrahimi             {
513*6467f958SSadaf Ebrahimi                 memToAcquire[memCount++] = subResourceInfo[j].mem;
514*6467f958SSadaf Ebrahimi             }
515*6467f958SSadaf Ebrahimi         }
516*6467f958SSadaf Ebrahimi         if (!memCount) continue;
517*6467f958SSadaf Ebrahimi 
518*6467f958SSadaf Ebrahimi         // do the release
519*6467f958SSadaf Ebrahimi         result = clEnqueueReleaseD3D11ObjectsKHR(
520*6467f958SSadaf Ebrahimi             command_queue,
521*6467f958SSadaf Ebrahimi             memCount,
522*6467f958SSadaf Ebrahimi             memToAcquire,
523*6467f958SSadaf Ebrahimi             0,
524*6467f958SSadaf Ebrahimi             NULL,
525*6467f958SSadaf Ebrahimi             &events[2+i]);
526*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueReleaseD3D11ObjectsKHR failed.");
527*6467f958SSadaf Ebrahimi         TestRequire(events[2+i], "clEnqueueReleaseD3D11ObjectsKHR did not return an event.");
528*6467f958SSadaf Ebrahimi 
529*6467f958SSadaf Ebrahimi         // make sure the event type is correct
530*6467f958SSadaf Ebrahimi         cl_uint eventType = 0;
531*6467f958SSadaf Ebrahimi         result = clGetEventInfo(
532*6467f958SSadaf Ebrahimi             events[2+i],
533*6467f958SSadaf Ebrahimi             CL_EVENT_COMMAND_TYPE,
534*6467f958SSadaf Ebrahimi             sizeof(eventType),
535*6467f958SSadaf Ebrahimi             &eventType,
536*6467f958SSadaf Ebrahimi             NULL);
537*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetEventInfo for event created by clEnqueueReleaseD3D11ObjectsKHR failed.");
538*6467f958SSadaf Ebrahimi         TestRequire(eventType == CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR, "clGetEventInfo for CL_EVENT_COMMAND_TYPE was not CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR.");
539*6467f958SSadaf Ebrahimi     }
540*6467f958SSadaf Ebrahimi 
541*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
542*6467f958SSadaf Ebrahimi     for (UINT x = 0; x < 2; ++x)
543*6467f958SSadaf Ebrahimi     for (UINT y = 0; y < 2; ++y)
544*6467f958SSadaf Ebrahimi     {
545*6467f958SSadaf Ebrahimi         // create the staging buffer
546*6467f958SSadaf Ebrahimi         ID3D11Texture2D* pStagingBuffer = NULL;
547*6467f958SSadaf Ebrahimi         {
548*6467f958SSadaf Ebrahimi             D3D11_TEXTURE2D_DESC desc = {0};
549*6467f958SSadaf Ebrahimi             desc.Width      = 1;
550*6467f958SSadaf Ebrahimi             desc.Height     = 1;
551*6467f958SSadaf Ebrahimi             desc.MipLevels  = 1;
552*6467f958SSadaf Ebrahimi             desc.ArraySize  = 1;
553*6467f958SSadaf Ebrahimi             desc.Format     = format->format;
554*6467f958SSadaf Ebrahimi             desc.SampleDesc.Count = 1;
555*6467f958SSadaf Ebrahimi             desc.SampleDesc.Quality = 0;
556*6467f958SSadaf Ebrahimi             desc.Usage = D3D11_USAGE_STAGING;
557*6467f958SSadaf Ebrahimi             desc.BindFlags = 0;
558*6467f958SSadaf Ebrahimi             desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
559*6467f958SSadaf Ebrahimi             desc.MiscFlags = 0;
560*6467f958SSadaf Ebrahimi             hr = pDevice->CreateTexture2D(&desc, NULL, &pStagingBuffer);
561*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to create staging buffer.");
562*6467f958SSadaf Ebrahimi         }
563*6467f958SSadaf Ebrahimi 
564*6467f958SSadaf Ebrahimi         // wipe out the staging buffer to make sure we don't get stale values
565*6467f958SSadaf Ebrahimi         {
566*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE mappedTexture;
567*6467f958SSadaf Ebrahimi             hr = pDC->Map(
568*6467f958SSadaf Ebrahimi                 pStagingBuffer,
569*6467f958SSadaf Ebrahimi                 0,
570*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
571*6467f958SSadaf Ebrahimi                 0,
572*6467f958SSadaf Ebrahimi                 &mappedTexture);
573*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
574*6467f958SSadaf Ebrahimi             memset(mappedTexture.pData, 0, format->bytesPerPixel);
575*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
576*6467f958SSadaf Ebrahimi         }
577*6467f958SSadaf Ebrahimi 
578*6467f958SSadaf Ebrahimi         // copy the pixel to the staging buffer
579*6467f958SSadaf Ebrahimi         {
580*6467f958SSadaf Ebrahimi             D3D11_BOX box = {0};
581*6467f958SSadaf Ebrahimi             box.left    = x ? subResourceInfo[i].width  - 2 : 1; box.right  = box.left + 1;
582*6467f958SSadaf Ebrahimi             box.top     = y ? subResourceInfo[i].height - 2 : 1; box.bottom = box.top + 1;
583*6467f958SSadaf Ebrahimi             box.front   = 0;                                     box.back   = 1;
584*6467f958SSadaf Ebrahimi             pDC->CopySubresourceRegion(
585*6467f958SSadaf Ebrahimi                 pStagingBuffer,
586*6467f958SSadaf Ebrahimi                 0,
587*6467f958SSadaf Ebrahimi                 0,
588*6467f958SSadaf Ebrahimi                 0,
589*6467f958SSadaf Ebrahimi                 0,
590*6467f958SSadaf Ebrahimi                 pTexture,
591*6467f958SSadaf Ebrahimi                 subResourceInfo[i].subResource,
592*6467f958SSadaf Ebrahimi                 &box);
593*6467f958SSadaf Ebrahimi         }
594*6467f958SSadaf Ebrahimi 
595*6467f958SSadaf Ebrahimi         // make sure we read back what was written next door
596*6467f958SSadaf Ebrahimi         {
597*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE mappedTexture;
598*6467f958SSadaf Ebrahimi             hr = pDC->Map(
599*6467f958SSadaf Ebrahimi                 pStagingBuffer,
600*6467f958SSadaf Ebrahimi                 0,
601*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
602*6467f958SSadaf Ebrahimi                 0,
603*6467f958SSadaf Ebrahimi                 &mappedTexture);
604*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
605*6467f958SSadaf Ebrahimi             TestRequire(
606*6467f958SSadaf Ebrahimi                 !memcmp(mappedTexture.pData, texture2DPatterns[x][y], format->bytesPerPixel),
607*6467f958SSadaf Ebrahimi                 "Failed to map staging buffer");
608*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
609*6467f958SSadaf Ebrahimi         }
610*6467f958SSadaf Ebrahimi 
611*6467f958SSadaf Ebrahimi         pStagingBuffer->Release();
612*6467f958SSadaf Ebrahimi     }
613*6467f958SSadaf Ebrahimi 
614*6467f958SSadaf Ebrahimi 
615*6467f958SSadaf Ebrahimi Cleanup:
616*6467f958SSadaf Ebrahimi 
617*6467f958SSadaf Ebrahimi     if (pTexture)
618*6467f958SSadaf Ebrahimi     {
619*6467f958SSadaf Ebrahimi         pTexture->Release();
620*6467f958SSadaf Ebrahimi     }
621*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
622*6467f958SSadaf Ebrahimi     {
623*6467f958SSadaf Ebrahimi         clReleaseMemObject(subResourceInfo[i].mem);
624*6467f958SSadaf Ebrahimi     }
625*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < 4; ++i)
626*6467f958SSadaf Ebrahimi     {
627*6467f958SSadaf Ebrahimi         if (events[i])
628*6467f958SSadaf Ebrahimi         {
629*6467f958SSadaf Ebrahimi             result = clReleaseEvent(events[i]);
630*6467f958SSadaf Ebrahimi             TestRequire(result == CL_SUCCESS, "clReleaseEvent for event failed.");
631*6467f958SSadaf Ebrahimi         }
632*6467f958SSadaf Ebrahimi     }
633*6467f958SSadaf Ebrahimi 
634*6467f958SSadaf Ebrahimi 
635*6467f958SSadaf Ebrahimi     HarnessD3D11_TestEnd();
636*6467f958SSadaf Ebrahimi }
637*6467f958SSadaf Ebrahimi 
is_format_supported(cl_channel_order channel_order,cl_channel_type channel_type,const std::vector<cl_image_format> & supported_image_formats)638*6467f958SSadaf Ebrahimi bool is_format_supported(
639*6467f958SSadaf Ebrahimi                          cl_channel_order channel_order,
640*6467f958SSadaf Ebrahimi                          cl_channel_type channel_type,
641*6467f958SSadaf Ebrahimi                          const std::vector<cl_image_format> &supported_image_formats)
642*6467f958SSadaf Ebrahimi {
643*6467f958SSadaf Ebrahimi   for (std::vector<cl_image_format>::const_iterator it = supported_image_formats.begin(); it != supported_image_formats.end(); ++it)
644*6467f958SSadaf Ebrahimi     if (it->image_channel_data_type == channel_type && it->image_channel_order == channel_order)
645*6467f958SSadaf Ebrahimi       return true;
646*6467f958SSadaf Ebrahimi 
647*6467f958SSadaf Ebrahimi   return false;
648*6467f958SSadaf Ebrahimi }
649*6467f958SSadaf Ebrahimi 
TestDeviceTexture2D(cl_device_id device,cl_context context,cl_command_queue command_queue,ID3D11Device * pDevice,ID3D11DeviceContext * pDC)650*6467f958SSadaf Ebrahimi void TestDeviceTexture2D(
651*6467f958SSadaf Ebrahimi     cl_device_id device,
652*6467f958SSadaf Ebrahimi     cl_context context,
653*6467f958SSadaf Ebrahimi     cl_command_queue command_queue,
654*6467f958SSadaf Ebrahimi     ID3D11Device* pDevice,
655*6467f958SSadaf Ebrahimi     ID3D11DeviceContext* pDC)
656*6467f958SSadaf Ebrahimi {
657*6467f958SSadaf Ebrahimi     cl_int result = CL_SUCCESS;
658*6467f958SSadaf Ebrahimi     cl_kernel kernels[3] = {NULL, NULL, NULL};
659*6467f958SSadaf Ebrahimi 
660*6467f958SSadaf Ebrahimi     const char *sourceRaw =
661*6467f958SSadaf Ebrahimi         " \
662*6467f958SSadaf Ebrahimi         __kernel void texture2D\n\
663*6467f958SSadaf Ebrahimi         ( \n\
664*6467f958SSadaf Ebrahimi             __read_only  image2d_t texIn, \n\
665*6467f958SSadaf Ebrahimi             __write_only image2d_t texOut \n\
666*6467f958SSadaf Ebrahimi         ) \n\
667*6467f958SSadaf Ebrahimi         { \n\
668*6467f958SSadaf Ebrahimi             const sampler_t smp = CLK_FILTER_NEAREST; \n\
669*6467f958SSadaf Ebrahimi                                   CLK_NORMALIZED_COORDS_FALSE |\n\
670*6467f958SSadaf Ebrahimi                                   CLK_ADDRESS_CLAMP_TO_EDGE;  \n\
671*6467f958SSadaf Ebrahimi             %s value;  \n\
672*6467f958SSadaf Ebrahimi             int2 coordIn;  \n\
673*6467f958SSadaf Ebrahimi             int2 coordOut; \n\
674*6467f958SSadaf Ebrahimi             int w = get_image_width(texIn); \n\
675*6467f958SSadaf Ebrahimi             int h = get_image_height(texIn); \n\
676*6467f958SSadaf Ebrahimi             \n\
677*6467f958SSadaf Ebrahimi             coordIn  = (int2)(0, 0); \n\
678*6467f958SSadaf Ebrahimi             coordOut = (int2)(1, 1); \n\
679*6467f958SSadaf Ebrahimi             value = read_image%s(texIn, smp, coordIn); \n\
680*6467f958SSadaf Ebrahimi             write_image%s(texOut, coordOut, value); \n\
681*6467f958SSadaf Ebrahimi             \n\
682*6467f958SSadaf Ebrahimi             coordIn  = (int2)(w-1, h-1); \n\
683*6467f958SSadaf Ebrahimi             coordOut = (int2)(w-2, h-2); \n\
684*6467f958SSadaf Ebrahimi             value = read_image%s(texIn, smp, coordIn); \n\
685*6467f958SSadaf Ebrahimi             write_image%s(texOut, coordOut, value); \n\
686*6467f958SSadaf Ebrahimi         } \n\
687*6467f958SSadaf Ebrahimi         ";
688*6467f958SSadaf Ebrahimi 
689*6467f958SSadaf Ebrahimi     cl_uint supported_formats_count;
690*6467f958SSadaf Ebrahimi     std::vector<cl_image_format> supported_image_formats;
691*6467f958SSadaf Ebrahimi     result = clGetSupportedImageFormats(context, CL_MEM_READ_ONLY, CL_MEM_OBJECT_IMAGE2D, 0, NULL, &supported_formats_count);
692*6467f958SSadaf Ebrahimi     TestRequire(CL_SUCCESS == result, "clGetSupportedImageFormats failed.");
693*6467f958SSadaf Ebrahimi 
694*6467f958SSadaf Ebrahimi     supported_image_formats.resize(supported_formats_count);
695*6467f958SSadaf Ebrahimi     result = clGetSupportedImageFormats(context, CL_MEM_READ_ONLY, CL_MEM_OBJECT_IMAGE2D, supported_formats_count, &supported_image_formats[0], NULL);
696*6467f958SSadaf Ebrahimi     TestRequire(CL_SUCCESS == result, "clGetSupportedImageFormats failed.");
697*6467f958SSadaf Ebrahimi 
698*6467f958SSadaf Ebrahimi     char source[2048];
699*6467f958SSadaf Ebrahimi     sprintf(source, sourceRaw, "float4", "f", "f", "f", "f");
700*6467f958SSadaf Ebrahimi     result = HarnessD3D11_CreateKernelFromSource(&kernels[0], device, context, source, "texture2D");
701*6467f958SSadaf Ebrahimi     TestRequire(CL_SUCCESS == result, "HarnessD3D11_CreateKernelFromSource failed.");
702*6467f958SSadaf Ebrahimi 
703*6467f958SSadaf Ebrahimi     sprintf(source, sourceRaw, "uint4", "ui", "ui", "ui", "ui");
704*6467f958SSadaf Ebrahimi     result = HarnessD3D11_CreateKernelFromSource(&kernels[1], device, context, source, "texture2D");
705*6467f958SSadaf Ebrahimi     TestRequire(CL_SUCCESS == result, "HarnessD3D11_CreateKernelFromSource failed.");
706*6467f958SSadaf Ebrahimi 
707*6467f958SSadaf Ebrahimi     sprintf(source, sourceRaw, "int4", "i", "i", "i", "i");
708*6467f958SSadaf Ebrahimi     result = HarnessD3D11_CreateKernelFromSource(&kernels[2], device, context, source, "texture2D");
709*6467f958SSadaf Ebrahimi     TestRequire(CL_SUCCESS == result, "HarnessD3D11_CreateKernelFromSource failed.");
710*6467f958SSadaf Ebrahimi 
711*6467f958SSadaf Ebrahimi     for (UINT format = 0, size = 0; format < formatCount; ++size, ++format)
712*6467f958SSadaf Ebrahimi     {
713*6467f958SSadaf Ebrahimi         if (!is_format_supported(formats[format].channel_order, formats[format].channel_type, supported_image_formats))
714*6467f958SSadaf Ebrahimi         {
715*6467f958SSadaf Ebrahimi           HarnessD3D11_TestBegin("2D_texture: Format=%s, Width=%d, Height=%d, MipLevels=%d, ArraySize=%d\n",
716*6467f958SSadaf Ebrahimi             formats[format].name_format,
717*6467f958SSadaf Ebrahimi             texture2DSizes[size % texture2DSizeCount].Width,
718*6467f958SSadaf Ebrahimi             texture2DSizes[size % texture2DSizeCount].Height,
719*6467f958SSadaf Ebrahimi             texture2DSizes[size % texture2DSizeCount].MipLevels,
720*6467f958SSadaf Ebrahimi             texture2DSizes[size % texture2DSizeCount].ArraySize);
721*6467f958SSadaf Ebrahimi           log_info("\tFormat not supported, skipping test!\n");
722*6467f958SSadaf Ebrahimi           HarnessD3D11_TestEnd();
723*6467f958SSadaf Ebrahimi 
724*6467f958SSadaf Ebrahimi           continue;
725*6467f958SSadaf Ebrahimi         }
726*6467f958SSadaf Ebrahimi 
727*6467f958SSadaf Ebrahimi         SubTestTexture2D(
728*6467f958SSadaf Ebrahimi             context,
729*6467f958SSadaf Ebrahimi             command_queue,
730*6467f958SSadaf Ebrahimi             kernels[formats[format].generic],
731*6467f958SSadaf Ebrahimi             pDevice,
732*6467f958SSadaf Ebrahimi             pDC,
733*6467f958SSadaf Ebrahimi             &formats[format],
734*6467f958SSadaf Ebrahimi             &texture2DSizes[size % texture2DSizeCount]);
735*6467f958SSadaf Ebrahimi     }
736*6467f958SSadaf Ebrahimi 
737*6467f958SSadaf Ebrahimi Cleanup:
738*6467f958SSadaf Ebrahimi 
739*6467f958SSadaf Ebrahimi 
740*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < 3; ++i)
741*6467f958SSadaf Ebrahimi     {
742*6467f958SSadaf Ebrahimi         if (kernels[i])
743*6467f958SSadaf Ebrahimi         {
744*6467f958SSadaf Ebrahimi             clReleaseKernel(kernels[i]);
745*6467f958SSadaf Ebrahimi         }
746*6467f958SSadaf Ebrahimi     }
747*6467f958SSadaf Ebrahimi }
748*6467f958SSadaf Ebrahimi 
749*6467f958SSadaf Ebrahimi 
750