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 Texture3DSize texture3DSizes[] =
20*6467f958SSadaf Ebrahimi {
21*6467f958SSadaf Ebrahimi {
22*6467f958SSadaf Ebrahimi 4, // Width
23*6467f958SSadaf Ebrahimi 4, // Height
24*6467f958SSadaf Ebrahimi 4, // Depth
25*6467f958SSadaf Ebrahimi 1, // MipLevels
26*6467f958SSadaf Ebrahimi 1, // SubResourceCount
27*6467f958SSadaf Ebrahimi { // SubResources
28*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
29*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
30*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
31*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
32*6467f958SSadaf Ebrahimi },
33*6467f958SSadaf Ebrahimi 0, // MiscFlags
34*6467f958SSadaf Ebrahimi },
35*6467f958SSadaf Ebrahimi {
36*6467f958SSadaf Ebrahimi 127, // Width
37*6467f958SSadaf Ebrahimi 25, // Height
38*6467f958SSadaf Ebrahimi 33, // Depth
39*6467f958SSadaf Ebrahimi 1, // MipLevels
40*6467f958SSadaf Ebrahimi 1, // SubResourceCount
41*6467f958SSadaf Ebrahimi { // SubResources
42*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
43*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
44*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
45*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
46*6467f958SSadaf Ebrahimi },
47*6467f958SSadaf Ebrahimi 0, // MiscFlags
48*6467f958SSadaf Ebrahimi },
49*6467f958SSadaf Ebrahimi {
50*6467f958SSadaf Ebrahimi 128, // Width
51*6467f958SSadaf Ebrahimi 256, // Height
52*6467f958SSadaf Ebrahimi 64, // Depth
53*6467f958SSadaf Ebrahimi 4, // MipLevels
54*6467f958SSadaf Ebrahimi 3, // SubResourceCount
55*6467f958SSadaf Ebrahimi { // SubResources
56*6467f958SSadaf Ebrahimi { 2 }, // MipLevel
57*6467f958SSadaf Ebrahimi { 1 }, // MipLevel
58*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
59*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
60*6467f958SSadaf Ebrahimi },
61*6467f958SSadaf Ebrahimi 0, // MiscFlags
62*6467f958SSadaf Ebrahimi },
63*6467f958SSadaf Ebrahimi {
64*6467f958SSadaf Ebrahimi 512, // Width
65*6467f958SSadaf Ebrahimi 64, // Height
66*6467f958SSadaf Ebrahimi 32, // Depth
67*6467f958SSadaf Ebrahimi 3, // MipLevels
68*6467f958SSadaf Ebrahimi 1, // SubResourceCount
69*6467f958SSadaf Ebrahimi { // SubResources
70*6467f958SSadaf Ebrahimi { 2 }, // MipLevel
71*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
72*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
73*6467f958SSadaf Ebrahimi { 0 }, // MipLevel
74*6467f958SSadaf Ebrahimi },
75*6467f958SSadaf Ebrahimi 0, // MiscFlags
76*6467f958SSadaf Ebrahimi },
77*6467f958SSadaf Ebrahimi };
78*6467f958SSadaf Ebrahimi UINT texture3DSizeCount = sizeof(texture3DSizes)/sizeof(texture3DSizes[0]);
79*6467f958SSadaf Ebrahimi
80*6467f958SSadaf Ebrahimi const char *
81*6467f958SSadaf Ebrahimi texture3DPatterns[2][2][2] =
82*6467f958SSadaf Ebrahimi {
83*6467f958SSadaf Ebrahimi {
84*6467f958SSadaf Ebrahimi {"PlaceTheCasseroleDis", "hInAColdOvenPlaceACh"},
85*6467f958SSadaf Ebrahimi {"airFacingTheOvenAndS", "itInItForeverThinkAb"},
86*6467f958SSadaf Ebrahimi },
87*6467f958SSadaf Ebrahimi {
88*6467f958SSadaf Ebrahimi {"outHowHungryYouAreWh", "enNightFallsDoNotTur"},
89*6467f958SSadaf Ebrahimi {"nOnTheLightMyEyeBeca", "meInflamedIHateCamus"},
90*6467f958SSadaf Ebrahimi },
91*6467f958SSadaf Ebrahimi };
92*6467f958SSadaf Ebrahimi
SubTestTexture3D(cl_context context,cl_command_queue command_queue,ID3D10Device * pDevice,const TextureFormat * format,const Texture3DSize * size)93*6467f958SSadaf Ebrahimi void SubTestTexture3D(
94*6467f958SSadaf Ebrahimi cl_context context,
95*6467f958SSadaf Ebrahimi cl_command_queue command_queue,
96*6467f958SSadaf Ebrahimi ID3D10Device* pDevice,
97*6467f958SSadaf Ebrahimi const TextureFormat* format,
98*6467f958SSadaf Ebrahimi const Texture3DSize* size)
99*6467f958SSadaf Ebrahimi {
100*6467f958SSadaf Ebrahimi ID3D10Texture3D* pTexture = NULL;
101*6467f958SSadaf Ebrahimi HRESULT hr = S_OK;
102*6467f958SSadaf Ebrahimi
103*6467f958SSadaf Ebrahimi cl_int result = CL_SUCCESS;
104*6467f958SSadaf Ebrahimi
105*6467f958SSadaf Ebrahimi HarnessD3D10_TestBegin("3D Texture: Format=%s, Width=%d, Height=%d, Depth=%d, MipLevels=%d",
106*6467f958SSadaf Ebrahimi format->name_format,
107*6467f958SSadaf Ebrahimi size->Width,
108*6467f958SSadaf Ebrahimi size->Height,
109*6467f958SSadaf Ebrahimi size->Depth,
110*6467f958SSadaf Ebrahimi size->MipLevels);
111*6467f958SSadaf Ebrahimi
112*6467f958SSadaf Ebrahimi struct
113*6467f958SSadaf Ebrahimi {
114*6467f958SSadaf Ebrahimi cl_mem mem;
115*6467f958SSadaf Ebrahimi UINT subResource;
116*6467f958SSadaf Ebrahimi UINT width;
117*6467f958SSadaf Ebrahimi UINT height;
118*6467f958SSadaf Ebrahimi UINT depth;
119*6467f958SSadaf Ebrahimi }
120*6467f958SSadaf Ebrahimi subResourceInfo[4];
121*6467f958SSadaf Ebrahimi
122*6467f958SSadaf Ebrahimi // create the D3D10 resources
123*6467f958SSadaf Ebrahimi {
124*6467f958SSadaf Ebrahimi D3D10_TEXTURE3D_DESC desc;
125*6467f958SSadaf Ebrahimi memset(&desc, 0, sizeof(desc) );
126*6467f958SSadaf Ebrahimi desc.Width = size->Width;
127*6467f958SSadaf Ebrahimi desc.Height = size->Height;
128*6467f958SSadaf Ebrahimi desc.Depth = size->Depth;
129*6467f958SSadaf Ebrahimi desc.MipLevels = size->MipLevels;
130*6467f958SSadaf Ebrahimi desc.Format = format->format;
131*6467f958SSadaf Ebrahimi desc.Usage = D3D10_USAGE_DEFAULT;
132*6467f958SSadaf Ebrahimi desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
133*6467f958SSadaf Ebrahimi desc.CPUAccessFlags = 0;
134*6467f958SSadaf Ebrahimi desc.MiscFlags = 0;
135*6467f958SSadaf Ebrahimi
136*6467f958SSadaf Ebrahimi hr = pDevice->CreateTexture3D(&desc, NULL, &pTexture);
137*6467f958SSadaf Ebrahimi TestRequire(SUCCEEDED(hr), "CreateTexture3D failed.");
138*6467f958SSadaf Ebrahimi }
139*6467f958SSadaf Ebrahimi
140*6467f958SSadaf Ebrahimi // initialize some useful variables
141*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
142*6467f958SSadaf Ebrahimi {
143*6467f958SSadaf Ebrahimi // compute the expected values for the subresource
144*6467f958SSadaf Ebrahimi subResourceInfo[i].subResource = size->subResources[i].MipLevel;
145*6467f958SSadaf Ebrahimi subResourceInfo[i].width = size->Width;
146*6467f958SSadaf Ebrahimi subResourceInfo[i].height = size->Height;
147*6467f958SSadaf Ebrahimi subResourceInfo[i].depth = size->Depth;
148*6467f958SSadaf Ebrahimi for (UINT j = 0; j < size->subResources[i].MipLevel; ++j) {
149*6467f958SSadaf Ebrahimi subResourceInfo[i].width /= 2;
150*6467f958SSadaf Ebrahimi subResourceInfo[i].height /= 2;
151*6467f958SSadaf Ebrahimi subResourceInfo[i].depth /= 2;
152*6467f958SSadaf Ebrahimi }
153*6467f958SSadaf Ebrahimi }
154*6467f958SSadaf Ebrahimi
155*6467f958SSadaf Ebrahimi // copy a pattern into the corners of the image, coordinates
156*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
157*6467f958SSadaf Ebrahimi for (UINT x = 0; x < 2; ++x)
158*6467f958SSadaf Ebrahimi for (UINT y = 0; y < 2; ++y)
159*6467f958SSadaf Ebrahimi for (UINT z = 0; z < 2; ++z)
160*6467f958SSadaf Ebrahimi {
161*6467f958SSadaf Ebrahimi // create the staging buffer
162*6467f958SSadaf Ebrahimi ID3D10Texture3D* pStagingBuffer = NULL;
163*6467f958SSadaf Ebrahimi {
164*6467f958SSadaf Ebrahimi D3D10_TEXTURE3D_DESC desc = {0};
165*6467f958SSadaf Ebrahimi desc.Width = 1;
166*6467f958SSadaf Ebrahimi desc.Height = 1;
167*6467f958SSadaf Ebrahimi desc.Depth = 1;
168*6467f958SSadaf Ebrahimi desc.MipLevels = 1;
169*6467f958SSadaf Ebrahimi desc.Format = format->format;
170*6467f958SSadaf Ebrahimi desc.Usage = D3D10_USAGE_STAGING;
171*6467f958SSadaf Ebrahimi desc.BindFlags = 0;
172*6467f958SSadaf Ebrahimi desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
173*6467f958SSadaf Ebrahimi desc.MiscFlags = 0;
174*6467f958SSadaf Ebrahimi hr = pDevice->CreateTexture3D(&desc, NULL, &pStagingBuffer);
175*6467f958SSadaf Ebrahimi TestRequire(SUCCEEDED(hr), "CreateTexture3D failed.");
176*6467f958SSadaf Ebrahimi }
177*6467f958SSadaf Ebrahimi
178*6467f958SSadaf Ebrahimi // write the data to the staging buffer
179*6467f958SSadaf Ebrahimi {
180*6467f958SSadaf Ebrahimi D3D10_MAPPED_TEXTURE3D mappedTexture;
181*6467f958SSadaf Ebrahimi hr = pStagingBuffer->Map(
182*6467f958SSadaf Ebrahimi 0,
183*6467f958SSadaf Ebrahimi D3D10_MAP_READ_WRITE,
184*6467f958SSadaf Ebrahimi 0,
185*6467f958SSadaf Ebrahimi &mappedTexture);
186*6467f958SSadaf Ebrahimi memcpy(mappedTexture.pData, texture3DPatterns[x][y][z], format->bytesPerPixel);
187*6467f958SSadaf Ebrahimi pStagingBuffer->Unmap(0);
188*6467f958SSadaf Ebrahimi }
189*6467f958SSadaf Ebrahimi
190*6467f958SSadaf Ebrahimi // copy the data to to the texture
191*6467f958SSadaf Ebrahimi {
192*6467f958SSadaf Ebrahimi D3D10_BOX box = {0};
193*6467f958SSadaf Ebrahimi box.front = 0; box.back = 1;
194*6467f958SSadaf Ebrahimi box.top = 0; box.bottom = 1;
195*6467f958SSadaf Ebrahimi box.left = 0; box.right = 1;
196*6467f958SSadaf Ebrahimi pDevice->CopySubresourceRegion(
197*6467f958SSadaf Ebrahimi pTexture,
198*6467f958SSadaf Ebrahimi subResourceInfo[i].subResource,
199*6467f958SSadaf Ebrahimi x ? subResourceInfo[i].width - 1 : 0,
200*6467f958SSadaf Ebrahimi y ? subResourceInfo[i].height - 1 : 0,
201*6467f958SSadaf Ebrahimi z ? subResourceInfo[i].depth - 1 : 0,
202*6467f958SSadaf Ebrahimi pStagingBuffer,
203*6467f958SSadaf Ebrahimi 0,
204*6467f958SSadaf Ebrahimi &box);
205*6467f958SSadaf Ebrahimi }
206*6467f958SSadaf Ebrahimi
207*6467f958SSadaf Ebrahimi pStagingBuffer->Release();
208*6467f958SSadaf Ebrahimi }
209*6467f958SSadaf Ebrahimi
210*6467f958SSadaf Ebrahimi // create the cl_mem objects for the resources and verify its sanity
211*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
212*6467f958SSadaf Ebrahimi {
213*6467f958SSadaf Ebrahimi // create a cl_mem for the resource
214*6467f958SSadaf Ebrahimi subResourceInfo[i].mem = clCreateFromD3D10Texture3DKHR(
215*6467f958SSadaf Ebrahimi context,
216*6467f958SSadaf Ebrahimi 0,
217*6467f958SSadaf Ebrahimi pTexture,
218*6467f958SSadaf Ebrahimi subResourceInfo[i].subResource,
219*6467f958SSadaf Ebrahimi &result);
220*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clCreateFromD3D10Texture3DKHR failed");
221*6467f958SSadaf Ebrahimi
222*6467f958SSadaf Ebrahimi // query resource pointer and verify
223*6467f958SSadaf Ebrahimi ID3D10Resource* clResource = NULL;
224*6467f958SSadaf Ebrahimi result = clGetMemObjectInfo(
225*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
226*6467f958SSadaf Ebrahimi CL_MEM_D3D10_RESOURCE_KHR,
227*6467f958SSadaf Ebrahimi sizeof(clResource),
228*6467f958SSadaf Ebrahimi &clResource,
229*6467f958SSadaf Ebrahimi NULL);
230*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetMemObjectInfo for CL_MEM_D3D10_RESOURCE_KHR failed.");
231*6467f958SSadaf Ebrahimi TestRequire(clResource == pTexture, "clGetMemObjectInfo for CL_MEM_D3D10_RESOURCE_KHR returned incorrect value.");
232*6467f958SSadaf Ebrahimi
233*6467f958SSadaf Ebrahimi // query subresource and verify
234*6467f958SSadaf Ebrahimi UINT clSubResource;
235*6467f958SSadaf Ebrahimi result = clGetImageInfo(
236*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
237*6467f958SSadaf Ebrahimi CL_IMAGE_D3D10_SUBRESOURCE_KHR,
238*6467f958SSadaf Ebrahimi sizeof(clSubResource),
239*6467f958SSadaf Ebrahimi &clSubResource,
240*6467f958SSadaf Ebrahimi NULL);
241*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_D3D10_SUBRESOURCE_KHR failed");
242*6467f958SSadaf Ebrahimi TestRequire(clSubResource == subResourceInfo[i].subResource, "clGetImageInfo for CL_IMAGE_D3D10_SUBRESOURCE_KHR returned incorrect value.");
243*6467f958SSadaf Ebrahimi
244*6467f958SSadaf Ebrahimi // query format and verify
245*6467f958SSadaf Ebrahimi cl_image_format clFormat;
246*6467f958SSadaf Ebrahimi result = clGetImageInfo(
247*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
248*6467f958SSadaf Ebrahimi CL_IMAGE_FORMAT,
249*6467f958SSadaf Ebrahimi sizeof(clFormat),
250*6467f958SSadaf Ebrahimi &clFormat,
251*6467f958SSadaf Ebrahimi NULL);
252*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_FORMAT failed");
253*6467f958SSadaf Ebrahimi TestRequire(clFormat.image_channel_order == format->channel_order, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel order.");
254*6467f958SSadaf Ebrahimi TestRequire(clFormat.image_channel_data_type == format->channel_type, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel data type.");
255*6467f958SSadaf Ebrahimi
256*6467f958SSadaf Ebrahimi // query width
257*6467f958SSadaf Ebrahimi size_t width;
258*6467f958SSadaf Ebrahimi result = clGetImageInfo(
259*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
260*6467f958SSadaf Ebrahimi CL_IMAGE_WIDTH,
261*6467f958SSadaf Ebrahimi sizeof(width),
262*6467f958SSadaf Ebrahimi &width,
263*6467f958SSadaf Ebrahimi NULL);
264*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_WIDTH failed");
265*6467f958SSadaf Ebrahimi TestRequire(width == subResourceInfo[i].width, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
266*6467f958SSadaf Ebrahimi
267*6467f958SSadaf Ebrahimi // query height
268*6467f958SSadaf Ebrahimi size_t height;
269*6467f958SSadaf Ebrahimi result = clGetImageInfo(
270*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
271*6467f958SSadaf Ebrahimi CL_IMAGE_HEIGHT,
272*6467f958SSadaf Ebrahimi sizeof(height),
273*6467f958SSadaf Ebrahimi &height,
274*6467f958SSadaf Ebrahimi NULL);
275*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_HEIGHT failed");
276*6467f958SSadaf Ebrahimi TestRequire(height == subResourceInfo[i].height, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
277*6467f958SSadaf Ebrahimi
278*6467f958SSadaf Ebrahimi // query depth
279*6467f958SSadaf Ebrahimi size_t depth;
280*6467f958SSadaf Ebrahimi result = clGetImageInfo(
281*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
282*6467f958SSadaf Ebrahimi CL_IMAGE_DEPTH,
283*6467f958SSadaf Ebrahimi sizeof(depth),
284*6467f958SSadaf Ebrahimi &depth,
285*6467f958SSadaf Ebrahimi NULL);
286*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_DEPTH failed");
287*6467f958SSadaf Ebrahimi TestRequire(depth == subResourceInfo[i].depth, "clGetImageInfo for CL_IMAGE_DEPTH returned incorrect value.");
288*6467f958SSadaf Ebrahimi
289*6467f958SSadaf Ebrahimi }
290*6467f958SSadaf Ebrahimi
291*6467f958SSadaf Ebrahimi // acquire the resources for OpenCL
292*6467f958SSadaf Ebrahimi {
293*6467f958SSadaf Ebrahimi cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
294*6467f958SSadaf Ebrahimi
295*6467f958SSadaf Ebrahimi // cut the registered sub-resources into two sets and send the acquire calls for them separately
296*6467f958SSadaf Ebrahimi for(UINT i = 0; i < size->SubResourceCount; ++i)
297*6467f958SSadaf Ebrahimi {
298*6467f958SSadaf Ebrahimi memToAcquire[i] = subResourceInfo[i].mem;
299*6467f958SSadaf Ebrahimi }
300*6467f958SSadaf Ebrahimi
301*6467f958SSadaf Ebrahimi // do the acquire
302*6467f958SSadaf Ebrahimi result = clEnqueueAcquireD3D10ObjectsKHR(
303*6467f958SSadaf Ebrahimi command_queue,
304*6467f958SSadaf Ebrahimi size->SubResourceCount,
305*6467f958SSadaf Ebrahimi memToAcquire,
306*6467f958SSadaf Ebrahimi 0,
307*6467f958SSadaf Ebrahimi NULL,
308*6467f958SSadaf Ebrahimi NULL);
309*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clEnqueueAcquireD3D10ObjectsKHR failed.");
310*6467f958SSadaf Ebrahimi }
311*6467f958SSadaf Ebrahimi
312*6467f958SSadaf Ebrahimi // download the data using OpenCL & compare with the expected results
313*6467f958SSadaf Ebrahimi // copy the corners of the image into the image
314*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
315*6467f958SSadaf Ebrahimi for (UINT x = 0; x < 2; ++x)
316*6467f958SSadaf Ebrahimi for (UINT y = 0; y < 2; ++y)
317*6467f958SSadaf Ebrahimi for (UINT z = 0; z < 2; ++z)
318*6467f958SSadaf Ebrahimi {
319*6467f958SSadaf Ebrahimi if (x == y && y == z && 0)
320*6467f958SSadaf Ebrahimi {
321*6467f958SSadaf Ebrahimi continue;
322*6467f958SSadaf Ebrahimi }
323*6467f958SSadaf Ebrahimi size_t src[3] =
324*6467f958SSadaf Ebrahimi {
325*6467f958SSadaf Ebrahimi x ? subResourceInfo[i].width - 1 : 0,
326*6467f958SSadaf Ebrahimi y ? subResourceInfo[i].height - 1 : 0,
327*6467f958SSadaf Ebrahimi z ? subResourceInfo[i].depth - 1 : 0,
328*6467f958SSadaf Ebrahimi };
329*6467f958SSadaf Ebrahimi size_t dst[3] =
330*6467f958SSadaf Ebrahimi {
331*6467f958SSadaf Ebrahimi x ? subResourceInfo[i].width - 2 : 1,
332*6467f958SSadaf Ebrahimi y ? subResourceInfo[i].height - 2 : 1,
333*6467f958SSadaf Ebrahimi z ? subResourceInfo[i].depth - 2 : 1,
334*6467f958SSadaf Ebrahimi };
335*6467f958SSadaf Ebrahimi size_t region[3] =
336*6467f958SSadaf Ebrahimi {
337*6467f958SSadaf Ebrahimi 1,
338*6467f958SSadaf Ebrahimi 1,
339*6467f958SSadaf Ebrahimi 1,
340*6467f958SSadaf Ebrahimi };
341*6467f958SSadaf Ebrahimi result = clEnqueueCopyImage(
342*6467f958SSadaf Ebrahimi command_queue,
343*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
344*6467f958SSadaf Ebrahimi subResourceInfo[i].mem,
345*6467f958SSadaf Ebrahimi src,
346*6467f958SSadaf Ebrahimi dst,
347*6467f958SSadaf Ebrahimi region,
348*6467f958SSadaf Ebrahimi 0,
349*6467f958SSadaf Ebrahimi NULL,
350*6467f958SSadaf Ebrahimi NULL);
351*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clEnqueueCopyImage failed.");
352*6467f958SSadaf Ebrahimi }
353*6467f958SSadaf Ebrahimi
354*6467f958SSadaf Ebrahimi // release the resource from OpenCL
355*6467f958SSadaf Ebrahimi {
356*6467f958SSadaf Ebrahimi cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
357*6467f958SSadaf Ebrahimi for(UINT i = 0; i < size->SubResourceCount; ++i)
358*6467f958SSadaf Ebrahimi {
359*6467f958SSadaf Ebrahimi memToAcquire[i] = subResourceInfo[i].mem;
360*6467f958SSadaf Ebrahimi }
361*6467f958SSadaf Ebrahimi
362*6467f958SSadaf Ebrahimi // do the release
363*6467f958SSadaf Ebrahimi result = clEnqueueReleaseD3D10ObjectsKHR(
364*6467f958SSadaf Ebrahimi command_queue,
365*6467f958SSadaf Ebrahimi size->SubResourceCount,
366*6467f958SSadaf Ebrahimi memToAcquire,
367*6467f958SSadaf Ebrahimi 0,
368*6467f958SSadaf Ebrahimi NULL,
369*6467f958SSadaf Ebrahimi NULL);
370*6467f958SSadaf Ebrahimi TestRequire(result == CL_SUCCESS, "clEnqueueReleaseD3D10ObjectsKHR failed.");
371*6467f958SSadaf Ebrahimi }
372*6467f958SSadaf Ebrahimi
373*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
374*6467f958SSadaf Ebrahimi for (UINT x = 0; x < 2; ++x)
375*6467f958SSadaf Ebrahimi for (UINT y = 0; y < 2; ++y)
376*6467f958SSadaf Ebrahimi for (UINT z = 0; z < 2; ++z)
377*6467f958SSadaf Ebrahimi {
378*6467f958SSadaf Ebrahimi // create the staging buffer
379*6467f958SSadaf Ebrahimi ID3D10Texture3D* pStagingBuffer = NULL;
380*6467f958SSadaf Ebrahimi {
381*6467f958SSadaf Ebrahimi D3D10_TEXTURE3D_DESC desc = {0};
382*6467f958SSadaf Ebrahimi desc.Width = 1;
383*6467f958SSadaf Ebrahimi desc.Height = 1;
384*6467f958SSadaf Ebrahimi desc.Depth = 1;
385*6467f958SSadaf Ebrahimi desc.MipLevels = 1;
386*6467f958SSadaf Ebrahimi desc.Format = format->format;
387*6467f958SSadaf Ebrahimi desc.Usage = D3D10_USAGE_STAGING;
388*6467f958SSadaf Ebrahimi desc.BindFlags = 0;
389*6467f958SSadaf Ebrahimi desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
390*6467f958SSadaf Ebrahimi desc.MiscFlags = 0;
391*6467f958SSadaf Ebrahimi hr = pDevice->CreateTexture3D(&desc, NULL, &pStagingBuffer);
392*6467f958SSadaf Ebrahimi TestRequire(SUCCEEDED(hr), "Failed to create staging buffer.");
393*6467f958SSadaf Ebrahimi }
394*6467f958SSadaf Ebrahimi
395*6467f958SSadaf Ebrahimi // wipe out the staging buffer to make sure we don't get stale values
396*6467f958SSadaf Ebrahimi {
397*6467f958SSadaf Ebrahimi D3D10_MAPPED_TEXTURE3D mappedTexture;
398*6467f958SSadaf Ebrahimi hr = pStagingBuffer->Map(
399*6467f958SSadaf Ebrahimi 0,
400*6467f958SSadaf Ebrahimi D3D10_MAP_READ_WRITE,
401*6467f958SSadaf Ebrahimi 0,
402*6467f958SSadaf Ebrahimi &mappedTexture);
403*6467f958SSadaf Ebrahimi TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
404*6467f958SSadaf Ebrahimi memset(mappedTexture.pData, 0, format->bytesPerPixel);
405*6467f958SSadaf Ebrahimi pStagingBuffer->Unmap(0);
406*6467f958SSadaf Ebrahimi }
407*6467f958SSadaf Ebrahimi
408*6467f958SSadaf Ebrahimi // copy the pixel to the staging buffer
409*6467f958SSadaf Ebrahimi {
410*6467f958SSadaf Ebrahimi D3D10_BOX box = {0};
411*6467f958SSadaf Ebrahimi box.left = x ? subResourceInfo[i].width - 2 : 1; box.right = box.left + 1;
412*6467f958SSadaf Ebrahimi box.top = y ? subResourceInfo[i].height - 2 : 1; box.bottom = box.top + 1;
413*6467f958SSadaf Ebrahimi box.front = z ? subResourceInfo[i].depth - 2 : 1; box.back = box.front + 1;
414*6467f958SSadaf Ebrahimi pDevice->CopySubresourceRegion(
415*6467f958SSadaf Ebrahimi pStagingBuffer,
416*6467f958SSadaf Ebrahimi 0,
417*6467f958SSadaf Ebrahimi 0,
418*6467f958SSadaf Ebrahimi 0,
419*6467f958SSadaf Ebrahimi 0,
420*6467f958SSadaf Ebrahimi pTexture,
421*6467f958SSadaf Ebrahimi subResourceInfo[i].subResource,
422*6467f958SSadaf Ebrahimi &box);
423*6467f958SSadaf Ebrahimi }
424*6467f958SSadaf Ebrahimi
425*6467f958SSadaf Ebrahimi // make sure we read back what was written next door
426*6467f958SSadaf Ebrahimi {
427*6467f958SSadaf Ebrahimi D3D10_MAPPED_TEXTURE3D mappedTexture;
428*6467f958SSadaf Ebrahimi hr = pStagingBuffer->Map(
429*6467f958SSadaf Ebrahimi 0,
430*6467f958SSadaf Ebrahimi D3D10_MAP_READ_WRITE,
431*6467f958SSadaf Ebrahimi 0,
432*6467f958SSadaf Ebrahimi &mappedTexture);
433*6467f958SSadaf Ebrahimi TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
434*6467f958SSadaf Ebrahimi
435*6467f958SSadaf Ebrahimi /*
436*6467f958SSadaf Ebrahimi // This can be helpful in debugging...
437*6467f958SSadaf Ebrahimi printf("\n");
438*6467f958SSadaf Ebrahimi for (UINT k = 0; k < format->bytesPerPixel; ++k)
439*6467f958SSadaf Ebrahimi {
440*6467f958SSadaf Ebrahimi printf("[%c %c]\n",
441*6467f958SSadaf Ebrahimi texture2DPatterns[x][y][k],
442*6467f958SSadaf Ebrahimi ( (char *)mappedTexture.pData )[k]);
443*6467f958SSadaf Ebrahimi }
444*6467f958SSadaf Ebrahimi */
445*6467f958SSadaf Ebrahimi
446*6467f958SSadaf Ebrahimi TestRequire(
447*6467f958SSadaf Ebrahimi !memcmp(mappedTexture.pData, texture3DPatterns[x][y][z], format->bytesPerPixel),
448*6467f958SSadaf Ebrahimi "Failed to map staging buffer");
449*6467f958SSadaf Ebrahimi
450*6467f958SSadaf Ebrahimi pStagingBuffer->Unmap(0);
451*6467f958SSadaf Ebrahimi }
452*6467f958SSadaf Ebrahimi
453*6467f958SSadaf Ebrahimi pStagingBuffer->Release();
454*6467f958SSadaf Ebrahimi }
455*6467f958SSadaf Ebrahimi
456*6467f958SSadaf Ebrahimi
457*6467f958SSadaf Ebrahimi Cleanup:
458*6467f958SSadaf Ebrahimi
459*6467f958SSadaf Ebrahimi if (pTexture)
460*6467f958SSadaf Ebrahimi {
461*6467f958SSadaf Ebrahimi pTexture->Release();
462*6467f958SSadaf Ebrahimi }
463*6467f958SSadaf Ebrahimi for (UINT i = 0; i < size->SubResourceCount; ++i)
464*6467f958SSadaf Ebrahimi {
465*6467f958SSadaf Ebrahimi clReleaseMemObject(subResourceInfo[i].mem);
466*6467f958SSadaf Ebrahimi }
467*6467f958SSadaf Ebrahimi
468*6467f958SSadaf Ebrahimi HarnessD3D10_TestEnd();
469*6467f958SSadaf Ebrahimi }
470*6467f958SSadaf Ebrahimi
471*6467f958SSadaf Ebrahimi
TestDeviceTexture3D(cl_device_id device,cl_context context,cl_command_queue command_queue,ID3D10Device * pDevice)472*6467f958SSadaf Ebrahimi void TestDeviceTexture3D(
473*6467f958SSadaf Ebrahimi cl_device_id device,
474*6467f958SSadaf Ebrahimi cl_context context,
475*6467f958SSadaf Ebrahimi cl_command_queue command_queue,
476*6467f958SSadaf Ebrahimi ID3D10Device* pDevice)
477*6467f958SSadaf Ebrahimi {
478*6467f958SSadaf Ebrahimi cl_int result = CL_SUCCESS;
479*6467f958SSadaf Ebrahimi
480*6467f958SSadaf Ebrahimi
481*6467f958SSadaf Ebrahimi for (UINT format = 0, size = 0; format < formatCount; ++size, ++format)
482*6467f958SSadaf Ebrahimi {
483*6467f958SSadaf Ebrahimi SubTestTexture3D(
484*6467f958SSadaf Ebrahimi context,
485*6467f958SSadaf Ebrahimi command_queue,
486*6467f958SSadaf Ebrahimi pDevice,
487*6467f958SSadaf Ebrahimi &formats[format],
488*6467f958SSadaf Ebrahimi &texture3DSizes[size % texture3DSizeCount]);
489*6467f958SSadaf Ebrahimi }
490*6467f958SSadaf Ebrahimi }
491*6467f958SSadaf Ebrahimi
492