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