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